2015-06-21 57 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? –