2017-08-02 10 views
0

Mein Ziel ist es, einige Daten in einer SQLite-Datenbank mit Room zu speichern.Zimmer speichert keine Daten

Also machte ich eine Menge @Entities in POJO.

Für jeden @Entity machte ich ein @Dao mit zumindest diesen Anfragen:

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

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

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

My Singleton Zimmer @Database ist:

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

Wenn ich die App zum ersten Mal öffnen, fülle ich die Datenbank mit Daten im Hintergrund 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(); 
     } 
    } 

Ich bin mir absolut sicher, dass die Daten korrekt sind. Ich debuggte jede Zeile und ich kann 100% sicher sagen, dass die Liste der Objekte, die ich an diese Funktionen übergebe, korrekt ist. Kein Fehler.

Wenn dieser Dienst beendet ist (if(!sharedPreferences.getBoolean(getString(R.string.empty), true))) Ich versuche, auf die Datenbank in einer anderen Aktivität zugreifen, und das zeige mir, dass leer ist.

Ich überprüft mit dieser Bibliothek debugCompile 'com.amitshekhar.android:debug-db:1.0.0' und jede Tabelle ist wirklich leer. enter image description here

Was mache ich falsch?

Ich weiß, dass Sie nicht alle meinen Code sehen können, und vielleicht ist etwas falsch, so ist meine eigentliche Frage: Ist der obige Code korrekt?

+0

* ist der obige Code korrekt? * <= Dies ist keine gültige Frage für Stackoverflow ... aber wo ist commit? – Selvin

+0

Entschuldigung, ich verstehe nicht. Fragen Sie nach dem gesamten Projekt? –

+0

Ich verstehe nicht, was Sie nicht verstehen - Transaktion braucht commit – Selvin

Antwort

0

Gelöst.

Android Room verarbeitet Transaktionen automatisch. @Query sind asynchron, während @Insert und @Delete synchron sind.

Mein Fehler bestand darin, alle diese Operationen in einer einzigen Transaktion zu versuchen. Die Lösung ist: Lassen Sie diesen Raum automatisch behandeln.

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