Android Studio中RoomDB表为空,getAllLandmarks()无返回值问题排查
RoomDB 查询返回空、表为空的排查方向
先确认数据到底有没有插进去
别只盯着空表看,先查插入逻辑:- 有没有调用DAO的
insert/insertAll方法?Room写操作必须在IO线程执行(除非你开了allowMainThreadQueries,但不推荐),主线程调用会静默失败,数据根本进不了库。 - 打印插入的返回值:Room的insert会返回插入的rowId,返回-1就是插入失败,大概率是实体类注解出错——比如主键没加
@PrimaryKey、字段类型和数据库不匹配、@Entity的tableName写错。
- 有没有调用DAO的
预填充数据的逻辑有没有生效
要是你想在数据库创建时自动添加数据:- 检查
RoomDatabase.Callback的onCreate方法是不是真的写对了,有没有在里面执行插入操作?还要确保回调通过addCallback()加到了Room.databaseBuilder里。 - 之前装过旧版本APP的话,必须卸载重装,或者给数据库升版本号触发重建,不然旧数据库还在,新的预填充代码根本不会运行。
- 检查
DAO的查询语句有没有坑
- 核对
getAllLandmarks()的@Query注解,表名是不是和实体类@Entity(tableName = "...")完全一致?查错表当然会返回空。 - 有没有加了不必要的注解导致查询异常?比如错误的
@Transaction或者条件,不过这种情况一般会抛异常,但也不排除静默返回空的可能。
- 核对
LiveData观察的细节
你说能进observe回调但进不了循环,说明回调里的list确实是空的。可以在observe里加日志打印list.size(),确认是不是真的没有数据。另外,要是你先观察后插入数据,LiveData应该会自动更新,但前提是插入操作真的成功了。数据库版本和迁移的问题
要是你修改过实体类结构(比如加字段、改字段类型),但没更新@Database(version = ...)的版本号,Room可能不会更新表结构,导致插入失败或者查询不到数据。如果没写迁移逻辑,记得加fallbackToDestructiveMigration()让Room销毁重建数据库,但这样之前的数据会丢失,重建后要确保预填充逻辑能正常执行。你加的
SupportSQLiteDatabase sdb = INSTANCE.getOpenHelper().getWritableDatabase();没用,这只是打开数据库连接,Room本身会自动管理连接,不会帮你插入数据,删掉就行。
内容的提问来源于stack exchange,提问作者Anonymous01
相关产品推荐
相关产品推荐

