Nano Hash - криптовалюты, майнинг, программирование

Как работает удаление в мире с отношениями?

у меня есть эти классы

class Student extends RealmObject {
    public String code;
    public String name;
    public String email;
    public Course course;
}

class Course extends RealmObject {
    public String code;
    public String name;
}

class Sync {
    // ...
    // To sync data I am using retrofit, look the method to update course
    public void onResponse(Call<...> call, Response<...> response) {
        if (response.isSuccessful()) {
            realm.executeTransactionAsync(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
                    realm.delete(Course.class);
                    realm.copyToRealm(response.body());
                }
            });
        }
    }
}

После вызова Sync для обновления курсов все объекты Student имеют значение null для курса, это ожидаемое поведение после вызова удаления области? Даже после того, как таблица снова заполнена, курс Student по-прежнему равен нулю.

Сегодня я сделал это изменение в коде:

class Course extends RealmObject {
    @PrimaryKey
    public String code;
    public String name;
}

class Sync {
    // ...
    // To sync data I am using retrofit, look the method to update course
    public void onResponse(Call<...> call, Response<...> response) {
        if (response.isSuccessful()) {
            realm.executeTransactionAsync(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
                    realm.copyToRealmOrUpdate(response.body());
                }
            });
        }
    }
}

Я сделал это слишком поздно, чтобы избежать удаления курсов.

Есть ли что-то, что я могу сделать, чтобы восстановить эталонные курсы и снова установить их для студентов?

Спасибо.

29.11.2016

Ответы:


1

Это ожидаемое поведение, поскольку вы делаете недействительными ссылки на объекты, удаляя объекты, на которые указываете.

Чтобы восстановить их, вам придется снова установить ссылки.


Другим решением было бы не удалять курсы, которые вам все еще нужны. Это будет сделано, если вы аннотируете code с помощью @PrimaryKey, таким образом, вы «обновите» курсы, которые уже есть. Тогда проблема будет заключаться в удалении курсов/студентов больше не в ответе, а для этого есть готовые решения.

public class Robject extends RealmObject {
    @PrimaryKey
    private String code;

    @Index
    private String name;

    //...

    @Index
    private boolean isBeingSaved;

    //getters, setters
}

А также

// background thread
Realm realm = null;
try {
    realm = Realm.getDefaultInstance();
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            Robject robject = new Robject();
            for(Some some : somethings) {
                robject.set(some....);
                realm.insertOrUpdate(robject);
            }
            realm.where(Robject.class)
                 .equalTo(Robject.IS_BEING_SAVED, false) // compile 'dk.ilios:realmfieldnameshelper:1.1.0'
                 .findAll()
                 .deleteAllFromRealm(); // delete all non-saved data
            for(Robject robject : realm.where(Robject.class).findAll()) { // realm 0.89.0+
                robject.setIsBeingSaved(false); // reset all save state
            }
        }
    });
} finally {
    if(realm != null) {
        realm.close();
    }
}
29.11.2016
  • Спасибо. Я думал, что Realm сохраняет какой-то идентификатор в Student даже после удаления курса. И ссылки могут быть восстановлены после повторного заполнения таблицы. Я следую вашим советам по использованию аннотации @PrimaryKey и теперь избегаю удаления объекта из области. Я закрою это как решенное. 29.11.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..