2017-11-27 43 views
5

Tôi đang cố gắng sử dụng Phòng cho ứng dụng mới của mình. Nhưng bất cứ khi nào tôi khởi động lại ứng dụng của mình, tôi không thể truy xuất dữ liệu cũ. Dường như ứng dụng của tôi đang tạo ra một cá thể mới của cơ sở dữ liệu mỗi lần, nhưng tôi không chắc chắn tại sao. Đây là các lớp của tôi dựa trên mẫu MVP.Phòng trống Db sau khi khởi động lại ứng dụng

Chỉnh sửa: Tôi vừa kiểm tra lại và tôi có thể thấy Id được tạo tự động cho đối tượng (MyModel) không được đặt lại thành 1 nhưng khi tôi truy xuất dữ liệu, tôi chỉ nhận được bộ sưu tập được chèn vào phiên đó.

Đào

@Dao 
public interface MyDao { 

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

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

Cơ sở dữ liệu

@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(); 
    } 
} 

Data Source

@Singleton 
public class MyDataSource { 

    MyDao mMyDao; 

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

Repository

@Singleton 
public class MyRepository { 

    private final MyDataSource mMyDataSource; 

    @Inject 
    MyRepository(@Local MyDataSource myDataSource) { 
     mMyDataSource = myDataSource; 
    } 
} 

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

Bạn có chắc chắn rằng bạn không phải bằng cách nào đó kích hoạt cơ chế di chuyển? Đó là một điều nổi bật với tôi trong tài liệu của Phòng: Thận trọng: Nếu bạn không cung cấp các di chuyển cần thiết, Phòng sẽ xây dựng lại cơ sở dữ liệu thay vào đó, nghĩa là bạn sẽ mất tất cả dữ liệu trong cơ sở dữ liệu. (https://developer.android.com/training/data-storage/room/migrating-db-versions.html) –

+0

Không, đó là phiên bản 1. Hơn nữa, tôi không cài đặt lại ứng dụng, chỉ cần khởi động lại ứng dụng . – fR0DDY

+0

bạn có chắc chắn các giá trị được đưa vào db thành công không? Bạn cũng có thể thử viết test case để đảm bảo rằng dữ liệu được chèn vào và lấy ra thành công. – Gautam

Trả lời

1

tôi chỉ thấy ví dụ google và cách họ đã làm điều đó, và tôi nhận ra rằng bạn cần phải sửa chữa:

@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(); 
} 

}

để kiểm tra xem cơ sở dữ liệu đã tồn tại, với mã này:

/** 
* 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; 
} 

anyway đây là một liên kết đến GitHub google mẫu về điều này: https://github.com/googlesamples/android-architecture-components/blob/master/BasicSample/app/src/main/java/com/example/android/persistence/db/AppDatabase.java

Các vấn đề liên quan