2015-06-21 74 views
2

我有一种情况,我想以懒惰的方式处理领域迁移。我不想使用领域开发人员状态繁琐的Realm Migration API,而是想删除领域实例,然后仅在需要执行迁移时重新实例化它。如何正确处理这种情况,以便只在需要升级时才删除并重新实例化数据库?如何正确处理领域实例删除

说我有一个模型

@RealmClass 
public class testmodel extends RealmObject { 
    private String foo; 
    private int bar; 
    public int getBar() { 
     return bar; 
    } 

    public void setBar(int bar) { 
     this.bar = bar; 
    } 


    public String getFoo() { 
     return foo; 
    } 

    public void setFoo(String foo) { 
     this.foo = foo; 
    } 
} 

,我想另一个字符串bazz加入到与适当的getter和setter模型。

目前,只要我第一次实例化领域,我就可以做到这一点,我删除它。像这样:

Realm.deleteRealmFile(getApplicationContext()); 
    realm = Realm.getInstance(getApplicationContext()); 

现在,让我们假设我不想去每一个应用程序启动时吹了我的数据,但还是想做到这一点的情况下,当我需要。我认为一个好方法就是这样。

try{ 
    Log.d(TAG, "started realm creation"); 
    realm = Realm.getInstance(getApplicationContext()); 
    Log.d(TAG, "successfully created realm"); 
} 
catch (RealmException e){ // I tried RealmMigrationNeededException and IllegalState Exception but neither are caught 
    Log.d(TAG, "try deleting realm"); 
    Realm.deleteRealmFile(getApplicationContext()); 
    realm = Realm.getInstance(getApplicationContext()); 
    Log.d(TAG, "deleted realm and remade successfully"); 
} 

但是,当我尝试这个而不是被捕获的异常,我的应用程序崩溃。 我该如何正确处理这种情况,以便只在需要升级时才删除并重新实例化数据库?

回答

2

在境界0.81.0您可以使用新的RealmConfiguration对象:

RealmConfiguration realmConfig = new RealmConfiguration.Builder(context) 
    .schemaVersion(42) 
    .deleteRealmIfMigrationNeeded() 
    .build(); 

这将不正是你所期待的。

编辑:

JavaDoc的是在这里:https://realm.io/docs/java/latest/api/io/realm/RealmConfiguration.Builder.html

而且你可以阅读更多有关的设置在这里: https://realm.io/docs/java/latest/#configuring-a-realm

+0

你选择的架构版本42,因为它是一切问题的答案? –

+1

是的,在你的情况下,只要你改变你的模型类,你可能只想碰撞该版本:) –

+0

为什么不在文档中?从什么时候开始0.81? –