问题 Android:有更好的方法来插入和/或更新数据库条目吗?


我有一个包含userId和注释的数据库。用户不知道数据库中是否已有注释,因此他们写了一个,然后单击“提交”按钮。如果没有userId的注释或更新userId已经存在的注释,我想插入此注释:

notesDb.open();
boolean updateResult = notesDb.updateMessage(
        userId,
        details_notes_input.getText().toString());

if(updateResult == true) {
    Log.d("databaseTester", "Updated entry into table");
} else {
    Log.d("databaseTester", "FAILED to update entry into table");
    long insertResult = notesDb.insertMessage(
            userId,
            details_notes_input.getText().toString());
    if(insertResult == -1){
        Log.d("databaseTester", "Failed to insert entry into table");
    } else {
        Log.d("databaseTester", "Inserted entry into table");
    }   
}
notesDb.close();

所以,我几乎试图'更新'一个条目,如果我失败了,那么我试图'插入'它。我不太了解SQL,但我认为会有更好的方法。谢谢。


2781
2017-12-16 07:16


起源



答案:


听起来你可以使用sqlite 更换 用来解决这个问题 SQLiteDatabase.replace()


13
2017-12-16 07:44



它对我不起作用。我试过了 getHelper()。getWritableDatabase()。replace(TABLE_NAME,null,values); 有什么建议么? - AlikElzin-kilaka
您可以通过实现此功能 ContentProvider 通过使用传递一个额外的参数 ContentValues。我在这里写了一篇关于它的博客文章: SQLite INSERT OR REPLACE通过ContentProvider |嗡嗡的Android - JesperB


答案:


听起来你可以使用sqlite 更换 用来解决这个问题 SQLiteDatabase.replace()


13
2017-12-16 07:44



它对我不起作用。我试过了 getHelper()。getWritableDatabase()。replace(TABLE_NAME,null,values); 有什么建议么? - AlikElzin-kilaka
您可以通过实现此功能 ContentProvider 通过使用传递一个额外的参数 ContentValues。我在这里写了一篇关于它的博客文章: SQLite INSERT OR REPLACE通过ContentProvider |嗡嗡的Android - JesperB


您可以捕获在先前ID存在的情况下启动的约束异常,然后更新。

try {
    db.insertOrThrow("sometable", null, cv);
} catch (SQLiteConstraintException e) {
    db.update("sometable", cv,"sometable_uid =" + id, null);
}

1
2018-01-17 15:09



使用异常以这种方式管理控制流可能不是一个好主意。看到 stackoverflow.com/a/729404/504611。 - Vicky Chijwani


尝试这个

result = db.insertWithOnConflict(“tablename”,null,cv,-1);


0
2017-07-04 20:16