【问题标题】:Not getting an open Sqlite database没有得到一个开放的 Sqlite 数据库
【发布时间】:2013-02-05 19:56:15
【问题描述】:

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

【问题讨论】:

  • at frisbeergolf.database.DBHandler.getAllPlayersInGame(DBHandler.java:175) 可以肯定的是第 175 行?
  • 我觉得自己有点愚蠢,因为我自己找到了答案,而且很简单。我在 getNumberOfPlayersInGame 方法中调用并关闭一个数据库。我需要解决的只是为这些行切换订单int count = this.getNumberOfPlayersInGame(game); SQLiteDatabase db = this.getReadableDatabase();
  • 您应该将其发布为未来访问者的答案,很高兴您成功了!
  • 感谢您的建议!因为这是我的第一个问题,所以我只是查看了元数据以找到在这种情况下的良好做法。答案将随之而来。

标签: android sqlite illegalstateexception


【解决方案1】:

如果您发布了代码,我可以使用您的代码举例说明,但我会使用自己的一些代码,希望我们可以解决您的问题。

https://bitbucket.org/XatikGroup/droiddraw/src/8aee6ffc4a7d089714c5003e32f29652eafd79ef/DroidDrawClient/src/com/xatik/app/droiddraw/client/databases/CommandsDbAdapter.java?at=master

我不完全确定你打电话时“这个”是什么

this.getReadableDatabase();

如果你看看我的类,我在 DbAdapter 中有一个私有静态类。这个类有助于打开数据库。 我认为这就是您的代码中出现问题的地方。

在我需要数据的活动中,我将创建一个 CommandsDbAdapter 对象,然后调用 open() 函数。

CommandsDbAdapter cmdDbAdapter = new cmdDbAdapter(this);
cmdDbAdapter.open();
List<Command> commands = cmdDbAdapter.fetchCommandsForScript(1);
cmdDbAdapter.close();

我假设扩展 SQLiteOpenHelper 的任何类都存在代码问题。请粘贴整个代码,或尝试分析我发布的代码,看看有什么不同。

【讨论】:

    【解决方案2】:

    一直都是我自己的错。

    我在this.getNumberOfPlayersInGame(game); 方法中调用并关闭一个数据库。因此也关闭了新打开的。

    解决方案就是将这些行切换到这个顺序,一切正常

        int count = this.getNumberOfPlayersInGame(game);
        SQLiteDatabase db = this.getReadableDatabase();
    

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      相关资源
      最近更新 更多