如何从 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<Message>
。如果我们以某种方式删除整个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
中引入两个新设置,即 allowWritesOnUiThread
和 allowQueriesOnUiThread
,这将允许用户控制是否允许从 UI 线程运行事务和/或查询。
RealmConfiguration config = new RealmConfiguration.Builder()
.allowWritesOnUiThread(true)
.build()
它会像往常一样工作。因此,您可以决定何时/是否要选择新行为。
【讨论】:
以上是关于如何从 Realm Database Android 中删除对象?的主要内容,如果未能解决你的问题,请参考以下文章
React Native Realm 数据库:如何从写入命令返回承诺?
Swift + Realm:如何从 collection.find 的范围内更改外部变量
如何使用 Realm 和 UICollectionView 防止 NSInternalInconsistencyException