我正在尝试在android中可靠地编码,所以我为不同的目的制作了不同的类,比如用于连接db的单独类,创建表,以及用于插入更新和删除的类。现在我遇到了SQLiteDatabase [mDb]的问题:我有一个类,其中有表列的getter和setter,即recipient.class。现在我必须将数据插入数据库,所以我这样插入:
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 null的值。我不明白为什么会这样。如果有人能帮助我的话??? 我还将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)
答案 0 :(得分:0)
在mDB上执行此操作。
private SQLiteDatabase mDb = this.getWritableDatabase();
答案 1 :(得分:0)
在插入数据库之前初始化mDb
:
public long insert(Recipient recipient, String[] images){
mDb = Your_sqLiteHelper.getWritableDatabase();
// your code here
return mDb.insert(DATABASE_TABLE, null, initialValues);
}
答案 2 :(得分:0)
我认为mDb在您访问之前未初始化或为null。 尝试:
在功能之前 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;
}
}
如果返回值为null,则相应地工作。
答案 3 :(得分:0)
最好以原子方式使用数据库对象,只需在需要时打开它,并在不再需要它时立即将其关闭
试试这样:
SQLiteDatabase db = opener.getWritableDatabase();
try {
ContentValues values = new ContentValues();
/* set values */
return db.insertOrThrow(tableName, null, values);
} finally {
db.close();
}
答案 4 :(得分:0)
在您调用mDb
方法时,您的null
成员变量似乎未初始化(即它仍为insert
)。
你的班级在哪里分配了这个变量?也许你已经创建了另一个名为connect
的方法,你忘了在insert
之前调用它?
在我可以继续提供帮助之前,您需要显示更多类的代码。