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

问题描述:

我需要对数据库执行INSERT或UPDATE IF EXIST类型的过程。我读到.replace()是要走的路。它插入新记录就好了,但如果记录已经存在,它就不会更新它。Android SQLite - SQLiteDatabase.replace()实际上做了什么?

我有这样的事情:

ContentValues values = new ContentValues(); 
values.put(ID, 1); 
values.put(NAME, "bob"); 
values.put(VISIBLE, true); 
db.replace("peopleTable", null, values); 

如果我运行这段代码时,这个记录是不是在数据库中,它似乎创建记录就好了,好像我做了一个insert()。但是,如果我将NAME更改为“john”或类似内容,并再次运行replace(),它似乎不会更新记录。

根据该文档,这里是语法:

public long replace (String table, String nullColumnHack, ContentValues initialValues) 

为什么叫initalValues?这是否意味着这些值仅在记录不存在并且将被插入时使用?如果是这样,你如何使用该方法更新记录?你在哪里指定新的值?

如果我误解了replace()干什么,有人可以解释它的目的是什么吗?

+1

它没有INSERT或REPLACE。 –

+2

如果您在ContentValues中传递特殊参数,则可以在ContentProvider.insert()方法中同时使用INSERT和REPLACE程序。我在这里写了一篇关于它的博客文章:[SQLite通过ContentProvider插入或替换| Buzzing Android](http://www.buzzingandroid.com/2013/01/sqlite-insert-or-replace-through-contentprovider/) – JesperB

据我所知replace()的作用非常像SQLite REPLACE关键字 - 如果插入发生了唯一的约束违规,则会更新一行。因此,示例中的ID列需要在数据库模式中具有PRIMARY KEY约束,以便更新行。

+0

我认为这可能是问题所在。 –

+0

首先,是的“_id”字段是PRIMARY KEY。其次,新记录没有被创建。这意味着该方法实际上是找到原始记录而不是创建新记录。但正如我所说,现有的记录只是没有得到更新...... –

+2

是的,引用@ JesperB的博客文章 - “正如你可以在官方文档中看到的(SQL As Understood By SQLite),该命令执行INSERT OR REPLACE。也就是说,做一个INSERT,如果这个INSERT由于冲突而失败,那么在INSERT之前再次删除冲突的行。“ –

replace()方法实际上执行的是sql命令insert or replace into (...) values (...)