我的目标是使用Room将一些数据存储到SQLite数据库中。
所以我在POJO制作了很多@实体。
对于每个@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'和检查了每个表实际上都是空的。

我做错什么了?
我知道你看不到我所有的代码,也许是出了什么问题,所以我的实际问题是:上面的代码正确吗?
发布于 2017-08-02 10:54:45
解决了。
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();
    }https://stackoverflow.com/questions/45457434
复制相似问题