我们一直在设置一个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他们应该是相同的,但他们表现出不同的行为。
答案 0 :(得分:2)
这可能是解释:
连续调用失败,因为您没有正确终止第一个调用: