0

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

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

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

            Game g = db.getGame(gameif);

    return g;   
}

这条线 Game g = db.getGame() 是给我 NPE 的那条线。传入的gameid不为空,对数据库的引用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()在主活动中启动,然后运行一个异步任务,它将一些数据发送到服务器,然后根据来自服务器的响应代码,应该删除本地数据库中的记录。getGame()在异步任务中触发onPostExecute()

4

1 回答 1

1

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

-> db = new DatabaseHandler(this);

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

db.open() ;

在 Handler 中设置这段代码:

private MySQLiteHelper dbHelper; 

   public void open() throws SQLException {

    db = dbHelper.getWritableDatabase();

    }

如果您不打开数据库,Android 会抛出 NullPointerException 。打开数据库时遇到问题,这会引发异常。

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

于 2013-09-29T04:46:50.237 回答