簡體   English   中英

如何在 Android 中進行 Realm 遷移?

[英]How to do a Realm migration in Android?

我在 Android 應用程序中使用 Realms 作為數據庫。 工作正常,但我在我的用戶模型中添加了一個新標簽,但出現了我需要遷移架構的錯誤:

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();
            }
        }
    }
}

在我的應用程序中初始化領域:

Realm.init(this);

我的模型變化:

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

遷移允許您修改應用程序的架構,這意味着它允許您添加、刪除、重命名 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; }
}

將此添加到您的應用程序文件中。 如果您向列添加新表,這將使 Realm 刪除所有內容。

RealmConfiguration config = new RealmConfiguration.Builder().name("dbname.realm")
                                     .deleteRealmIfMigrationNeeded()
                                     .build();
Realm.setDefaultConfiguration(config);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM