Realm not auto-deleting database if migration need

2020-04-15 04:55发布

We are in development and db schema changes occur often. Since we are not live, migrations are not needed. I therefor configured Realm as follows:

RealmConfiguration config = new RealmConfiguration.Builder(context)
                .name("jt.realm")
                .schemaVersion(1)
                .deleteRealmIfMigrationNeeded() // todo remove for production
                .build();
        Realm.setDefaultConfiguration(config);

However, when the schema is changed, an exception is thrown: RealmMigration must be provided

My understanding from the docs are that the Realm should auto-delete the db since deleteRealmIfMigrationNeeded() is present in the config, but this does not seem to be happening. Why is this occurring?

Android Studio Dependency

compile 'io.realm:realm-android:0.86.1'

标签: android realm
2条回答
做个烂人
2楼-- · 2020-04-15 05:11

We had a similar issue. We solved this by adding

Realm.getInstance(config)

right after

Realm.setDefaultConfiguration(config);

We think the configuration will be set up after Realm is called the first time. This time we don't use any Realm object so there's no exception.

查看更多
Fickle 薄情
3楼-- · 2020-04-15 05:16

Super late answer by in case anyone has same problem you can look at what I did based on Dagger2.

First create a module:

@Module
public class DatabaseModule {

    public DatabaseModule(Context context) {
        Realm.init(context);
        RealmConfiguration config = new RealmConfiguration.Builder()
                .name("mydb.realm")
                .schemaVersion(1)
                .deleteRealmIfMigrationNeeded()
                .build();

        Realm.setDefaultConfiguration(config);
    }

    @Provides
    Realm provideRealm() {
        return Realm.getDefaultInstance();
    }
}

Its Context is comming from another module

@Module
public class ApplicationModule {
    private Application application;

    public ApplicationModule(Application application) {
        this.application = application;
    }

    @Provides
    @Singleton
    Context provideContext() {
        return application;
    }
}

This is you App level component:

@Singleton
@Component(modules = {ApplicationModule.class, DatabaseModule.class, NetworkModule.class})
public interface ApplicationComponent {

    void inject(HomeActivity activity);
}

Finally use it in your Activity/Fragment:

public class HomeActivity {

@Inject Realm mRealm;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setupDependencyInjection();
        setContentView(R.layout.activity_home);

        // Now you can use Realm
    }

    private void setupDependencyInjection() {
        ((YourApplication) getApplication())
                .getAppComponent()
                .inject(this);
    }
}
查看更多
登录 后发表回答