我需要帮助的人!我有一个错误,我已经工作了几个小时,无法解决。
我有一个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()
中触发。
答案 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