使用数据库时android中的空例外

时间:2013-01-01 10:53:04

标签: android sqlite nullpointerexception

我正在尝试在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)

5 个答案:

答案 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之前调用它?

在我可以继续提供帮助之前,您需要显示更多类的代码。