java - Room 不存储数据

标签 java android sqlite android-room

我的目标是使用 Room 将一些数据存储到 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))) 我尝试在另一个 Activity 中访问数据库,这向我展示那是空的。

我检查了这个库debugCompile 'com.amitshekhar.android:debug-db:1.0.0' 并且每个 表真的是空的。 enter image description here

我做错了什么?

我知道你看不到我所有的代码,也许有什么地方不对,所以我的实际问题是:上面的代码是否正确?

最佳答案

已解决。

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

关于java - Room 不存储数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45457434/

相关文章:

android animation - 使 View 从中心显示到屏幕宽度

java - 如何使字符串从方法中获取返回值?

sqlite - 我应该制作多个 SQLite 数据库以获得更好的并发性吗?

java - 如何在java中使菜单重新出现

java - 一个服务器套接字如何与多个客户端套接字通信

java - Android Studio - 从 URL 获取 JSON 致命异常

php - Laravel4在测试环境中使用SQLite播种失败,而使用mysql成功

java - 使用 SOAP 从 Android 调用 Web 服务

java - 寻找基于 Java 的 OpenSCAD 和 PLasM 替代方案

android - 如何在不覆盖其子项背景颜色的情况下对线性布局产生涟漪效应?