Sqlite android:更新成功但创建了新行

时间:2016-05-03 07:04:15

标签: android sqlite sql-update sql-insert

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值。

我错过了什么?

1 个答案:

答案 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。您可以通过使用它来大大简化代码。