2013-01-01 22 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之前拨打电话?

在我可以进一步提供帮助之前,您需要展示更多的班级代码。

相关问题