2017-11-27 20 views
5

मैं अपने नए ऐप के लिए कक्ष का उपयोग करने की कोशिश कर रहा हूं। लेकिन जब भी मैं अपना ऐप पुनरारंभ करता हूं, तो मैं पुराना डेटा पुनर्प्राप्त करने में असमर्थ हूं। ऐसा लगता है कि मेरा ऐप हर बार डेटाबेस का एक नया उदाहरण बना रहा है, लेकिन मुझे यकीन नहीं है कि क्यों। एमवीपी पैटर्न के आधार पर मेरी कक्षाएं यहां दी गई हैं।आवेदन खाली करने के बाद कक्ष खाली डीबी

संपादित करें: मैंने अभी दोबारा जांच की है और मैं देख सकता हूं कि एंटी-जेनरेट आईडी (एंटोमिड) के लिए ऑटो-जेनरेट आईडी (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; 
    } 
} 

भंडार

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

अनुप्रयोग

public class MyApp extends DaggerApplication { 

    private ApplicationComponent mApplicationComponent; 

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

क्या आप यकीन है कि आप किसी भी तरह नहीं कर रहे हैं:

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

वैसे भी यहां इस बारे में गूगल नमूना GitHub के लिए एक लिंक है माइग्रेशन तंत्र को ट्रिगर करना? कक्ष डॉक्स में यह एक चीज है जो मुझे बताती है: सावधानी: यदि आप आवश्यक माइग्रेशन प्रदान नहीं करते हैं, तो कक्ष डेटाबेस को पुनर्निर्माण करता है, जिसका अर्थ है कि आप डेटाबेस में अपना सभी डेटा खो देंगे। (https://developer.android.com/training/data-storage/room/migrating-db-versions.html) –

+0

नहीं, यह संस्करण 1 है। इसके अलावा, मैं ऐप को दोबारा इंस्टॉल नहीं कर रहा हूं, बस इसे पुनरारंभ कर रहा हूं । – fR0DDY

+0

क्या आप वाकई डीबी में सफलतापूर्वक डाले जा रहे हैं? आप परीक्षण केस भी लिखने का प्रयास कर सकते हैं जिससे यह सुनिश्चित हो सके कि डेटा सफलतापूर्वक डाला गया है और सफलतापूर्वक पुनर्प्राप्त किया गया है। – Gautam

उत्तर

1

मैं सिर्फ गूगल उदाहरण देखा और वे इसे कैसे किया, और मैं महसूस किया कि आप ठीक करने के लिए की जरूरत है:

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

}

यदि डेटाबेस पहले से ही मौजूद जाँच करने के लिए, इस कोड के साथ: https://github.com/googlesamples/android-architecture-components/blob/master/BasicSample/app/src/main/java/com/example/android/persistence/db/AppDatabase.java

संबंधित मुद्दे