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()
干什么,有人可以解释它的目的是什么吗?
据我所知replace()
的作用非常像SQLite REPLACE关键字 - 如果插入发生了唯一的约束违规,则会更新一行。因此,示例中的ID列需要在数据库模式中具有PRIMARY KEY约束,以便更新行。
我认为这可能是问题所在。 –
首先,是的“_id”字段是PRIMARY KEY。其次,新记录没有被创建。这意味着该方法实际上是找到原始记录而不是创建新记录。但正如我所说,现有的记录只是没有得到更新...... –
是的,引用@ JesperB的博客文章 - “正如你可以在官方文档中看到的(SQL As Understood By SQLite),该命令执行INSERT OR REPLACE。也就是说,做一个INSERT,如果这个INSERT由于冲突而失败,那么在INSERT之前再次删除冲突的行。“ –
replace()方法实际上执行的是sql命令insert or replace into (...) values (...)
它没有INSERT或REPLACE。 –
如果您在ContentValues中传递特殊参数,则可以在ContentProvider.insert()方法中同时使用INSERT和REPLACE程序。我在这里写了一篇关于它的博客文章:[SQLite通过ContentProvider插入或替换| Buzzing Android](http://www.buzzingandroid.com/2013/01/sqlite-insert-or-replace-through-contentprovider/) – JesperB