Как выполнить миграцию Realm в Android? - PullRequest
0 голосов
/ 16 мая 2018

Я использую Realms в качестве базы данных в приложении Android.Работает нормально, но я добавил новую метку в мою модель пользователя и получаю сообщение об ошибке, которое необходимо для переноса моей схемы:

java.lang.RuntimeException: Unable to create application com.apelucy.apelucy.app.base.MyApplication: io.realm.exceptions.RealmMigrationNeededException: Migration is required due to the following errors:
                                                   - Property 'User.testRealm' has been added.

Как я могу выполнить миграцию?Я нашел здесь другие решения, но не могу реализовать их в своем коде.Я не могу использовать решение удалить и установить приложение.Сейчас я работаю в разработке, но мне нужно обновить приложение в работе.

Мой класс UserRespository:

public class UserRepository {

    private static UserRepository sInstance = null;
    private Context mContext = null;



    public static UserRepository getInstance(Context context) {
        if (sInstance == null) {
            sInstance = new UserRepository();
            sInstance.mContext = context;
        }

        return sInstance;
    }

    // DATABASE Methods

    public void storeUser(final User user) {
        AppSingleton.getInstance().setUser(user);

        Realm realm = null;
        try {
            realm = Realm.getDefaultInstance();
            realm.executeTransaction(realm1 -> realm1.insertOrUpdate(user));
        } finally {
            if (realm != null) {
                realm.close();
            }
        }
    }

    public User retrieveUser() {
        Realm realm = null;
        User user = null;
        try {
            realm = Realm.getDefaultInstance();
            User userRealmResult = realm.where(User.class)
                    .findFirst();

            if (userRealmResult != null) {
                user = realm.copyFromRealm(userRealmResult);
            }

        } finally {
            if (realm != null) {
                realm.close();
            }
        }

        return user;
    }

    public void clearUser() {
        // Clear Database objects
        Realm realm = null;
        try {
            realm = Realm.getDefaultInstance();
            realm.executeTransaction(realm1 -> realm1.delete(User.class));
        } finally {
            if (realm != null) {
                realm.close();
            }
        }
    }
}

Область init в моем приложении:

Realm.init(this);

Смена модели:

@SerializedName("test")
@Expose
private String testRealm;

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Миграции позволяют изменять схему приложения, что означает, что оно позволяет добавлять, удалять, переименовывать таблицы / поля в схеме Realm.Если вы измените класс RealmModel, то вы должны написать миграцию, которая отобразит существующий файл Realm, чтобы отразить новые классы модели.

RealmConfiguration config = new RealmConfiguration.Builder()
                                 .schemaVersion(1)
                                 .migration(new MyMigration()) 
                                 .build();
Realm.setDefaultConfiguration(config);

Версия схемы по умолчанию - 0.


Миграции довольно просты:

  • вы должны увеличивать версию схемы, поэтому Realm знает, что вы хотите увеличить версию схемы до определенного числа

  • вы должны предоставить миграцию, которая будет обрабатывать переход с одной версии на другую

Миграции описывают операции, которые необходимо выполнить, когда вам нужно перейти с одной версии схемы на другую:

public class MyMigration implements RealmMigration {

    @Override
    public void migrate(final DynamicRealm realm, long oldVersion, long newVersion) {
        RealmSchema schema = realm.getSchema();

        // Migrate from version 0 to version 1
        if (oldVersion == 0) {
            RealmObjectSchema userSchema = schema.get("User");

            userSchema.addField("testRealm", String.class);
            oldVersion++;
        }

        if (oldVersion == 1) { // ...
            // ...
        }
    }

    @Override
    public int hashCode() { return MyMigration.class.hashCode(); }

    @Override
    public boolean equals(Object object) { return object != null && object instanceof MyMigration; }
}

Если вам интересно, как будет выглядеть «более сложная» миграция, - это класс, который автоматически сопоставляет одну схему с другой с помощью отражения , поэтому он содержит практически все, что вам нужнознать (кроме обработки аннотаций @RealmClass(name, @RealmField и @RealmModule(fieldNamingPolicy)

0 голосов
/ 16 мая 2018

Добавьте это в свой файл приложения.Это позволит Realm удалить все, если вы добавите новую таблицу в столбец.

RealmConfiguration config = new RealmConfiguration.Builder().name("dbname.realm")
                                     .deleteRealmIfMigrationNeeded()
                                     .build();
Realm.setDefaultConfiguration(config);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...