Java Android SQLite-SQLiteDatabase.replace()实际上做什么?

Java Android SQLite-SQLiteDatabase.replace()实际上做什么?,java,android,sqlite,Java,Android,Sqlite,我需要对数据库执行插入或更新(如果存在)类型的过程。我读到.replace()是一条路要走。它可以插入新记录,但是如果记录已经存在,它似乎不会更新它 我有这样的想法: ContentValues values = new ContentValues(); values.put(ID, 1); values.put(NAME, "bob"); values.put(VISIBLE, true); db.replace("peopleTable", null, values); 如果在该记录不在数

我需要对数据库执行插入或更新(如果存在)类型的过程。我读到
.replace()
是一条路要走。它可以插入新记录,但是如果记录已经存在,它似乎不会更新它

我有这样的想法:

ContentValues values = new ContentValues();
values.put(ID, 1);
values.put(NAME, "bob");
values.put(VISIBLE, true);
db.replace("peopleTable", null, values);
如果在该记录不在数据库中时运行此代码,它似乎可以创建记录,就像我执行了
insert()
。但是,如果我将名称更改为“john”或类似的名称,然后再次运行
replace()
,它似乎不会更新记录

根据文档,以下是语法:

public long replace (String table, String nullColumnHack, ContentValues initialValues)
为什么它被称为
initalValues
?这是否意味着这些值仅在记录不存在且将被插入时使用?如果是,您如何使用该方法更新记录?在哪里指定新值


如果我完全误解了
replace()
的作用,有人能解释一下它的用途吗?

据我所知
replace()
的工作原理与SQLite关键字非常相似-如果插入发生唯一约束冲突,将更新一行。因此,您的示例中的ID列需要在数据库架构中具有主键约束才能更新行。

replace()方法实际上执行sql命令
插入或替换为(…)值(…)
在我的情况下,update()起作用:

SQLiteDatabase db = taskHelper.getWritableDatabase();
String DBroll =TaskContract.TaskEntry.COL_TASK_TITLE;
String taskU = String.valueOf(taskEdit.getText()); 
ContentValues values = new ContentValues();
values.put(DBroll, taskU); 
db.update(TaskContract.TaskEntry.TABLE, values, DBroll + " = ?", new String[]{taskD});
db.close();

我认为这可能是问题所在。首先,是的,“\u id”字段是主键。其次,没有创建新记录。这意味着该方法实际上是查找原始记录,而不是创建新记录。但正如我所说,现有记录没有得到更新……是的,引用@JesperB的博客文章——“正如您在官方文档(SQLite理解的SQL)中所看到的,命令执行插入或替换。也就是说,执行插入,如果插入因冲突而失败,请在再次插入之前删除冲突的行。”如果在
ContentValues
中传递特殊参数,则可以在
ContentProvider.INSERT()
方法中使用
INSERT
REPLACE
过程。我在这里写了一篇关于它的博客: