【问题标题】:Android Contentprovider - update within an insert methodAndroid Contentprovider - 在插入方法中更新
【发布时间】:2015-04-25 19:00:16
【问题描述】:

内容提供者的insert()重写方法中调用SQLiteDatabase更新方法可以吗?

【问题讨论】:

    标签: android android-contentprovider


    【解决方案1】:

    基本上没问题,但是由于您没有提供代码,我只能发布两种可能的方法

    第一:

    // 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/主键。

    【讨论】:

      【解决方案2】:

      您可以选择在覆盖的方法中写入什么内容。 所以是的,没关系。

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

      【讨论】:

      • 好的,我的问题是我需要检查是否存在 A 列中具有特定值的行(A 不是唯一键)。如果是,我需要更新这一行。
      • 您有两种方法可以做到这一点: 1. 替换(如果该行不存在,则插入该行;如果存在,则删除该行并插入新行); 2.尝试插入行...如果不成功(意味着该行已经存在),更新它。因此,如果您需要旧行中的某些内容(例如某个列值),请使用插入+更新。如果没有,请使用替换(您将丢失旧行中的所有数据)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      • 1970-01-01
      相关资源
      最近更新 更多