Элементы царства удаляются после запроса - PullRequest
0 голосов
/ 04 февраля 2020

Я создаю приложение 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, использующие то же управление, но у них, похоже, нет этой проблемы.

...