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() 方法中同时使用INSERTREPLACE 过程。我在这里写了一篇关于它的博客文章: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 SQLite详解

如何在Android设备中用NDK编译SQLite并且对SQLite进行操作

Android--SQLite应用

反应原生 - SQLite - Android

Android 9 上的 android.database.sqlite.SQLiteCantOpenDatabaseException

Android开发之利用SQLite进行数据存储