2012-06-08 41 views
3

我準備爲Android開發我的第二個應用程序,並且我想使用該數據庫。但是我被一個錯誤阻止了。查詢中的java.lang.NullPointerException錯誤

這是類:

public class MyDatabase { 

    SQLiteDatabase mDb; 
    DbHelper mDbHelper; 
    Context mContext; 
    private static final String DB_NAME="epsoftsms";//nome del db 
    private static final int DB_VERSION=1; //numero di versione del nostro db 

    public MyDatabase(Context ctx){ 
      mContext=ctx; 
      mDbHelper=new DbHelper(ctx, DB_NAME, null, DB_VERSION); //quando istanziamo questa classe, istanziamo anche l'helper (vedi sotto)  
    } 

    public void open(){ //il database su cui agiamo è leggibile/scrivibile 


     mDb=mDbHelper.getWritableDatabase(); 

    } 

    public void close(){ //chiudiamo il database su cui agiamo 
      mDb.close(); 
    } 


    //i seguenti 2 metodi servono per la lettura/scrittura del db. aggiungete e modificate a discrezione 
    // consiglio:si potrebbe creare una classe Prodotto, i quali oggetti verrebbero passati come parametri dei seguenti metodi, rispettivamente ritornati. Lacio a voi il divertimento 


    public void inserimentoParametri(String parametro,String valore){ //metodo per inserire i dati 
      ContentValues cv=new ContentValues(); 
      cv.put(ParametriMetaData.PARAMETRO, parametro); 
      cv.put(ParametriMetaData.VALORE, valore); 
      mDb.insert(ParametriMetaData.TAB_PARAMETRI, null, cv); 
    } 

    public Cursor listaParametri(){ //metodo per fare la query di tutti i dati 



     return mDb.query(ParametriMetaData.TAB_PARAMETRI, null,null,null,null,null,null); 



    } 

    static class ParametriMetaData { // i metadati della tabella, accessibili ovunque 
      static final String TAB_PARAMETRI = "parametri"; 
      static final String PARAMETRO = "_parametro"; 
      static final String VALORE = "valore"; 

    } 

    private static final String CREA_TAB_PARAMETRI = "CREATE TABLE IF NOT EXISTS " //codice sql di creazione della tabella 
        + ParametriMetaData.TAB_PARAMETRI + " (" 
        + ParametriMetaData.PARAMETRO+ " text primary key, " 
        + ParametriMetaData.VALORE + " text not null);"; 

    private class DbHelper extends SQLiteOpenHelper { //classe che ci aiuta nella creazione del db 

      public DbHelper(Context context, String name, CursorFactory factory,int version) { 
        super(context, name, factory, version); 
      } 

      public SQLiteDatabase getWritableDatabase() { 
       // TODO Auto-generated method stub 
       return null; 
      } 

      @Override 
      public void onCreate(SQLiteDatabase _db) { //solo quando il db viene creato, creiamo la tabella 
        _db.execSQL(CREA_TAB_PARAMETRI); 
      } 

      @Override 
      public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) { 
        //qui mettiamo eventuali modifiche al db, se nella nostra nuova versione della app, il db cambia numero di versione 

      } 

    } 


} 

這是主要感興趣的部分:

final MyDatabase db=new MyDatabase(getApplicationContext()); 
    db.open(); //apriamo il db 



    if (db.listaParametri().getCount()==0) 
    { 


    } 

當我啓動應用程序它返回以下錯誤:

06-08 14:04:40.197: E/AndroidRuntime(1149): Uncaught handler: thread main exiting due to uncaught exception 
06-08 14:04:40.207: E/AndroidRuntime(1149): java.lang.RuntimeException: Unable to start activity ComponentInfo{it.axiomatic.epsoft.sms/it.axiomatic.epsoft.sms.EpsoftSMSActivity}: java.lang.NullPointerException 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2268) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at android.app.ActivityThread.access$1800(ActivityThread.java:112) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at android.os.Looper.loop(Looper.java:123) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at android.app.ActivityThread.main(ActivityThread.java:3948) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at java.lang.reflect.Method.invoke(Method.java:521) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at dalvik.system.NativeStart.main(Native Method) 
06-08 14:04:40.207: E/AndroidRuntime(1149): Caused by: java.lang.NullPointerException 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at it.axiomatic.epsoft.sms.MyDatabase.listaParametri(MyDatabase.java:50) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at it.axiomatic.epsoft.sms.EpsoftSMSActivity.onCreate(EpsoftSMSActivity.java:30) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231) 
06-08 14:04:40.207: E/AndroidRuntime(1149):  ... 11 more 

什麼問題? Tnx和原諒我的一些錯誤,這是我在Stackoverflow上的第一個請求。

+0

顯然'mDbHelper.getWritableDatabase()'返回null;你需要弄清楚爲什麼。也許你的幫助器構造函數的參數是錯誤的。 –

+0

對不起,但你的意思是「你的參數給輔助構造函數是錯誤的」? –

+0

@Barak給出了正確的答案 - 見下文! –

回答

7

這是你的問題:

 public SQLiteDatabase getWritableDatabase() { 
      // TODO Auto-generated method stub 
      return null; 
     } 

要覆蓋SQLiteDatabase類​​方法和它什麼都不做(不打開數據庫或任何東西)返回null,這樣導致一個NPE。

刪除該方法,您的NPE應該消失。

+0

我猜你是對的!!!! TNX !!!!! –

1

隨着您向我們顯示的代碼,唯一的可能性是當您調用listaParametri時,SQLiteDatabase mDb爲空。你確定你在調用listaParametri之前創建對象嗎?

+0

我調用函數db.open,並且不會返回從不出錯。但我怎麼能知道數據庫打開?我沒有發現任何可以理解的東西:( –

0
// open or close database with create statement 
LD_ConstantData.db=openOrCreateDatabase(LD_ConstantData.dbName,SQLiteDatabase.CREATE_IF_NECESSARY,null); 
LD_ConstantData.sql = new LD_MySqlOpenHelper(LD_Multi.this, LD_ConstantData.dbName, null, 1); 
String sql="CREATE TABLE if not exists "+ LD_ConstantData.Table+"("+LD_ConstantData.colId+" INTEGER PRIMARY KEY AUTOINCREMENT,"+LD_ConstantData.coluserid+" TEXT NOT NULL,"+LD_ConstantData.colFirstName+" TEXT NOT NULL,"+LD_ConstantData.colLastName+" TEXT NOT NULL);"; 
LD_ConstantData.sql.create_table(sql);  
LD_ConstantData.db.close(); 
// for insert data 
    LD_ConstantData.sql = new LD_MySqlOpenHelper(context, database_name, null, database_version); 
     LD_ConstantData.db = LD_ConstantData.sql.getReadableDatabase(); 
LD_ConstantData.db.execSQL("INSERT INTO "+LD_ConstantData.Table +" VALUES(NULL,'"+userid+"','"+userfirstname+"','"+userlastname+"');"); 
     LD_ConstantData.db.close(); 
相關問題