如何从 Realm Database Android 中删除对象?

Posted

技术标签:

【中文标题】如何从 Realm Database Android 中删除对象?【英文标题】:How to delete object from 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();

【问题讨论】:

【参考方案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 行,它是否也会在该模型上删除? (请看***.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()

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

【讨论】:

以上是关于如何从 Realm Database Android 中删除对象?的主要内容,如果未能解决你的问题,请参考以下文章

React Native Realm 数据库:如何从写入命令返回承诺?

Swift + Realm:如何从 collection.find 的范围内更改外部变量

如何使用 Realm 和 UICollectionView 防止 NSInternalInconsistencyException

如何从 SwiftUI 和 Realm 中另一个列表中的对象中添加和删除列表中的对象

如何在 Swift 中的 Realm.io 中做抽象实体

如何将 Realm 与 Relay/GraphQL 一起使用