2014-01-17 4 views
0

sqlite 데이터베이스를 만들려고하는데 여기에 제 코드가 있습니다. 내 앱을 실행하려고 할 때마다 오류가 많이 발생합니다. 에뮬레이터 문제라고 생각하지만 여기에 내 코드와 오류가 있습니다. 도움이 필요합니다. 나는 무엇을해야할지 모른다. 여기SQLiteDatabase를 만들려고하는 동안 NullPointerException이 발생했습니다.

01-17 14:52:39.890: D/AndroidRuntime(1699): Shutting down VM 
01-17 14:52:39.890: W/dalvikvm(1699): threadid=1: thread exiting with uncaught exception (group=0xb3abdb90) 
01-17 14:52:39.910: E/AndroidRuntime(1699): FATAL EXCEPTION: main 
01-17 14:52:39.910: E/AndroidRuntime(1699): Process: com.example.net.saeed.sqlitedb, PID: 1699 
01-17 14:52:39.910: E/AndroidRuntime(1699): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.net.saeed.sqlitedb/com.example.net.saeed.sqlitedb.MainActivity}: java.lang.NullPointerException 
01-17 14:52:39.910: E/AndroidRuntime(1699):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176) 
01-17 14:52:39.910: E/AndroidRuntime(1699):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226) 
01-17 14:52:39.910: E/AndroidRuntime(1699):  at android.app.ActivityThread.access$700(ActivityThread.java:135) 
01-17 14:52:39.910: E/AndroidRuntime(1699):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397) 
01-17 14:52:39.910: E/AndroidRuntime(1699):  at android.os.Handler.dispatchMessage(Handler.java:102) 
01-17 14:52:39.910: E/AndroidRuntime(1699):  at android.os.Looper.loop(Looper.java:137) 
01-17 14:52:39.910: E/AndroidRuntime(1699):  at android.app.ActivityThread.main(ActivityThread.java:4998) 
01-17 14:52:39.910: E/AndroidRuntime(1699):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-17 14:52:39.910: E/AndroidRuntime(1699):  at java.lang.reflect.Method.invoke(Method.java:515) 
01-17 14:52:39.910: E/AndroidRuntime(1699):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777) 
01-17 14:52:39.910: E/AndroidRuntime(1699):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593) 
01-17 14:52:39.910: E/AndroidRuntime(1699):  at dalvik.system.NativeStart.main(Native Method) 
01-17 14:52:39.910: E/AndroidRuntime(1699): Caused by: java.lang.NullPointerException 
01-17 14:52:39.910: E/AndroidRuntime(1699):  at com.example.net.saeed.sqlitedb.MainActivity.onCreate(MainActivity.java:15) 
01-17 14:52:39.910: E/AndroidRuntime(1699):  at android.app.Activity.performCreate(Activity.java:5243) 
01-17 14:52:39.910: E/AndroidRuntime(1699):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
01-17 14:52:39.910: E/AndroidRuntime(1699):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140) 
01-17 14:52:39.910: E/AndroidRuntime(1699):  ... 11 more 
01-17 14:52:45.450: I/Process(1699): Sending signal. PID: 1699 SIG: 9 

괜찮 예를 들어

import android.content.Context; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class saeedHelperBD extends SQLiteOpenHelper { 

private static final String DATABASE_NAME = "saeedDataBase"; 
private static final String TABLE_NAME = "saeedTable"; 
private static final int DATABASE_VERSION = 1; 
private static final String UID = "_id"; 
private static final String NAME = "Name"; 
private static final String ADRESS = "Adress"; 
private static final String CREAT_TABLE ="CREATE TABLE " + TABLE_NAME + " (" + UID + "    INTEGER PRIMARY KEY AUTOINCREMENT , " + NAME + " VARCHAR(225));"; 
private static final String DROP_TABLE = "DROP TABLE IF EXISTS " + TABLE_NAME; 
private Context context; 
public saeedHelperBD(Context con) { 
    super(con, DATABASE_NAME, null , DATABASE_VERSION); 
    this.context=con; 
    Message.message(context, "constructor called"); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    try { 
     Message.message(context, "onCreate was called"); 
     db.execSQL(CREAT_TABLE); 
    } catch (SQLException e) { 
     Message.message(context, ""+e); 
    } 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) { 
    db.execSQL(DROP_TABLE); 
    try { 
     Message.message(context, "onUpgrade was called"); 
     onCreate(db); 
    } catch (SQLException e) { 
     Message.message(context, ""+e); 
    } 
} 

main() 
} 
saeedHelperBD firstBD; 
SQLiteDatabase sqlBD = firstBD. 
}` 

는 mainactivity

입니다
package com.example.net.saeed.sqlitedb; 

import android.os.Bundle; 
import android.app.Activity; 
import android.database.sqlite.SQLiteDatabase; 
import android.view.Menu; 

public class MainActivity extends Activity { 
saeedHelperBD firstBD; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

SQLiteDatabase sqlBD = firstBD.getWritableDatabase(); 

} 
+1

문제는 'MainActivity.java'의 15 행에 있습니다. 잘못된 코드를 표시하고 있습니다. –

+0

MainActivity에는 15 행의 null 포인터 예외가 있습니다. 또한 질문을 널 포인터 예외 또는 이와 유사한 것으로 변경해야합니다. –

+0

고마워요, 네, 바로 문제는 MainActivity의 15 행에 있습니다.하지만 내가해야 할 일은 여기에 있습니다. MainActivity – NoXSaeeD

답변

0

코드에 firstBD.getWritableDatabase();을 (를) 호출하려고합니다. 그러나 firstBD 개체는 null입니다. 이 객체를 먼저 초기화해야합니다.
난 당신이 또한

private static saeedHelperBD firstDB; 
    public static synchronized saeedHelperBD getInstance() { 
     if (firstDB == null) { 
      firstDB = new saeedHelperBD(context); 
     } 
     return firstDB; 
    } 

처럼 saeedHelperBD의 목적을 초기화 Singleton 패턴을 사용 선호 먼저 더 나은 대문자 인 상태 클래스 이름을 선언해야합니다.
예 : saeedHelperBD이 잘못되었습니다. 대신 SaeedHelperBD으로 선언 할 수 있습니다.

+0

남자, 네, 고맙습니다. – NoXSaeeD

0

쿼리가 실행되는 부분 주위 캐치를 시도 추가 .. 를 캐치에, 문제를 해결하는 데 도움이 e.printStackTrace();를 추가하면 문제가있는 곳을 더 자세히 알 수 있습니다 ..

여기에 당신은 단지 그들과 합류, 미쳐, 사용자의 요구에 적합하게 추가/변경 이상의 테이블을 추가 할 수 있습니다 VM

package com.jinx.dbs; 

import android.content.*; 
import android.database.*; 
import android.database.sqlite.*; 
import android.util.*; 
import com.jinx.obj.User; 
import java.util.*; 

public class database { 

    private Context mContext; 
    private SQLiteDatabase mainDB = null; 
    private final String dbName = "mainDB"; 
    private final String tblUserDetail = "tblUser"; 

    public database(Context context) { 
     mContext = context; 
    } 

    boolean CreateOrOpenDB() { 
     try { 
      mainDB = mContext.openOrCreateDatabase(dbName, SQLiteDatabase.CREATE_IF_NECESSARY, null); 
      return true; 
     } catch (SQLiteException e) { 
      e.printStackTrace(); 
      mainDB.close(); 
      return false; 
     } 
    } 

    void CreateUserTable() { 
     mainDB.execSQL("CREATE TABLE IF NOT EXISTS " 
       + tblUserDetail 
       + " (Username VARCHAR(50)," 
       + " Password VARCHAR(100)," 
       + " Name VARCHAR(100)," 
       + " Surname VARCHAR(100));"); 
    } 

    public void StoreUserData(User user) { 
     //Open DB before running any queries 
     if (CreateOrOpenDB()) { 
      try { 
       //Make sure the table exists 
       CreateUserTable(); 
       //Only store one users info at a time 
       mainDB.execSQL("DELETE FROM " + tblUserDetail); 
       mainDB.execSQL("INSERT INTO " 
         + tblUserDetail 
         + " Values ('" 
         + user.getUsername().replace("'", "''") + "','" 
         + user.getPassword().replace("'", "''") + "','" 
         + user.getName().replace("'", "''") + "','" 
         + user.getSurname().replace("'", "''") + "');"); 

       mainDB.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       mainDB.close(); 
      } 
     } else { 
      Log.i("DATABASE", "COULD NOT BE OPENED"); 
     } 
    } 

    public User ReadUserData() { 
     User data = null; 
     if (CreateOrOpenDB()) { 
      try { 
       Cursor c = mainDB.rawQuery("SELECT * FROM " 
         + tblUserDetail, null); 

       if (c != null) { 
        if (c.moveToFirst()) { 
         data = new User(
           c.getString(c.getColumnIndex("Username")), 
           c.getString(c.getColumnIndex("Password")), 
           c.getString(c.getColumnIndex("Name")), 
           c.getString(c.getColumnIndex("Surname"))); 
        } 
       } 
       c.close(); 

       mainDB.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       mainDB.close(); 
      } 
     } else { 
      Log.i("DATABASE", "COULD NOT BE OPENED"); 
     } 

     return data; 
    } 

    public void ClearUserData() { 
     if (CreateOrOpenDB()) { 
      try { 
       mainDB.execSQL("DELETE FROM " + tblUserDetail); 
       mainDB.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       mainDB.close(); 
      } 
     } else { 
      Log.i("DATABASE", "COULD NOT BE OPENED"); 
     } 
    } 
} 

에서 잘 작동 내가 사용하는 일부 DB 코드입니다. 등을 사용

(new database(this)).StoreUserData(u); //Storing the new user -- u is User Object 

User u = (new database(this)).ReadUserData(); //Get the user data 

(new database(this)).ClearUserData(); //Clear the user data 

편집 : 여기

은 사용자 개체

package com.jinx.obj; 
import java.io.Serializable; 

public class User implements Serializable { 
    private String _username; 
    private String _password; 
    private String _name; 
    private String _surname; 

    public User() { 
    } 
    public User(String Username, String Password, String Name, String Surname) { 
     this._username = Username; 
     this._password = Password; 
     this._name = Name; 
     this._surname = Surname; 
    } 
    public void setUsername(String Username) { 
     this._username = Username; 
    } 
    public String getUsername() { 
     return this._username; 
    } 
    public void setPassword(String Password) { 
     this._password = Password; 
    } 
    public String getPassword() { 
     return this._password; 
    } 
    public void setName(String Name) { 
     this._name = Name; 
    } 
    public String getName() { 
     return this._name; 
    }  
    public void setSurname(String Surname) { 
     this._surname = Surname; 
    } 
    public String getSurname() { 
     return this._surname; 
    } 
} 
+0

오류는'MainActivity' 클래스에 있으며 코드 OP와는 아무런 관련이 없습니다 게시했습니다. –

0

입니다 내가 문제를 해결, 너희들을 감사합니다, 문제는 MainActivity의 라인 (15)에 있었다 , 나는 SQLiteDatabase 개체에 null 개체를 넣으려고 했으므로 새 개체를 만든 다음 SQLiteDatabase에 개체를 넣으려고했는데 여기에 고정 코드가 있습니다

package com.example.net.saeed.sqlitedb; 

import android.os.Bundle; 
import android.app.Activity; 
import android.database.sqlite.SQLiteDatabase; 
import android.view.Menu; 

    public class MainActivity extends Activity { 
saeedHelperBD firstBD; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    firstBD = new saeedHelperBD(this);//this was added to solve the problem 
    SQLiteDatabase sql = firstBD.getWritableDatabase(); 

} 
관련 문제