2015-06-16 83 views
1

因此,最近我遇到了一個如何遷移Realm中的東西的巨大問題。我終於解決了這個問題,所以我決定將它發佈到stackoverflow上。請注意,Realm很快就會升級他們的系統,所以答案可能很快就會過時。如何在Android中遷移Realm

該代碼適用於領域80.3。

回答

2

這是我使用的代碼:

try { 
    realm = Realm.getInstance(context, "database.realm"); 
    Log.i("Database2", context.getFilesDir().getPath()); 
} catch (RealmMigrationNeededException ex) { 
    Realm.migrateRealmAtPath(context.getFileStreamPath("database.realm").getPath(), new RealmMigration() { 
     @Override 
     public long execute(Realm realm, long version) { 
      Log.i("Database", "Yay!"); 
      // Migrate stuff... 
      Table table = realm.getTable(RealmTestObjectTwo.class); 
      table.addColumn(ColumnType.INTEGER, "key"); 
      table.addColumn(ColumnType.STRING, "value"); 
      table.setPrimaryKey("key"); 
      version += 1; 
      // End Migrate Stuff... 
      return version; 
     } 
    }); 
} 

這讓我爲那個境界希望你提供的完整路徑數據庫文件的事情。

希望這篇文章能幫助別人!

+1

注意你也可以使用RealmMigrationNeededException.getPath()來獲取王國文件正確的路徑。 –

+0

@ChristianMelchior謝謝!我不知道。 – Nathan

+0

爲什麼我需要提供另一個數據庫,如果我只想將一個新列添加到現有表中? – ChaturaM

0

下面的類可以幫助你遷移境界數據庫表(0.86.0+)

public class Migration 
     implements RealmMigration { 
    @Override 
    public void migrate(final DynamicRealm realm, long oldVersion, long newVersion) { 
     Log.e("TAG", oldVersion + "-" + newVersion); 
     RealmSchema realmSchema = realm.getSchema(); 
     if(oldVersion == 0) { 
      realmSchema.get("FestivalModel").addField("timestamp", Long.class, FieldAttribute.REQUIRED); 
      oldVersion++; 
     } 
     if(oldVersion == 1) { 
      //add new fields - match_image,lineup_image,festival_end_date,isMatchedFestival 
      RealmObjectSchema festivalscema = realmSchema.get("FestivalModel"); 

      List<String> list = new ArrayList<>(festivalscema.getFieldNames()); 
      Log.e("Fields", list.toString()); 
      festivalscema 
        .addField("isMatchedFestival", Integer.class, FieldAttribute.REQUIRED) 
        .addField("match_image", String.class) 
        .addField("lineup_image", String.class) 
        .addField("festival_end_date", String.class) 

        .transform(new RealmObjectSchema.Function() { 
         @Override 
         public void apply(DynamicRealmObject obj) { 
          //obj.set("isMatchedFestival", "1"); 
          DynamicRealmObject festivalModel = realm.createObject("FestivalModel"); 
          festivalModel.setInt("name", 1); 

         } 
        }); 

      // Create a new class - ArtistFestivalModel 
      RealmObjectSchema artistFestivalModelSchema = realmSchema.create("ArtistFestivalModel") 
        .addField("id", String.class, FieldAttribute.PRIMARY_KEY) 
        .addField("name", String.class) 
        .addField("description", String.class) 
        .addField("profile_image", String.class) 
        .addField("match_image", String.class) 
        .addField("lineup_image", String.class) 
        .addField("festival_date", String.class) 
        .addField("festival_end_date", String.class) 
        .addField("official_url", String.class) 
        .addField("address", String.class) 
        .addField("latitude", Double.class, FieldAttribute.REQUIRED) 
        .addField("longitude", Double.class, FieldAttribute.REQUIRED) 
        .addField("created_date", String.class) 
        .addField("modified_date", String.class) 
        .addField("is_deleted", String.class) 
        .addField("timestamp", Long.class, FieldAttribute.REQUIRED); 

      // Create a new class - ArtistFestivalModel 
      RealmObjectSchema festivalLineupSchema = realmSchema.create("FestivalLineup") 
        .addField("id", String.class, FieldAttribute.PRIMARY_KEY) 
        .addField("name", String.class) 
        .addField("profile_image", String.class) 
        .addField("official_url", String.class) 
        .addField("created_date", String.class) 
        .addField("modified_date", String.class) 
        .addField("is_deleted", String.class) 
        .addField("lineup", String.class) 
        .addField("FestivalId", String.class) 
        .addField("is_liked", Boolean.class, FieldAttribute.REQUIRED); 

      /** 1st uploaded version with 0 
      * 2nd uploaded version with 1 
      * 3rd uploaded version with 19 
      */ 
      oldVersion = 19; 
     } 
     if(oldVersion == 20) { 
      //add new fields - match_image,lineup_image,festival_end_date,isMatchedFestival 
      RealmObjectSchema festivalscema = realmSchema.get("FestivalModel"); 
      List<String> list = new ArrayList<>(festivalscema.getFieldNames()); 
      Log.e("Fields", list.toString()); 
      festivalscema 
        .addField("isMatchedFestival", Integer.class, FieldAttribute.REQUIRED) 
        .addField("match_image", String.class) 
        .addField("lineup_image", String.class) 
        .addField("festival_end_date", String.class) 
        .transform(new RealmObjectSchema.Function() { 
         @Override 
         public void apply(DynamicRealmObject obj) { 
          //obj.set("isMatchedFestival", "1"); 
          DynamicRealmObject festivalModel = realm.createObject("FestivalModel"); 
          festivalModel.setInt("name", 1); 
         } 
        }); 

      // Create a new class - ArtistFestivalModel 

      RealmObjectSchema artistFestivalModelSchema = realmSchema.create("ArtistFestivalModel") 
        .addField("id", String.class, FieldAttribute.PRIMARY_KEY) 
        .addField("name", String.class) 
        .addField("description", String.class) 
        .addField("profile_image", String.class) 
        .addField("match_image", String.class) 
        .addField("lineup_image", String.class) 
        .addField("festival_date", String.class) 
        .addField("festival_end_date", String.class) 
        .addField("official_url", String.class) 
        .addField("address", String.class) 
        .addField("latitude", Double.class, FieldAttribute.REQUIRED) 
        .addField("longitude", Double.class, FieldAttribute.REQUIRED) 
        .addField("created_date", String.class) 
        .addField("modified_date", String.class) 
        .addField("is_deleted", String.class) 
        .addField("timestamp", Long.class, FieldAttribute.REQUIRED); 

      // Create a new class - ArtistFestivalModel 

      RealmObjectSchema festivalLineupSchema = realmSchema.create("FestivalLineup") 
        .addField("id", String.class, FieldAttribute.PRIMARY_KEY) 
        .addField("name", String.class) 
        .addField("profile_image", String.class) 
        .addField("official_url", String.class) 
        .addField("created_date", String.class) 
        .addField("modified_date", String.class) 
        .addField("is_deleted", String.class) 
        .addField("lineup", String.class) 
        .addField("FestivalId", String.class) 
        .addField("is_liked", Boolean.class, FieldAttribute.REQUIRED); 

      /** 1st uploaded version with 0 
      * 2nd uploaded version with 1 
      * 3rd uploaded version with 19 
      */ 
      oldVersion++; 
     } 
    } 
}