Update方法返回true。 但是在列出整个表时,会为每次更新创建新行。
一个表,三列:PRIMARY_ID,MY_ID,MY_ANOTHER_ID。
我有以下方法:
public void insertOrUpdate(String lStringId){
boolean present= search(lStringId);
if(present){
updateData(lStringId);
} else{
insertData(lStringId);
}
}
搜索:
private boolean search(String lStringId) {
Cursor cursor = null;
try {
cursor = mDatabase.query(TABLE_NAME, null,
MY_ID + " = ?", new String[]{lStringId}, null, null, null);
if (null != cursor && cursor.getCount() == 1 && cursor.moveToFirst()) {
return true
}
Log.d(TAG, "-search, cursor.getCount() = " + cursor.getCount());
return false;
} catch (Exception e) {
Log.e(TAG, "-search, Error: "+ e.getLocalizedMessage());
return false;
} finally {
if (null != cursor) {
cursor.close();
cursor = null;
}
}
}
更新:
public boolean updateData(String lStringId) {
Log.d(TAG, " -updateData");
ContentValues lValues = new ContentValues();
lValues.put(MY_ANOTHER_ID, lStringId+"extra");
if (mDatabase.update(TABLE_NAME,
lValues, MY_ID + "= '" + lStringId + "'", null) > 0) {
Log.d(TAG, " -updateData, true");
return true;
}
return false;
}
插入:
public long insertData(String lStringId) {
Log.d(TAG, " -insertData");
ContentValues dataValues = new ContentValues();
dataValues.put(MY_ID, lStringId);
long result = mDatabase.insert(TABLE_NAME, null, dataValues);
Log.d(TAG, "result: " + result);
return result;
}
第一次新插入后,下次调用 insertOrUpdate 方法时,搜索方法返回true。并且调用了 updateData 方法,它也返回true。
-search,cursor.getCount()= 也会打印1。
但是当我检查表的内容时,有两行具有相同的MY_ID值和不同的MY_ANOTHER_ID值。
我错过了什么?
答案 0 :(得分:1)
很多事情都可能出错。
非原子操作。
您首先查询对象是否存在然后执行插入或更新。在android中,另一个线程不太可能在这两个操作之间创建另一个对象,但在其他地方它可能会发生,所以这是一个要避免的习惯。
MY_ID上的唯一键,MY_ANOTHER_ID
如果该表中只能有一个MY_ID,则应该有一个唯一的键。如果不是,你应该在my_id,my_another_id对列上有一个唯一的唯一键。
搜索方法中的代码。
if (null != cursor && cursor.getCount() == 1
&& cursor.moveToFirst()) {
return true
}
如果my_id只有一条记录,如果你有两条记录,这将返回true?然后这个方法不会返回true,调用函数会认为该表中没有任何匹配的记录。
插入或更新真实交易
Android Sqlite支持ON CONFLICT REPLACE。您可以通过使用它来大大简化代码。