1
因此,最近我遇到了一個如何遷移Realm中的東西的巨大問題。我終於解決了這個問題,所以我決定將它發佈到stackoverflow上。請注意,Realm很快就會升級他們的系統,所以答案可能很快就會過時。如何在Android中遷移Realm
該代碼適用於領域80.3。
因此,最近我遇到了一個如何遷移Realm中的東西的巨大問題。我終於解決了這個問題,所以我決定將它發佈到stackoverflow上。請注意,Realm很快就會升級他們的系統,所以答案可能很快就會過時。如何在Android中遷移Realm
該代碼適用於領域80.3。
這是我使用的代碼:
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;
}
});
}
這讓我爲那個境界希望你提供的完整路徑數據庫文件的事情。
希望這篇文章能幫助別人!
下面的類可以幫助你遷移境界數據庫表(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++;
}
}
}
注意你也可以使用RealmMigrationNeededException.getPath()來獲取王國文件正確的路徑。 –
@ChristianMelchior謝謝!我不知道。 – Nathan
爲什麼我需要提供另一個數據庫,如果我只想將一個新列添加到現有表中? – ChaturaM