之前已经问过这个问题(here和here),但我创建了一个简单的示例来说明如何重现错误。
以下是我看到的崩溃:
io.realm.exceptions.RealmException:' MySecondRealmModel'不存在 在当前架构中。 at io.realm.internal.ColumnIndices.getColumnInfo(ColumnIndices.java:112) 在io.realm.RealmSchema.getColumnInfo(RealmSchema.java:250) at io.realm.ImmutableRealmSchema.get(ImmutableRealmSchema.java:41) 在io.realm.RealmSchema.getAll(RealmSchema.java:88) 在io.realm.BaseRealm.deleteAll(BaseRealm.java:602) 在io.realm.Realm.deleteAll(Realm.java:135)
设置: 使用Realm 4.3.3创建一个新项目。 添加两个Realm Models MyFirstRealmModel和MySecondRealmModel。
重现的步骤:
运行下面的代码,它只需保存1个MyFirstRealmModel和1个MySecondRealmModel。
通过删除MySecondRealmModel.java类以及与之相关的所有代码来模拟一些重构。
删除MySecondRealmModel.java类后,重新运行应用程序并按按钮删除Realm中的所有内容。您将收到上面列出的崩溃。
我非常困惑的是,我认为deleteRealmIfMigrationNeeded()
的整个想法是为了防止这类错误?为什么MySecondRealmModel.java
模型会一直存在?目前唯一的解决方法是完全卸载应用程序。
在删除MySecondRealmModel.java之前,这是我的MainActivity.java。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize Realm
Realm.init(this);
RealmConfiguration.Builder realmBuilder = new RealmConfiguration.Builder()
.deleteRealmIfMigrationNeeded();
Realm.setDefaultConfiguration(realmBuilder.build());
// Set the listener that will delete everything in Realm
findViewById(R.id.deleteButton).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Realm realm = Realm.getDefaultInstance();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.deleteAll();
}
});
realm.close();
}
});
Realm realm = Realm.getDefaultInstance();
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
// Create our dummy date.
MyFirstRealmModel myFirstRealmModel = new MyFirstRealmModel();
myFirstRealmModel.id = "firstId";
myFirstRealmModel.data = "firstData";
MySecondRealmModel mySecondRealmModel = new MySecondRealmModel();
mySecondRealmModel.id = "firstId";
mySecondRealmModel.data = "firstData";
realm.insertOrUpdate(myFirstRealmModel);
realm.insertOrUpdate(mySecondRealmModel);
}
});
realm.close();
}