2017-08-02 2 views
0

Mon but est de stocker des données dans une base de données SQLite en utilisant Room. J'ai donc fait beaucoup de @Entities dans POJO.La pièce ne stocke pas de données

Pour chaque @Entity je fait une @Dao avec au moins ces requêtes:

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

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

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

Mon Singleton Chambre @Database est:

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

Quand j'ouvre l'application pour la première fois, je remplis la base de données avec données dans un arrière-plan 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(); 
     } 
    } 

Je suis absolument sûr que les données sont correctes. J'ai débogué chaque ligne et je peux dire à 100% que la liste des objets que je passe à ces fonctions est correcte. Aucune erreur du tout.

Lorsque ce service est terminé (if(!sharedPreferences.getBoolean(getString(R.string.empty), true))) j'essaie d'accéder à la base de données dans une autre activité et cela me montre que c'est vide.

J'ai vérifié avec cette bibliothèque debugCompile 'com.amitshekhar.android:debug-db:1.0.0' et chaque tableau est vraiment vide. enter image description here

Qu'est-ce que je fais mal?

Je sais que vous ne pouvez pas voir tout mon code, et peut-être qu'il y a quelque chose qui ne va pas, donc ma vraie question est: le code ci-dessus est-il correct?

+0

* est-ce que le code ci-dessus est correct? * <= Cette question n'est pas valide pour stackoverflow ... mais où est commit? – Selvin

+0

Désolé, je ne comprends pas. Demandez-vous l'ensemble du projet? –

+0

Je ne comprends pas ce que vous ne comprenez pas - la transaction doit être validée – Selvin

Répondre

0

Résolu.

Android Room traite les transactions automatiquement. @Query sont asynchrones, tandis que @Insert et @Delete sont synchrones.

Mon erreur était d'essayer d'inclure toutes ces opérations dans une seule transaction. La solution est la suivante: laissez cette salle les traiter automatiquement.

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