访问SQLite DB时出现Android NullPointerException

时间:2013-09-29 00:36:08

标签: android sqlite

我需要帮助的人!我有一个错误,我已经工作了几个小时,无法解决。

我有一个ListView和customadapter,listview填充了来自本地sqlite db的对象。我在listview的每一行都有一个按钮,它应该从数据库中删除相应的对象。但是,当单击按钮时,我会查询数据库,如此...

public Game getGame(gameid){    
    Long gameif = Long.parseLong(gameid);

            Game g = db.getGame(gameif);

    return g;   
}

游戏g = db.getGame()是给我NPE的那一行。传入的gameid不为null,对数据库db = new DatabaseHandler(this);的引用不为空(我不认为)。

以下是DatabaseHandler的代码:

Game getGame(Long id) {
    SQLiteDatabase db = this.getReadableDatabase();

    Game game= null;
    System.out.println(String.valueOf(id));
    Cursor cursor = db.query(TABLE_GAMES, new String[] { KEY_ID,
            KEY_PLAYERNAME, KEY_PLAYERNUMBER, KEY_LASTTURN, KEY_NEXTTURN }, KEY_ID + "= ?",
            new String[] { String.valueOf(id) }, null, null, null, null);

    if (cursor != null){
        cursor.moveToFirst();

    game = new Game(Long.parseLong(cursor.getString(0)), cursor.getString(1), 
            Integer.parseInt(cursor.getString(2)),
            cursor.getString(3), Integer.parseInt(cursor.getString(4)));
    }


    return game;
}

提前致谢!

编辑 - 这是logcat。

09-29 11:06:52.843: E/AndroidRuntime(16969): FATAL EXCEPTION: main
09-29 11:06:52.843: E/AndroidRuntime(16969): java.lang.NullPointerException
09-29 11:06:52.843: E/AndroidRuntime(16969):    at com.domsoft.ff.MainActivity.getGame(MainActivity.java:115)
09-29 11:06:52.843: E/AndroidRuntime(16969):    at com.domsoft.ff.MainActivity.talkToAsync(MainActivity.java:71)
09-29 11:06:52.843: E/AndroidRuntime(16969):    at com.domsoft.ff.GameCustomAdapter$1.onClick(GameCustomAdapter.java:72)
09-29 11:06:52.843: E/AndroidRuntime(16969):    at android.view.View.performClick(View.java)
09-29 11:06:52.843: E/AndroidRuntime(16969):    at android.view.View$PerformClick.run(View.java)
09-29 11:06:52.843: E/AndroidRuntime(16969):    at android.os.Handler.handleCallback(Handler.java)
09-29 11:06:52.843: E/AndroidRuntime(16969):    at android.os.Handler.dispatchMessage(Handler.java)
09-29 11:06:52.843: E/AndroidRuntime(16969):    at android.os.Looper.loop(Looper.java)
09-29 11:06:52.843: E/AndroidRuntime(16969):    at android.app.ActivityThread.main(ActivityThread.java)
09-29 11:06:52.843: E/AndroidRuntime(16969):    at java.lang.reflect.Method.invokeNative(Native Method)
09-29 11:06:52.843: E/AndroidRuntime(16969):    at java.lang.reflect.Method.invoke(Method.java)
09-29 11:06:52.843: E/AndroidRuntime(16969):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
09-29 11:06:52.843: E/AndroidRuntime(16969):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
09-29 11:06:52.843: E/AndroidRuntime(16969):    at dalvik.system.NativeStart.main(Native Method)

单击我customadapter中处理的按钮,然后在主活动中启动talktoasync(),然后运行asynctask,将一些数据发送到服务器,然后根据服务器的响应代码,应删除本地数据库中的记录。 getGame()在asynctask的onPostExecute()中触发。

1 个答案:

答案 0 :(得分:1)

当您访问数据访问对象时,首先需要具有对象的实例和

- > db = new DatabaseHandler(this);

需要打开需要访问的数据库之后

db.open();

在处理程序中设置此段代码:

private MySQLiteHelper dbHelper; 

   public void open() throws SQLException {

    db = dbHelper.getWritableDatabase();

    }

如果你不打开数据库,Android会抛出NullPointerException。当你打开数据库时,你有一个问题,这会抛出这个例子。

您可以查看本教程以获取更多信息: http://www.vogella.com/articles/AndroidSQLite/article.html