Android SQLite - SQLiteDatabase.replace() 实际上做了啥?
Posted
技术标签:
【中文标题】Android SQLite - SQLiteDatabase.replace() 实际上做了啥?【英文标题】:Android SQLite - what does SQLiteDatabase.replace() actually do?Android SQLite - SQLiteDatabase.replace() 实际上做了什么? 【发布时间】:2011-12-20 12:30:36 【问题描述】:我需要对我的数据库执行 INSERT 或 UPDATE IF EXIST 类型的过程。我读到.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()
的作用,谁能解释它的目的是什么?
【问题讨论】:
如果您在ContentValues
中传递一个特殊参数,您可以在ContentProvider.insert()
方法中同时使用INSERT
和REPLACE
过程。我在这里写了一篇关于它的博客文章:SQLite INSERT OR REPLACE through ContentProvider | Buzzing android
【参考方案1】:
据我了解,replace()
的工作方式与 SQLite REPLACE 关键字非常相似——如果插入发生唯一约束违规,则将更新一行。因此,您示例中的 ID 列需要在数据库模式中具有 PRIMARY KEY 约束才能更新行。
【讨论】:
我认为这可能是问题所在。 首先,“_id”字段是主键。其次,没有创造新的记录。这意味着该方法实际上是查找原始记录而不是创建新记录。但就像我说的,现有的记录只是没有得到更新...... 是的,引用@JesperB 的博客文章-“正如您在官方文档(SQL 所理解的 SQLite)中所见,该命令执行 INSERT OR REPLACE。也就是说,执行 INSERT,并且如果该 INSERT 由于冲突而失败,请在再次 INSERT 之前删除冲突的行。"【参考方案2】:replace()方法实际执行sql命令insert or replace into (...) values (...)
【讨论】:
【参考方案3】: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();
【讨论】:
以上是关于Android SQLite - SQLiteDatabase.replace() 实际上做了啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何在Android设备中用NDK编译SQLite并且对SQLite进行操作
Android 9 上的 android.database.sqlite.SQLiteCantOpenDatabaseException