2016-09-20 160 views
0

我有领域问题。领域没有取数据

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

当在同一张照片的活动,我保存的照片,以境界并且通过isModified标志为真想来想去,境界在后台服务未采摘的记录。但是,当我销毁应用程序并再次运行它时,服务正在选择这些记录。我不确定在这里做错了什么。

+0

您的后台服务将保留Realm的旧版本,并且永不更新(因为它不与实际循环的活套关联) 。尝试在事务中运行您的服务逻辑。你在后台线程,所以使用'findAll()'。 (不是异步) – EpicPandaForce

+0

我正在使用IntentService,并且每运行5分钟我都会调用wakefulcroadcastreciever。我正在实例化他们自己的Realm实例,在每个方法中我打电话给DB。 – sai

+0

你** ** Realm实例吗?更重要的是,你偶然有'android:process =“:remote”'指定了吗?因为低于最新快照的领域,多进程通知尚未支持 – EpicPandaForce

回答

0

我真的很讨厌推荐这个解决方案,但是您应该在IntentService的Realm实例的Realm.getInstance()之后用包内部方法强制刷新。 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(); 
    } 
} 
+0

真实的是这个类handlerController? – sai

+0

无法访问该类 – sai

+0

“RealmRefresh”包很重要 – EpicPandaForce

1

其工作。感谢您的支持

现在我明白,除非我们正在更新同一线程上的数据,否则不需要关闭领域。 当我们需要访问不同线程中的更改时,我们总是需要关闭领域。 由于后台线程始终需要访问所有对象,因此我们必须在访问数据之前关闭并打开领域。因此,在访问/查询数据之前,我是以@Zhuinden建议的(realm not fetching data) 然后realm.Close()来刷新领域。在此之后,我创建实例(realm = Realm.getDefaultInstance();)

+0

从技术上讲,您需要在执行非循环后台线程时关闭Realm,因为否则会保留较旧版本的Realm,如果它存在很长时间(如果它的存在时间很长,除非你的Realm实例被刷新并因此是最新的,就像循环线程或我为非循环提到的手动刷新一样) – EpicPandaForce