2017-01-13 8 views
1

レルムを初めて使用しました。私はローカルDBとしてレルムを使用しています。もしアプリケーションが更新されたら、私はデータを失いたくありません。私が以前行ったことアプリケーションを更新するときにレルムからデータを移行する方法

public static Realm getRealmInstanse(){ 


     RealmConfiguration config = new RealmConfiguration 
       .Builder() 
       .deleteRealmIfMigrationNeeded() 
       .build(); 
     try { 
      return Realm.getInstance(config); 
     } catch (RealmMigrationNeededException e){ 
      try { 
       Realm.deleteRealm(config); 
       //Realm file has been deleted. 
       return Realm.getInstance(config); 
      } catch (Exception ex){ 
       throw ex; 
       //No Realm file to remove. 
      } 
     } 
    } 

今、私は次の操作を行うべきだと思うされています

public static Realm getRealmInstanse(){ 
    RealmConfiguration config = new RealmConfiguration 
      .Builder() 
      .migration(new RealmMigration() { 
       @Override 
       public void migrate(DynamicRealm realm, long oldVersion, long newVersion) { 

       } 
      }) 
      .build(); 

     return Realm.getInstance(config); 
} 

私はデータをコピーするために内部移行()メソッドを何をすべき?そして、スキーマはどうですか、私はスキーマのバージョンを使用する必要がありますどのような目的のために?

スキーマを変更するロジックは何ですか?たとえば、何らかの理由で私がdbの構造を変更する場合、migrate()メソッド内のスキーマを変更するだけですか?

私はこの例を見つけたが、それは、データを保存するか、単に私がコピーするために内部移行()メソッドを何をすべき

if (oldVersion == 0) { 
     RealmObjectSchema personSchema = schema.get("Person"); 

     // Combine 'firstName' and 'lastName' in a new field called 'fullName' 
     personSchema 
       .addField("fullName", String.class, FieldAttribute.REQUIRED) 
       .transform(new RealmObjectSchema.Function() { 
        @Override 
        public void apply(DynamicRealmObject obj) { 
         obj.set("fullName", obj.getString("firstName") + " " + obj.getString("lastName")); 
        } 
       }) 
       .removeField("firstName") 
       .removeField("lastName"); 
     oldVersion++; 
    } 

答えて

5

スキーマを変更している場合、私は実際に知りませんデータ?

何も、データが自動的に(提供もdeleteRealmIfMigrationNeeded()をしながら、あなたは、スキーマを変更していない)アプリのアップデートの間に保持されます。

データベーススキーマを変更してdeleteRealmIfMigrationNeeded()に設定すると、新しいスキーマに自動的に移行するためにデータが削除されます。データベース・スキーマを変更し、ないdeleteRealmIfMigrationNeeded()設定されている場合は

は、あなたがRealmMigrationを提供しなければならない、またはアプリが「移行に必要な」例外でクラッシュします。

たとえば、何らかの理由で私がdbの構造を変更した場合、migrate()メソッド内のスキーマを変更できますか?

はい。 @Override public void migrate()に渡されるDynamicRealmと対話して、新しいスキーマバージョンへの移行に必要な変更を指定できます。

レルムにmigration documentationを読んでください。


追記:あなたのコードでやっているようRealmConfigurationを構築インスタンスを要求するたびに行われない必要があります。むしろ、一度、好ましくはApplicationクラスで行います。またconfiguring a realmを参照してください。

+0

私はちょっと寂しかったです。私はrealm repoでgetInstanceを何度も使用していますが、ApplicationではRealm.init(this)のみを使用しています。また、migrate()メソッド内のスキーマを変更すると、自動的にデータが削除されますか?例えばpersonSchema .addField(....) –

+0

多分、私はアプリケーション内でsomwhereを保存し、Realmインスタンスを起動して、アプリケーションの起動時に起動する必要があります。それは働くでしょうか? –

+0

私がリンクしているレルムのウェブサイトのドキュメントを読んでください、それは私ができるよりも優れていることをすべて説明しています –

関連する問題