Я создаю приложение Andorid, которое поддерживает только одну учетную запись. Я использую Realm в качестве менеджера данных. Чтобы сделать это после того, как пользователь создает новую учетную запись, я удаляю все мои Profile
объекты и вставляю новый. Код, который я использую для этого, следующий:
ProfileService. java
public void registerProfile(Profile profile)
{
dao.clear();
dao.insert(profile);
}
Дао
public void registerProfile(Profile profile)
{
dao.clear();
dao.insert(profile);
}
public void insert(Profile identity)
{
...
IdentityProfileDTO dto = IdentityProfileMapper.getInstance().toDTO(identity);
try (Realm realmInstance = Realm.getDefaultInstance()) {
RealmTransactions.insertOrUpdate(dto, realmInstance);
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
}
}
@Override
public void clear()
{
RealmTransactions.deleteAllOfType(IdentityProfileDTO.class);
}
Здесь я сопоставляю свои бизнес-объекты с RealmObjects
, так как этот модуль используется некоторыми приложениями, и не все из них используют / требуют одинаковую информацию, но им требуется одна и та же БД, только объект toDTO
создает новый RealmObject
с переданными данными.
затем мои RealmTransactions. java
public static void insertOrUpdate(@NotNull RealmObject dto,
@NotNull Realm realmInstance)
{
try {
realmInstance.beginTransaction();
realmInstance.copyToRealmOrUpdate(dto);
realmInstance.commitTransaction();
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
realmInstance.cancelTransaction();
}
}
public static <E extends RealmObject> void deleteAllOfType(@NotNull final Class<E> classType)
{
try (Realm realmInstance = Realm.getDefaultInstance()) {
realmInstance.executeTransaction(new Realm.Transaction()
{
@Override
public void execute(@NotNull Realm realm)
{
realm.delete(classtype);
}
});
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
}
}
Теперь моя проблема заключается в том, что после завершения регистрации данные хранится, я проверил в файле области, я go вернулся к своей основной деятельности и могу получить данные. Однако в следующий раз, когда я пытаюсь получить данные, я всегда получаю пустые результаты. Я проверил свои данные с помощью обозревателя Realm и Stetho, и похоже, что после завершения первого findAll()
данные удаляются, я также проверил вызовы моего класса транзакций, и методы удаления никогда не вызываются неожиданно. Я не уверен, имеет ли проблема то, как я управляю данными.
Это метод выборки, который я использую
public static <T, E extends RealmObject> List<T> selectAll(Class<E> classType,
DataProviderModelMapper<E, T> mapper)
{
try (Realm realmInstance = Realm.getDefaultInstance()) {
RealmResults<E> results = realmInstance.where(classType).findAll();
return mapper.toPOJOList(results);
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
return new ArrayList<>();
}
}
Сопоставление также не является проблемой, так как я проверил метод, и RealmResults
всегда пусто до сопоставления данных с моим бизнес-объекты. Кстати, я выполняю вызовы методов в AsyncTasks
. У меня есть другие классы, управляемые Realm, использующие то же управление, но у них, похоже, нет этой проблемы.