2017-11-27 3 views
5

私の新しいアプリケーションの部屋を使用しようとしています。しかし、私のアプリを再起動するたびに、私は古いデータを取得することができません。私のアプリは毎回データベースの新しいインスタンスを作成しているようですが、なぜそれがわかりません。私のクラスはMVPパターンに基づいています。ルーム空のDbのアプリケーションの再起動後

編集:私はもう一度チェックして、エンティティ(MyModel)の自動生成Idが1にリセットされないことがわかりましたが、データを取得するときにそのセッションに挿入されたコレクションのみを取得します。

ダオ

@Dao 
public interface MyDao { 

     @Insert(onConflict = OnConflictStrategy.REPLACE) 
     List<Long> insertModels(List<MyModel> models); 

     @Query("SELECT * FROM MyModel") 
     List<MyModel> getModels(); 
} 

データベース

@Database(entities = {MyModel.class}, version = 1) 
public abstract class MyDatabase extends RoomDatabase { 
    public abstract MyDao myDao(); 
} 

DatabaseModule

@Module 
public class DatabaseModule { 

    @Provides 
    @Singleton 
    MyDatabase provideMyDatabase(Application context) { 
     return Room.databaseBuilder(context.getApplicationContext(), MyDatabase.class, "MyDB").build(); 
    } 

    @Provides 
    @Singleton 
    MyDao provideMyDao(MyDatabase myDatabase) { 
     return myDatabase.myDao(); 
    } 
} 

データソース

@Singleton 
public class MyDataSource { 

    MyDao mMyDao; 

    @Inject 
    public MyDataSource(@NonNull MyDao myDao) { 
     mMyDao = myDao; 
    } 
} 

リポジトリ

​​

ApplicationComponent

@Singleton 
@Component(modules = {AndroidSupportInjectionModule.class, ApplicationModule.class, DatabaseModule.class}) 
public interface ApplicationComponent extends AndroidInjector<MyApp> { 

    @Component.Builder 
    interface Builder { 

     @BindsInstance 
     Builder application(Application application); 

     ApplicationComponent build(); 
    } 
} 

のApp

public class MyApp extends DaggerApplication { 

    private ApplicationComponent mApplicationComponent; 

    @Override 
    protected AndroidInjector<? extends DaggerApplication> applicationInjector() { 
     mApplicationComponent = DaggerApplicationComponent.builder().application(this).build(); 
     return mApplicationComponent; 
    } 
} 
+0

は、あなたが何らかの形じゃないことをあなたは確かにあります移行メカニズムを起動しますか?それはRoom文書で私に目立つものです: 注意:必要な移行を行わないと、Roomはデータベースを再構築します。つまり、データベース内のすべてのデータが失われます。 (https://developer.android.com/training/data-storage/room/migrating-db-versions.html) –

+0

いいえ、バージョン1です。さらに、私はアプリを再インストールせず、再起動します。 。 – fR0DDY

+0

値がdbに正常に挿入されていますか?テストケースを作成して、データの挿入と取り出しが正常に行われるようにすることもできます。 – Gautam

答えて

1

私はちょうどGoogleの例を見て、彼らはそれをどうやったのか、と私はあなたが修正する必要があることに気づい:

@Module public class DatabaseModule { 

@Provides 
@Singleton 
MyDatabase provideMyDatabase(Application context) { 
    return Room.databaseBuilder(context.getApplicationContext(), MyDatabase.class, "MyDB").build(); 
} 

@Provides 
@Singleton 
MyDao provideMyDao(MyDatabase myDatabase) { 
    return myDatabase.myDao(); 
} 

}データベースがすでにこのコードで、存在するかどうかを確認するために

/** 
* Check whether the database already exists and expose it via {@link #getDatabaseCreated()} 
*/ 
private void updateDatabaseCreated(final Context context) { 
    if (context.getDatabasePath(DATABASE_NAME).exists()) { 
     setDatabaseCreated(); 
    } 
} 

private void setDatabaseCreated(){ 
    mIsDatabaseCreated.postValue(true); 
} 


public LiveData<Boolean> getDatabaseCreated() { 
    return mIsDatabaseCreated; 
} 

とにかく、ここではこれについて、Googleのサンプルをgithubのためのリンクです: https://github.com/googlesamples/android-architecture-components/blob/master/BasicSample/app/src/main/java/com/example/android/persistence/db/AppDatabase.java

関連する問題