我正在尝试从SQLiteDatabase rawQuery获取游标,但不断获得java.lang.IllegalStateException
。准确地说这个例外:
02-05 19:30:25.100: E/AndroidRuntime(338): java.lang.RuntimeException: Unable to start activity ComponentInfo{frisbeergolf.gui/frisbeergolf.gui.Hole}: java.lang.IllegalStateException: attempt to acquire a reference on a close SQLiteClosable
(下面的完整日志)
这是我在SQLiteOpenHelper类中的方法:
public int[] getAllPlayersInGame(Game game){
SQLiteDatabase db = this.getReadableDatabase();
int count = this.getNumberOfPlayersInGame(game);
int[] playerIDs = new int[count];
Boolean b = db.isOpen();
Cursor cursor = null;
cursor = db.rawQuery("SELECT playerID FROM " + gamesTable + " WHERE gameID = " + game.getGameId(), null);
cursor.moveToFirst();
for (int i = 0; i < count; i++) {
playerIDs[i] = cursor.getInt(0);
cursor.moveToNext();
}
cursor.close();
db.close();
return playerIDs;
}
我做了布尔值来检查数据库是否打开。它返回false。
任何人都可以帮助我吗?
完整错误日志:
02-05 19:30:25.080: W/dalvikvm(338): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
02-05 19:30:25.080: E/AndroidRuntime(338): Uncaught handler: thread main exiting due to uncaught exception
02-05 19:30:25.100: E/AndroidRuntime(338): java.lang.RuntimeException: Unable to start activity ComponentInfo{frisbeergolf.gui/frisbeergolf.gui.Hole}: java.lang.IllegalStateException: attempt to acquire a reference on a close SQLiteClosable
02-05 19:30:25.100: E/AndroidRuntime(338): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
02-05 19:30:25.100: E/AndroidRuntime(338): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
02-05 19:30:25.100: E/AndroidRuntime(338): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
02-05 19:30:25.100: E/AndroidRuntime(338): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
02-05 19:30:25.100: E/AndroidRuntime(338): at android.os.Handler.dispatchMessage(Handler.java:99)
02-05 19:30:25.100: E/AndroidRuntime(338): at android.os.Looper.loop(Looper.java:123)
02-05 19:30:25.100: E/AndroidRuntime(338): at android.app.ActivityThread.main(ActivityThread.java:4363)
02-05 19:30:25.100: E/AndroidRuntime(338): at java.lang.reflect.Method.invokeNative(Native Method)
02-05 19:30:25.100: E/AndroidRuntime(338): at java.lang.reflect.Method.invoke(Method.java:521)
02-05 19:30:25.100: E/AndroidRuntime(338): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
02-05 19:30:25.100: E/AndroidRuntime(338): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
02-05 19:30:25.100: E/AndroidRuntime(338): at dalvik.system.NativeStart.main(Native Method)
02-05 19:30:25.100: E/AndroidRuntime(338): Caused by: java.lang.IllegalStateException: attempt to acquire a reference on a close SQLiteClosable
02-05 19:30:25.100: E/AndroidRuntime(338): at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:31)
02-05 19:30:25.100: E/AndroidRuntime(338): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:56)
02-05 19:30:25.100: E/AndroidRuntime(338): at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
02-05 19:30:25.100: E/AndroidRuntime(338): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:49)
02-05 19:30:25.100: E/AndroidRuntime(338): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1221)
02-05 19:30:25.100: E/AndroidRuntime(338): at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1194)
02-05 19:30:25.100: E/AndroidRuntime(338): at frisbeergolf.database.DBHandler.getAllPlayersInGame(DBHandler.java:175)
02-05 19:30:25.100: E/AndroidRuntime(338): at frisbeergolf.database.DBHandler.getProgressAtHole(DBHandler.java:226)
02-05 19:30:25.100: E/AndroidRuntime(338): at frisbeergolf.game.Game.getProgressAtHole(Game.java:63)
02-05 19:30:25.100: E/AndroidRuntime(338): at frisbeergolf.gui.Hole.onCreate(Hole.java:31)
02-05 19:30:25.100: E/AndroidRuntime(338): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-05 19:30:25.100: E/AndroidRuntime(338): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
02-05 19:30:25.100: E/AndroidRuntime(338): ... 11 more
答案 0 :(得分:0)
如果您发布了代码,我可以使用您的代码举例,但我会使用自己的代码,希望我们可以解决您的问题。
当你致电
时,我并不完全确定'这个'是什么this.getReadableDatabase();
如果你看一下我的课,我在DbAdapter里面有一个私有静态类。该类有助于打开数据库。 我认为这是代码中出现问题的地方。
在我需要数据的活动中,我将创建一个CommandsDbAdapter对象,然后调用open()函数。
CommandsDbAdapter cmdDbAdapter = new cmdDbAdapter(this);
cmdDbAdapter.open();
List<Command> commands = cmdDbAdapter.fetchCommandsForScript(1);
cmdDbAdapter.close();
我假设任何类扩展SQLiteOpenHelper都存在代码问题。请粘贴整个代码,或尝试分析我发布的代码,看看有什么不同。
答案 1 :(得分:0)
这是我自己的错。
我在this.getNumberOfPlayersInGame(game);
方法中调用了关闭数据库。因此也关闭了新开的那个。
解决方案只是将这些行切换到此顺序并且一切正常
int count = this.getNumberOfPlayersInGame(game);
SQLiteDatabase db = this.getReadableDatabase();