【问题标题】:How to delete object from Realm Database Android?如何从 Realm Database Android 中删除对象?
【发布时间】:2016-08-12 16:21:56
【问题描述】:

我想从领域中删除所有等于用户 ID 的消息对象

RealmQuery<Message> rowQuery = realm.where(Message.class).equalTo(Message.USER_ID, userId);
realm.beginTransaction();
//TODO : here I want to remove all messages where userId is equal to "9789273498708475"
realm.commitTransaction();

【问题讨论】:

    标签: android database realm


    【解决方案1】:

    在 0.88.3 及以下你可以这样做:

    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            RealmResults<Message> rows = realm.where(Message.class).equalTo(Message.USER_ID,userId).findAll();
            rows.clear();
        }
    });
    

    从 0.89(下一个版本)开始,这将改为 deleteAllFromRealm()

    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            RealmResults<Message> result = realm.where(Message.class).equalTo(Message.USER_ID,userId).findAll();
            result.deleteAllFromRealm();
        }
    });
    

    【讨论】:

    • 仅供参考,如果在已弃用的 .clear() 方法中有注释,.deleteAllFromRealm() 现在是正确的使用方法,那就太好了。
    • @EddieLee 在0.89.0 change log
    • 想象一下我们有另一个模型,它有RealmList&lt;Message&gt;。如果我们以某种方式删除整个Message 行,它是否也会在该模型上删除? (请看stackoverflow.com/questions/49029813/…
    • realm.executeTransaction { var result = realm.where(JsonValidate::class.java).equalTo("Transaction.Number",No).findAll(); result.deleteAllFromRealm() } 我正在使用这个查询来删除,删除工作正常但是,我不能再次添加它说“已经存在”的相同数字如何解决它。注意:我不想要 insertOrUodate 方法
    【解决方案2】:

    这必须在realm.beginTransaction();realm.commitTransaction(); 之间完成,我还在代码示例中列出了几个args()

    realm.beginTransaction();
    MessageObject messageobj = realm.where(Message.class)
                             .findFirst()  //or
                             .greaterThan("age", 10) // implicit AND
                             .beginGroup() //or you can use
                             .equalTo("name", "Peter")
                             .or()
                             .contains("name", "Jo")
                             .endGroup()
                             .findAll();
    messageobj.deleteFromRealm();
    realm.commitTransaction();
    

    【讨论】:

    • removeFromRealm() 必须在写事务中完成(在.beginTransaction().commitTransaction() 之间)
    • 虽然此代码可能会回答问题,但提供有关 如何 和/或 为什么 解决问题的附加 context 将改善答案的长度长期价值。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。提及为什么这个答案比其他答案更合适也没有什么坏处。
    【解决方案3】:

    我就是这样用的

      RealmResults<CartDBItems> rows= realm.where(CartDBItems.class).equalTo("id", id).findAll();;
             rows.deleteAllFromRealm();
    

    【讨论】:

      【解决方案4】:
       myRealm.beginTransaction();
      
           RealmResults<Datos> datos = myRealm.where(DatosCliente.class)
                              .equalTo("folio",FOLIO)
                              .findAll();
      
       datos.deleteAllFromRealm();
      

      【讨论】:

      • 您能否详细说明您的答案并解释此代码的作用?这对未来的访问者会有帮助。
      【解决方案5】:

      适用于 v10 以下领域的 android 用户。下面给出的将正常工作

      realm.executeTransaction(new Realm.Transaction() {
          @Override
          public void execute(Realm realm) {
              RealmResults<Note> result = realm.where(Notes.class).equalTo(Note.NOTE_ID,noteID).findAll();
              result.deleteAllFromRealm();
          }
      });
      

      但是,对于 v10 及更高版本,它会崩溃

      Running transactions on the UI thread has been disabled.
      

      只要您在 v10 之前运行 Realm,如果您从 UI 线程运行执行事务,您的应用就不会崩溃。对于即将发布的 v10 版本,我们将在 RealmConfiguration.Builder 中引入两个新设置,即 allowWritesOnUiThreadallowQueriesOnUiThread,这将允许用户控制是否允许从 UI 线程运行事务和/或查询。

      RealmConfiguration config = new RealmConfiguration.Builder()
        .allowWritesOnUiThread(true)
        .build()
      

      它会像往常一样工作。因此,您可以决定何时/是否要选择新行为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-12
        • 2018-07-11
        • 2016-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-03
        • 1970-01-01
        相关资源
        最近更新 更多