领域没有获取数据

时间:2016-09-20 17:28:14

标签: java android realm

我在使用领域时遇到了问题。

findAll和findAllAsync不会从领域返回任何数据。

我正在从主线程更新领域对象。

public void updatePhoto(final int ticketID) {
    realm.beginTransaction();
    RealmResults ticketPhotos =  realm.where(TicketPhoto.class).equalTo("TicketID", ticketID).findAll();`           
    for (TicketPhoto ticketPhoto : ticketPhotos) { 
        ticketPhoto.IsModified = true;
    }
    realm.commitTransaction(); 
} '$'

同时,一个后台服务每五分钟运行一次,并不断检查IsModified标志为true的任何对象。从我的后台服务(IntentService),我使用AsyncTask和doInBackground,我试图获取那些IsModified记录,我假设领域应该选择那些记录并更新我的服务器。使用以下代码从领域获取数据。

public RealmResults getTicketPhotosToSave (){
    return realm.where(TicketPhoto.class)
           .equalTo("IsModified", true)
           .findAll(); 
}

当我仍处于相同的Photo活动中,我将照片保存到领域时,IsModified标志为true,后台服务中的领域不会选择这些记录。但是,当我销毁应用程序并再次运行它时,服务现在正在挑选那些记录。我不确定这里是否做错了。

2 个答案:

答案 0 :(得分:1)

它的工作。感谢您的支持

现在我明白了,除非我们在同一个线程上更新数据,否则不需要关闭领域。 当我们需要访问不同线程中的那些更改时,我们总是需要关闭域。 由于后台线程总是需要访问所有对象,因此我们必须在访问数据之前关闭并打开域。

所以在访问/查询数据之前,我正在刷新领域,因为@Zhuinden建议(realm not fetching data) 然后是realm.Close()。在此之后我创建实例(realm = Realm.getDefaultInstance();)

答案 1 :(得分:0)

我真的很讨厌推荐这个解决方案,但是你应该在IntentService的Realm实例上强制使用Realm.getInstance()之后的package-internal方法进行刷新。 This current solution I provide works for v1.2.0.仅在后台线程上使用它(主要是您定期运行的方法)。

package io.realm; // <---- this is important 

public class RealmRefresh {
    public static void refreshRealm(Realm realm) {
        Message message = Message.obtain();
        msg.what = HandlerControllerConstants.LOCAL_COMMIT;
        realm.handlerController.handleMessage(msg);
    }
}

然后致电

try {
    mRealm = Realm.getDefaultInstance();
    RealmRefresh.refreshRealm(mRealm);
    // do things
} finally {
    if(mRealm != null) {
        mRealm.close();
    }
}