Android内容提供程序 - 在插入方法中进行更新

11

在内容提供程序的insert()覆盖方法中调用SQLiteDatabase的更新方法是否可以?

2个回答

26

基本上没问题,但由于你没有提供代码,我只能给出两种可能的解决方法

第一种:

// In your content provider
public Uri insert(...) {
    long insertId = db.insert(...);

    if(insertId == -1) {
        // insert failed, do update
        db.update(...);
    }
}

其次:

public Uri insert(...) {
    long insertId = db.insertWithOnConflict(table, null, values, SQLiteDatabase.CONFLICT_REPLACE)

    if(insertId == -1) {
        // insert and update/replace failed
    }
}

查看SQLiteDatabase的参考文档,了解第四个参数。在大多数情况下,最后一个方法应该足够使用,除非你只想更新某些字段,如果该行存在,则只更新这些特定的字段,否则更新所有字段。

insertWithOnConflict 的最常见用途可能是,您可以插入一行数据,如果该行已经存在,则忽略插入并返回已存在行的 Uri/主键。


5

在你重写的方法中写什么取决于你的选择。所以,没问题。

我不知道你想做什么,但你可能需要看一下SQLiteDatabasereplace()方法。也许它更适合你的需求。


好的,我的问题是我需要检查是否存在一行数据,在该行中列A具有特定的值(A不是唯一键)。如果是,则需要更新此行。 - Mak
1
你有两种方法可以做到这一点:1.替换(如果行不存在,则插入它;如果存在,则删除它并插入新的);2.尝试插入行...如果不成功(意味着该行已经存在),则更新它。因此,如果您需要从旧行中获取某些内容(例如某个列值),请使用插入+更新。如果不需要,请使用替换(您将失去旧行中的所有数据)。 - Edi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接