如何在安卓中从Realm数据库中删除对象?

48

我想从 Realm 中删除所有与用户 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();
5个回答

123

在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();
    }
});

7
提醒一下,如果在弃用的 .clear() 方法中加入注释说明 .deleteAllFromRealm() 是现在应该使用的正确方法会很好。 - Ed Lee
2
@EddieLee 这在 0.89.0 变更日志 中。 - EpicPandaForce
想象一下我们有另一个模型,它具有 RealmList<Message>。如果我们以某种方式删除了整个 Message 行,那么它是否也会在该模型上被删除?(请参阅 https://stackoverflow.com/questions/49029813/realm-the-size-of-filled-realmlist-in-realmobject-is-zero) - Dr.jacky
realm.executeTransaction { var result = realm.where(JsonValidate::class.java).equalTo("Transaction.Number", No).findAll(); result.deleteAllFromRealm() } 我正在使用此查询进行删除,删除功能良好,但是我无法再次添加相同的编号,它会显示“已存在”。 如何解决。 注意:我不想使用insertOrUodate方法。 - Mani

11

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();

1
removeFromRealm() 必须在写事务中执行(在 .beginTransaction().commitTransaction() 之间)。 - muazhud
虽然这段代码可能回答了问题,但提供有关它如何解决问题以及/或为什么解决问题的附加上下文将改善答案的长期价值。请记住,您正在为未来的读者回答问题,而不仅仅是现在提问的人!请编辑您的答案以添加说明,并指出适用的限制和假设。此外,提到为什么此答案比其他答案更合适也没有坏处。 - Dev-iL

4

这是我如何使用它

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

2
对于 Android v10 以下的用户,以下内容可正常使用。
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.

如果您在UI线程上运行Realm事务,那么只要您在v10版本之前运行Realm,您的应用程序就不会崩溃。对于即将推出的v10版本,我们在RealmConfiguration.Builder中引入了两个新设置,即allowWritesOnUiThreadallowQueriesOnUiThread,这将允许用户控制是否允许从UI线程运行事务和/或查询。
RealmConfiguration config = new RealmConfiguration.Builder()
  .allowWritesOnUiThread(true)
  .build()

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


1
 myRealm.beginTransaction();

     RealmResults<Datos> datos = myRealm.where(DatosCliente.class)
                        .equalTo("folio",FOLIO)
                        .findAll();

 datos.deleteAllFromRealm();

你能否详细阐述一下你的答案并解释一下这段代码的作用?这对于未来的访问者会很有帮助。 - Uwe Plonus

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