Android光标非法状态异常崩溃

时间:2018-08-02 16:43:48

标签: android sqlite cursor

我的一段android代码遇到了一些问题,崩溃似乎发生在c.moveToFirst()。我试图得到一个计数,并且如果游标结果大于0,则为0。然后执行该代码,但这无济于事。

我无法在我的应用程序上重现此错误(我已经尝试了几种方案),但是,通过Google Dev Console,我看到正在使用我的应用程序的其他人都收到了此错误。

预先感谢

崩溃错误:

java.lang.IllegalStateException: 
  at android.database.sqlite.SQLiteConnectionPool.throwIfClosedLocked (SQLiteConnectionPool.java:1198)
  at android.database.sqlite.SQLiteConnectionPool.waitForConnection (SQLiteConnectionPool.java:808)
  at android.database.sqlite.SQLiteConnectionPool.acquireConnection (SQLiteConnectionPool.java:534)
  at android.database.sqlite.SQLiteSession.acquireConnection (SQLiteSession.java:904)
  at android.database.sqlite.SQLiteSession.executeForCursorWindow (SQLiteSession.java:834)
  at android.database.sqlite.SQLiteQuery.fillWindow (SQLiteQuery.java:62)
  at android.database.sqlite.SQLiteCursor.fillWindow (SQLiteCursor.java:152)
  at android.database.sqlite.SQLiteCursor.getCount (SQLiteCursor.java:141)
  at com.andre3.wzlimitdistraction.dao.Dao.read (Dao.java:101)
  at com.andre3.wzlimitdistraction.utils.MonitorService$2.run (MonitorService.java:201)
  at java.util.TimerThread.mainLoop (Timer.java:555)
  at java.util.TimerThread.run (Timer.java:505)

导致该问题的代码:

    ArrayList<UserApps> arr = new ArrayList<UserApps>();

    int profileId = 0;
    SQLiteDatabase getDb = db.getReadableDatabase();

    if(getDb.isOpen()) {

        String[] columns = {Dbinfo.app.toString(), Dbinfo.app_name.toString(), Dbinfo.start_duration.toString(), Dbinfo.active_duration.toString(), Dbinfo.start_time.toString(), Dbinfo.profile_id.toString()};

        String selection = Dbinfo.app.toString() + " =? and " + Dbinfo.profile_id.toString() + " <=?";
        String[] selectionArgs = {id, String.valueOf(profileId)};
        Cursor c = getDb.query("user_apps", columns, selection, selectionArgs, null, null, null);

        if((c.getCount() > 0) && (c !=null)) {

            if (c.moveToFirst()) {

                do {
                    UserApps form = new UserApps();

                    form.setPkg(c.getString(c.getColumnIndex(Dbinfo.app.toString())));
                    form.setName(c.getString(c.getColumnIndex(Dbinfo.app_name.toString())));

                    arr.add(form);
                } while (c.moveToNext());
            }
        }

        getDb.close();
        c.close();

    }
    return arr;

1 个答案:

答案 0 :(得分:0)

这可能是因为getColumnIndex找不到您指定的列。您可以参考此Question