2017-08-02 83 views
0

我的目標是使用房間將一些數據存儲到SQLite數據庫。房間不存儲數據

所以我在POJO做了很多@Entities。

對於每個@Entity我至少這些查詢做了一個@Dao

@Dao 
public interface RouteDao { 
    @Query("SELECT * FROM route") 
    LiveData<List<Route>> getAll(); 

    @Insert 
    void insertAll(List<Route> routes); 

    @Query("DELETE FROM route") 
    void deleteAll(); 
} 

我辛格爾頓@Database房間:

@Database(entities = {Agency.class, Calendar.class, CalendarDate.class, FeedInfo.class, Route.class, Stop.class, StopTime.class, Transfer.class, Trip.class}, version = 1) 
@TypeConverters(MyConverters.class) 
public abstract class GtfsDatabase extends RoomDatabase { 

    private static final String DATABASE_NAME = "gtfs-db"; 

    private static GtfsDatabase INSTANCE; 

    public abstract AgencyDao agencyDao(); 

    public abstract CalendarDao calendarDao(); 

    public abstract CalendarDateDao calendarDateDao(); 

    public abstract FeedInfoDao feedInfoDao(); 

    public abstract RouteDao routeDao(); 

    public abstract StopDao stopDao(); 

    public abstract StopTimeDao stopTimeDao(); 

    public abstract TransferDao transferDao(); 

    public abstract TripDao tripDao(); 

    public static synchronized GtfsDatabase getDatabase(Context context) { 
     return INSTANCE == null ? INSTANCE = Room.databaseBuilder(
       context.getApplicationContext(), 
       GtfsDatabase.class, 
       DATABASE_NAME 
     ).build() : INSTANCE; 
    } 
} 

當我打開應用程序的第一次,我填的是帶有後臺數據的數據庫IntentService:

public static void importData(Context context, Map<String, String> data) { 
     GtfsDatabase db = GtfsDatabase.getDatabase(context); 
     db.beginTransaction(); 
     try { 
      db.agencyDao().deleteAll(); 
      db.calendarDao().deleteAll(); 
      db.calendarDateDao().deleteAll(); 
      db.feedInfoDao().deleteAll(); 
      db.routeDao().deleteAll(); 
      db.stopDao().deleteAll(); 
      db.stopTimeDao().deleteAll(); 
      db.transferDao().deleteAll(); 
      db.tripDao().deleteAll(); 

      db.agencyDao().insertAll(rawToAgencies(data.get(AGENCY_FILE))); 
      db.calendarDao().insertAll(rawToCalendars(data.get(CALENDAR_FILE))); 
      db.calendarDateDao().insertAll(rawToCalendarDates(data.get(CALENDAR_DATES_FILE))); 
      db.feedInfoDao().insertAll(rawToFeedInfos(data.get(FEED_INFO_FILE))); 
      db.routeDao().insertAll(rawToRoutes(data.get(ROUTES_FILE))); 
      db.tripDao().insertAll(rawToTrips(data.get(TRIPS_FILE))); 
      db.stopDao().insertAll(rawToStops(data.get(STOPS_FILE))); 
      db.stopTimeDao().insertAll(rawToStopsTimes(data.get(STOP_TIMES_FILE))); 
      db.transferDao().insertAll(rawToTransfers(data.get(TRANSFERS_FILE))); 

      PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(context.getString(R.string.empty), false).apply(); 
     } finally { 
      db.endTransaction(); 
     } 
    } 

我確信數據是正確的。我調試了每一行,我可以說100%確定我傳遞給這些函數的對象列表是正確的。沒有錯誤。

當這項服務完成(if(!sharedPreferences.getBoolean(getString(R.string.empty), true)))我嘗試訪問另一個活動中的數據庫,這表明我是空的。

我檢查了這個庫debugCompile 'com.amitshekhar.android:debug-db:1.0.0'表真的是空的。 enter image description here

我做錯了什麼?

我知道你看不到我所有的代碼,也許有什麼問題,所以我的實際問題是:上述代碼是否正確?

+0

*是上述代碼是否正確?* <=這對於stackoverflow是無效的問題......但是在哪裏提交? – Selvin

+0

對不起,我不明白。你在問整個項目嗎? –

+0

我不明白你不明白 - 交易需要承諾 – Selvin

回答

0

已解決。

Android Room正在自動處理交易。 @Query是異步的,而@Insert@Delete是同步的。

我的錯誤是嘗試在單個事務中包含所有這些操作。 解決方法是:讓Room自動處理它們。

public static void importData(Context context, Map<String, String> data) { 
     GtfsDatabase db = GtfsDatabase.getDatabase(context); 
     db.agencyDao().deleteAll(); 
     db.calendarDao().deleteAll(); 
     db.calendarDateDao().deleteAll(); 
     db.feedInfoDao().deleteAll(); 
     db.routeDao().deleteAll(); 
     db.stopDao().deleteAll(); 
     db.stopTimeDao().deleteAll(); 
     db.transferDao().deleteAll(); 
     db.tripDao().deleteAll(); 

     db.agencyDao().insertAll(rawToAgencies(data.get(AGENCY_FILE))); 
     db.calendarDao().insertAll(rawToCalendars(data.get(CALENDAR_FILE))); 
     db.calendarDateDao().insertAll(rawToCalendarDates(data.get(CALENDAR_DATES_FILE))); 
     db.feedInfoDao().insertAll(rawToFeedInfos(data.get(FEED_INFO_FILE))); 
     db.routeDao().insertAll(rawToRoutes(data.get(ROUTES_FILE))); 
     db.tripDao().insertAll(rawToTrips(data.get(TRIPS_FILE))); 
     db.stopDao().insertAll(rawToStops(data.get(STOPS_FILE))); 
     db.stopTimeDao().insertAll(rawToStopsTimes(data.get(STOP_TIMES_FILE))); 
     db.transferDao().insertAll(rawToTransfers(data.get(TRANSFERS_FILE))); 

     PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(context.getString(R.string.empty), false).apply(); 
    }