【问题标题】:I am getting Migration error whenever i am creating a new Realm class?每当我创建一个新的领域类时,我都会收到迁移错误?
【发布时间】:2018-06-08 19:44:39
【问题描述】:

我创建了一个扩展 RealmObject 的类,每当我尝试运行该类时,我都会得到如下的 runTime 异常:

06-09 00:58:16.333 30719-30719/com.khaalijeb.inkdrops E/AndroidRuntime: 致命异常: main 进程:com.khaalijeb.inkdrops,PID:30719 io.realm.exceptions.RealmMigrationNeededException:由于以下错误,需要迁移: - 添加了“transactionacknowledgedata”类。 在 io.realm.internal.OsSharedRealm.nativeGetSharedRealm(本机方法) 在 io.realm.internal.OsSharedRealm.(OsSharedRealm.java:171) 在 io.realm.internal.OsSharedRealm.getInstance(OsSharedRealm.java:241) 在 io.realm.BaseRealm.(BaseRealm.java:136) 在 io.realm.BaseRealm.(BaseRealm.java:105) 在 io.realm.Realm.(Realm.java:164) 在 io.realm.Realm.createInstance(Realm.java:435) 在 io.realm.RealmCache.doCreateRealmOrGetFromCache(RealmCache.java:342) 在 io.realm.RealmCache.createRealmOrGetFromCache(RealmCache.java:282) 在 io.realm.Realm.getDefaultInstance(Realm.java:343) 在 com.khaalijeb.inkdrops.Fragment.NewPendingFragment.onCreate(NewPendingFragment.java:147) 在 android.support.v4.app.Fragment.performCreate(Fragment.java:2236) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1285) 在 android.support.v4.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1085) 在 android.support.v4.app.FragmentTransition.calculateFragments(FragmentTransition.java:976) 在 android.support.v4.app.FragmentTransition.startTransitions(FragmentTransition.java:95) 在 android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2198) 在 android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2155) 在 android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2034) 在 android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:626) 在 android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143) 在 android.support.v4.view.ViewPager.populate(ViewPager.java:1268) 在 android.support.v4.view.ViewPager.populate(ViewPager.java:1116) 在 android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1642) 在 android.view.View.measure(View.java:23167) 在 android.widget.RelativeLayout.measureChildHorizo​​ntal(RelativeLayout.java:715) 在 android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461) 在 android.view.View.measure(View.java:23167) 在 android.widget.RelativeLayout.measureChildHorizo​​ntal(RelativeLayout.java:715) 在 android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461) 在 android.view.View.measure(View.java:23167) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 在 android.view.View.measure(View.java:23167) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 在 android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139) 在 android.view.View.measure(View.java:23167) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749) 在 android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535) 在 android.widget.LinearLayout.measureVertical(LinearLayout.java:825) 在 android.widget.LinearLayout.onMeasure(LinearLayout.java:704) 在 android.view.View.measure(View.java:23167) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 在 android.view.View.measure(View.java:23167) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749) 在 android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535) 在 android.widget.LinearLayout.measureVertical(LinearLayout.java:825) 在 android.widget.LinearLayout.onMeasure(LinearLayout.java:704) 在 android.view.View.measure(View.java:23167) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 在 com.android.internal.policy.DecorView.onMeasure(DecorView.java:716) 06-09 00:58:16.334 30719-30719/com.khaalijeb.inkdrops E/AndroidRuntime:在 android.view.View.measure(View.java:23167) 在 android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2693) 在 android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1559) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1830) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1447) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7130) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:935) 在 android.view.Choreographer.doCallbacks(Choreographer.java:747) 在 android.view.Choreographer.doFrame(Choreographer.java:682) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:921) 在 android.os.Handler.handleCallback(Handler.java:873) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:193) 在 android.app.ActivityThread.main(ActivityThread.java:6642) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

我不知道为什么会收到此错误。有人遇到过这个问题吗?

【问题讨论】:

标签: android realm


【解决方案1】:

记得在 SQLite 中你想添加一个表,所以你必须这样做:

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    int currentVersion = oldVersion;
    if(currentVersion == 1) {
        db.execSql("CREATE TABLE Blah(personId int, name varchar(255))");
        currentVersion++;
    }
    ...
}

等等?

Realm 不是 SQLite,但它仍然需要您修改架构以添加新的模型类并应用您想要的架构更改。

因此您需要定义一个迁移 (see this whole section about it in the docs) 来处理架构版本从 X 到 Y 的更改。


所以你创建了一个迁移:

public class Migration implements RealmMigration {

    @Override
    public void migrate(final DynamicRealm realm, long oldVersion, long newVersion) {
        ...
    }

    @Override
    public int hashCode() { return Migration.class.hashCode(); }

    @Override
    public boolean equals(Object obj) { return obj != null && obj instanceof Migration; }
}

提升架构版本并指定迁移到 RealmConfiguration

Realm.setDefaultConfiguration(new RealmConfiguration.Builder()
                                    .schemaVersion(currentVersion+1) // probably a constant somewhere
                                    .migration(new Migration())
                                    .build());

而且您实际上需要使用添加新添加的类的 DynamicRealm API 来编写迁移。

@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
    RealmSchema schema = realm.getSchema();
    if(oldVersion == 0) {
        RealmObjectSchema transactionacknowledgedata = 
                               schema.create("transactionacknowledgedata");
        transactionacknowledgedata.addField("name", String.class);
        oldVersion++;
    }
}


好吧,要么就是这样,要么你设置new RealmConfiguration.Builder().deleteIfMigrationNeeded().build(),只要模型发生变化,你就会删除(并重新创建)领域。

【讨论】:

  • new RealmConfiguration.Builder().deleteIfMigrationNeeded().build() 这将删除现有领域并仅在我添加扩展 RealmObject 的类时重新创建,否则此行不会影响我的领域案例。
  • Well if you add a RealmObject, add a new field to a RealmObject, delete a field from a RealmObject, delete a RealmObject, add @Index, add @PrimaryKey, remove them, etc
  • 欣赏解释。谢谢。
猜你喜欢
  • 2014-08-13
  • 1970-01-01
  • 2015-07-20
  • 2023-03-25
  • 2021-08-29
  • 1970-01-01
  • 2021-03-23
  • 2013-03-22
  • 1970-01-01
相关资源
最近更新 更多