我遇到了数据丢失的问题。
基本上,我从类中保存了一些数据,然后我调用了一个API,在响应中我需要保存的数据用于解析。
问题在于,当我检索保存在领域中的数据(实际保存,我在调试中检查)时,它什么也没有返回,所以有些东西正在删除它。
奇怪的是,这只是在我第一次保存这些数据时才添加,当没有保存这些模型时,我也没有办法删除这些数据
这是我在AsynkTask结尾处保存数据并调用API的地方:
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
realm.copyToRealmOrUpdate(mContacts);
realm.commitTransaction();
mContacts = DaoContacts.getAllContactsSortedAsList();
mDataChangeCallback.onDataSetChanged();
PojoRequestCheckNumbers numbers = new PojoRequestCheckNumbers();
for (int i = 0; i < mContacts.size(); i++) {
for (ModelNumber n : mContacts.get(i).getNumbers()) {
numbers.addNumber(n.getNumber());
}
}
if (numbers.size() > 0)
ApiManager.checkNumbers(new RequestCheckContacts(this, numbers));
mLoadCallback.onPostContactsLoad();
}
这是我从领域加载数据的地方,它在API调用的响应中(在此我也因其他原因生成哈希映射,但是hashmap也是空的,因为它是从联系人生成的。
JSONArray jsonNumbers = responseJson.getJSONArray(NUMBERS_FIELD);
ArrayList<ModelContact> contacts = DaoContacts.getAllContactsSortedAsList();
Map numberMap = new HashMap<String, Long>();
for (ModelContact m : contacts) {
for (ModelNumber s : m.getNumbers()) {
numberMap.put(s.getNumber(), m.get_ID());
}
}
在此之后,当我尝试从hashmap检索数据时出现错误,因为它显然是空的。
try {
//TODO: check why null
long contact_id = (long) numberMap.get(jsonNumbers.getString(i)); <-- ERROR
for (ModelContact mc : contacts) {
if (mc.get_ID() == contact_id) {
for (ModelNumber n : mc.getNumbers()) {
if (jsonNumbers.getString(i).equals(n.getNumber())) {
realm.beginTransaction();
n.setHasApp(true);
realm.commitTransaction();
}
}
}
}
} catch (NullPointerException e) {
e.printStackTrace();
}
编辑1:
这是我使用的Dao功能:
public static ArrayList<ModelContact> getAllContactsSortedAsList() {
return new ArrayList<>(getAllContactsSorted());
}
public static RealmResults<ModelContact> getAllContactsSorted(){
return Realm.getDefaultInstance().where(ModelContact.class).findAllSorted(ModelContact.NAME_NORMALIZED, Sort.ASCENDING);
}
编辑2:
当我第一次打开应用程序,当应用程序从未在Realm中保存此模型数据时,这一切都发生了(请记住,当我收到错误时,我的ModelContact的Realm应包含数据,因为我已经在调用API之前保存了所有数据,并且一直发生,直到我重新启动应用程序。 一旦我重新启动应用程序,(现在我的ModelContact中的数据已经存在),一切正常。