Android 从另一个线程读取RealmObject

Android 从另一个线程读取RealmObject,android,realm,Android,Realm,我有一个RealmObjectUser,我将它存储在一个单例中,并在整个应用程序中访问它——它是在UI线程上检索的。该对象表示登录的用户,并且与项类具有一对多关系。在事务中更改时,例如: RealmSingleton.getUserInstance().executeTransactionAsync(new Realm.Transaction() { @Override public void execute(Realm realm) { User user =

我有一个
RealmObject
User
,我将它存储在一个单例中,并在整个应用程序中访问它——它是在UI线程上检索的。该对象表示登录的用户,并且与
类具有一对多关系。在事务中更改时,例如:

RealmSingleton.getUserInstance().executeTransactionAsync(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        User user = realm.where(User.class).equalTo("mId",UserSingleton.getUser().getId()).findFirst();
        user.deleteItem(mItem.getClassId());
    }
});
这将不起作用,因为我正在另一个线程中发生的事务中访问它。只是为了澄清一下,我需要在这里做的是将用户id存储在事务之外,然后在进行查询时访问事务中存储的变量,就像这样

Integer userId = UserSingleton.getUser().getId();
Integer classId = mItem.getClassId();
RealmSingleton.getUserInstance().executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            User user = realm.where(User.class).equalTo("mId",userId).findFirst();
            user.deleteItem(classId);
        }
    });

是的,没错。您无法在多个线程上访问对象,因此在您的情况下,存储对ID的引用并使用该引用重新查询对象是正确的方法。

听起来不错,尽管我确实对
deleteItem
@EpicPandaForce的实现感到好奇,但它只是一个循环,循环遍历
用户的
项目
列表,直到找到一个具有匹配类id的项目,当找到匹配项时,它调用
RealmList.deleteItemAt
——就是这样。啊,是这样吗?虽然我更喜欢获取元素并对其调用
deleteFromRealm
,但它应该可以工作。多奇怪的问题啊。