2013-01-01 62 views
0

我想在android中可靠地編寫代碼,因此我爲不同的目的製作了不同的類,例如用於與db連接的單獨類,創建表以及用於插入更新和刪除的類。現在我遇到了一個SQLiteDatabase [mDb]的問題:我有一個類,其中有getters和setter的表列,即recipient.class。現在我要插入到DATAS數據庫,所以我做了這樣的插入:Android中使用數據庫時出現空異常

public long insert(Recipient recipient, String[] images){ 
     ContentValues initialValues = new ContentValues(); 
     initialValues.put(FLD_RECIPIENT_ID, Recipient.getFldRecipientId()); 
     initialValues.put(FLD_INFO, Recipient.getFldInfo()); 
     initialValues.put(FLD_LATITUDE, Recipient.getFldLatitude()); 
     initialValues.put(FLD_LONGITUDE, Recipient.getFldLongitude()); 
     for(int i=0;i<images.length;i++){ 
      if(images[i]!=null){ 
       initialValues.put("FLD_IMAGE_URL"+(i+1), images[i]); 
      } 
     } 
     return mDb.insert(DATABASE_TABLE, null, initialValues); 
    } 

當我調試了initialValues所有值都設置並且當執行mDb.insert退出顯示nullPointException和MDB空值。我不明白爲什麼會這樣。如果有人能幫助我呢? 此外,我已經初始化MDB爲:

private SQLiteDatabase mDb; 

的logcat:

01-01 11:11:27.963: E/AndroidRuntime(992): FATAL EXCEPTION: main 
01-01 11:11:27.963: E/AndroidRuntime(992): java.lang.NullPointerException 
01-01 11:11:27.963: E/AndroidRuntime(992): at com.example.android.photobyintent.DbReceipient.insert(DbReceipient.java:43) 
01-01 11:11:27.963: E/AndroidRuntime(992): at com.example.android.photobyintent.AddRecipient.insertIntoDb(AddRecipient.java:451) 
01-01 11:11:27.963: E/AndroidRuntime(992): at com.example.android.photobyintent.AddRecipient$4.onClick(AddRecipient.java:409) 
01-01 11:11:27.963: E/AndroidRuntime(992): at android.view.View.performClick(View.java:4202) 
01-01 11:11:27.963: E/AndroidRuntime(992): at android.view.View$PerformClick.run(View.java:17340) 
01-01 11:11:27.963: E/AndroidRuntime(992): at android.os.Handler.handleCallback(Handler.java:725) 
01-01 11:11:27.963: E/AndroidRuntime(992): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-01 11:11:27.963: E/AndroidRuntime(992): at android.os.Looper.loop(Looper.java:137) 
01-01 11:11:27.963: E/AndroidRuntime(992): at android.app.ActivityThread.main(ActivityThread.java:5039) 
01-01 11:11:27.963: E/AndroidRuntime(992): at java.lang.reflect.Method.invokeNative(Native Method) 
01-01 11:11:27.963: E/AndroidRuntime(992): at java.lang.reflect.Method.invoke(Method.java:511) 
01-01 11:11:27.963: E/AndroidRuntime(992): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
01-01 11:11:27.963: E/AndroidRuntime(992): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
01-01 11:11:27.963: E/AndroidRuntime(992): at dalvik.system.NativeStart.main(Native Method) 
+2

在使用'mDb'插入數據之前,只需檢查它的** null **,如果它的null值爲null,那麼在Writable模式下打開數據庫。 – user370305

+2

'私有SQLiteDatabase mDb;'它是一個聲明。定義在哪裏? – user370305

+0

你有清單中的讀/寫權限嗎? plz顯示logcat。 – MGDroid

回答

0

做到這一點的MDB。

private SQLiteDatabase mDb = this.getWritableDatabase(); 
+0

雅我已經這樣做,雖然它是拋出異常 – ugene

+0

和mDb仍然是空的 – ugene

+0

@sid它更好,如果你提供給我們你的完整代碼 –

0

在數據庫中插入之前初始化mDb

public long insert(Recipient recipient, String[] images){ 
     mDb = Your_sqLiteHelper.getWritableDatabase(); 

     // your code here 

     return mDb.insert(DATABASE_TABLE, null, initialValues); 
    } 
0

我想你訪問它之前MDB未初始化或者其無效。 嘗試:

函數之前 mDb = this.getWritableDatabase();

public long insert(Recipient recipient, String[] images){ 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(FLD_RECIPIENT_ID, Recipient.getFldRecipientId()); 
    initialValues.put(FLD_INFO, Recipient.getFldInfo()); 
    initialValues.put(FLD_LATITUDE, Recipient.getFldLatitude()); 
    initialValues.put(FLD_LONGITUDE, Recipient.getFldLongitude()); 
    for(int i=0;i<images.length;i++){ 
     if(images[i]!=null){ 
      initialValues.put("FLD_IMAGE_URL"+(i+1), images[i]); 
     } 
    } 
    if(mdb!=null){ 
     return mDb.insert(DATABASE_TABLE, null, initialValues); 
    }else { 
     return null; 
    } 
} 

如果返回值爲空,則相應地工作。

0

這是最好的,你使用的數據庫對象原子,只要打開它,當你需要它,一旦關閉它,你不需要它了

嘗試這樣的:

SQLiteDatabase db = opener.getWritableDatabase(); 

    try { 
     ContentValues values = new ContentValues(); 
     /* set values */ 

     return db.insertOrThrow(tableName, null, values); 
    } finally { 
     db.close(); 
    } 
0

它看起來像您的mDb成員變量在您調用insert方法時未初始化(即它仍爲null)。

你的班級在哪裏分配了這個變量?也許您已經創建了另一種方法,名稱爲connect,您忘記了在insert之前撥打電話?

在我可以進一步提供幫助之前,您需要展示更多的班級代碼。

相關問題