需要帮助了解如何从Schema中删除Realm模型

时间:2018-03-08 01:59:11

标签: java android realm realm-mobile-platform realm-migration

之前已经问过这个问题(herehere),但我创建了一个简单的示例来说明如何重现错误。

以下是我看到的崩溃:

  

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. 运行下面的代码,它只需保存1个MyFirstRealmModel和1个MySecondRealmModel。

  2. 通过删除MySecondRealmModel.java类以及与之相关的所有代码来模拟一些重构。

  3. 删除MySecondRealmModel.java类后,重新运行应用程序并按按钮删除Realm中的所有内容。您将收到上面列出的崩溃。

  4. 我非常困惑的是,我认为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();
    }
    

0 个答案:

没有答案