2017-08-02 12 views
0

私の目標はRoomを使用してSQLiteデータベースにデータを保存することです。部屋にデータが保存されていません

私はPOJOで@Entitiesをたくさん作りました。私は、少なくともこれらのクエリで@Daoを作っ各@Entityに対して

@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ルームは自動的に取引を処理しています。 @Queryは非同期ですが、@Insert@Deleteは同期しています。

私のエラーは、これらの操作をすべて単一のトランザクションに組み込むことでした。 解決策は次のとおりです。

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(); 
    } 
関連する問題