有时SQLite查询android上的空光标

时间:2014-06-12 10:18:49

标签: java android sqlite

我们一直在设置一个Android应用程序并在使用SQLite时遇到一个奇怪的错误,其中相同的查询有时会提供结果,有时则不会。

运行以下代码时,它可能会返回请求的行,或者cursor.moveToFirst可能返回false。导致返回null。

我一直无法弄清楚cursor.moveToFirst()可能失败的原因。代码运行相同的语句,名称在同一数据库中相同。 奇怪的是它几乎似乎交替给予所请求的行并且什么都不给。 从ASyncTask调用此方法,因此可能会连续多次调用,但是从按钮触发任务时,不可能同时调用两次。

最低android api级别为8

connectionInfo对象是返回信息的包装器。 connectionName是与当前检索的行关联的名称,始终为“default”。 对象databaseHelper是SQLiteOpenHelper类的扩展。 readFromCursor函数从游标中读取项目,并且正常工作,问题是当cursor.moveToFirst()返回false时未调用它。

public ConnectionInfo getConnectionByName(String connectionName) {
    ConnectionInfo info = null;
    SQLiteDatabase db = databaseHelper.getWritableDatabase();
    Cursor cursor = db.rawQuery(STMT_SELECT_BY_NAME , new String[]{connectionName});

    if (cursor != null) {
        if (cursor.moveToFirst()) {
             info = readFromCursor(cursor);
        }
        cursor.close();
    }       

    DBRefcounter.closeDB(db);   

    return info;
}

来自:

public ConnectionInfo createConnectionInfo(String connectionName, String siteURL, String subsite, String username, String password){


    ConnectionInfo info = getConnectionByName(connectionName);      

    if(info == null){
        SQLiteDatabase db = databaseHelper.getWritableDatabase();


        ContentValues values = new ContentValues();     

        values.put(COLUMN_CONNECTION_NAME, connectionName);
        values.put(COLUMN_SERVER_URL, siteURL);
        values.put(COLUMN_SUBSITE, subsite);
        values.put(COLUMN_USERNAME, username);
        values.put(COLUMN_PASSWORD, password);
        values.put(COLUMN_LAST_ACCESS_TIME, System.currentTimeMillis());            

        long id = db.insert(TABLE_CONNECTION, null, values);

        DBRefcounter.closeDB(db);//clalls db.close and lowers counter   

        if(id >= 0){

            //Build object to return
        }
    }
    else{
        //update the existing object
    }   

    return info;
}

更新

有人能告诉我.close()和releaseReference方法之间的区别吗?根据api他们应该是相同的,但他们表现出不同的行为。

1 个答案:

答案 0 :(得分:2)

这可能是解释:

连续调用失败,因为您没有正确终止第一个调用:

  1. 在返回之前,您需要调用db.close和cusrsor.close()。 db.close更为必要。
  2. 不这样做会导致第二次调用出错,导致游标为空。此异常本质上关闭了db。因此第3次通话取得成功。