问题标签 [android-room]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1816 浏览

java - Android Room Persistence Library 在库项目中不起作用

我正在开发一个 Android 库,并希望在其中使用新的 Android Room 持久性库。但是,启动时出现此错误:

Caused by: java.lang.RuntimeException: cannot find implementation for MyLibraryName.Database.QSDatabase. QSDatabase_Impl does not exist at android.arch.persistence.room.Room.getGeneratedImplementation(Room.java:90)

这意味着annotationProcessor在编译期间不会生成额外的代码。

顺便说一句,当我将@Database代码放入应用程序模块时,一切正常。

我的 gradle 文件(库模块):

0 投票
4 回答
28131 浏览

android - Android Room 编译时警告关于外键中的列不是索引的一部分。这是什么意思?

我正在使用最近在 Google I/O 上宣布的 Android 架构组件中的 Android 房间持久性库。事情似乎正在工作,但我收到以下错误:

警告:tagId 列引用了外键,但它不是索引的一部分。每当修改父表时,这可能会触发全表扫描,因此强烈建议您创建覆盖该列的索引。

我的数据库有 3 个表:NoteTagJoinNotesTags。Notes to Tags 是多对多关系,因此使用 JoinNotesTags 表来处理映射。表格很简单:

  • Note.id并且Tag.id都是主键
  • JoinNotesTags.noteId参考Note.id
  • JoinNotesTags.tagId参考Tag.id

外键约束是在JoinNotesTags表上定义的。作为参考,这里是表的CREATE TABLE语句JoinNotesTags

这是@Entity该类的相应注释:

@Entity注释中可以看出,tagId 一起包含在复合唯一索引中noteId。我已经确认在自动生成的 json 模式文件中也正确定义了这个索引:

所以,我的问题是:这个警告只是(仍然是 alpha 版本的)房间库中的一个错误——即编译时分析缺少tagId这个复合索引的一部分的事实吗?还是我真的有一个索引问题需要解决以避免全表扫描?

0 投票
30 回答
56609 浏览

android - 房间持久性:错误:实体和 Pojos 必须有一个可用的公共构造函数

我正在将一个项目转换为 Kotlin,并且我正在尝试使我的模型(这也是我的实体)成为我打算使用 Moshi 来转换来自 API 的 JSON 响应的数据类

我无法构建应用程序导致以下错误

实体和 Pojos 必须有一个可用的公共构造函数。您可以有一个空的构造函数或参数与字段匹配的构造函数(按名称和类型)。找不到字段的设置器。

我发现的例子离这个不远

关于如何解决它的想法?

0 投票
2 回答
23218 浏览

android - Android 架构组件:使用枚举

是否可以通过新的 Android 架构组件和房间持久性库将 Enum 类型用作实体类中的嵌入字段?

我的实体(带有嵌入式枚举):

我的类型转换器:

当我编译这个我得到一个错误说Error:(52, 12) error: Entities and Pojos must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type).

更新 1 我的 SyncEntity 类:

0 投票
2 回答
1754 浏览

android - Room Persistence @Relation 在 Java 中工作,但在 Kotlin 中不工作

基于我之前的问题(Android Persistence room: "Cannot figure out how to read this field from a cursor"),感谢反馈,我开始工作,我在 Kolin 中实现了相同的示例(参见下面的代码)。我必须进行一些小的更改,例如现在传递给查询的参数,这些参数必须作为“p0”、“p1”等传递。现在在 Kotlin 中,我收到以下与 UserWithPets 类相关的错误:

错误:无法弄清楚如何从游标中读取此字段。e: 私有 java.util.List 宠物;

看来,如果我用UserWithPetsJava 编写该类,它可以正常工作,但用 Kotlin 编写时会失败。有什么想法有什么问题吗?这是注释处理问题吗?

0 投票
8 回答
28904 浏览

android - Room 无法在 Android 中验证数据完整性

MainActivity 类

应用数据库类

简介道

在这里,我在第一次运行应用程序后遇到了错误。看起来该应用程序正在尝试再次创建 DATABASE,但已经有一个现有的,因此他们建议更改版本代码。我的要求是我只需要插入一个新的数据集。我怎样才能做到这一点?提前致谢。这是 logcat 错误:

0 投票
1 回答
743 浏览

android - 尝试使用 Observable 时获取 Fata 信号 11

我正在做一个项目,第一次尝试 Kotlin、RxJava 2 和新的 android 架构组件。我正在尝试在单独的线程上从 Room 执行删除方法,并且ERROR: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 12673 (RxCachedThreadS)在执行该方法时得到了结果,并且强制关闭。我正在尝试这两个选项:

1.

2.

这是我的 DeviceViewModel.kt(使用 AndroidViewModel)

还有我的 DeviceDao.kt

我试图解决这个问题,但没有成功。任何帮助都会到来。谢谢!

0 投票
7 回答
76585 浏览

android - Android 房间持久库 - 如何插入具有 List 对象字段的类

Android 房间持久库中,如何将整个 Model 对象插入到本身具有另一个列表的表中。

让我告诉你我的意思:

我的 DAO 看起来像这样:

当我打电话时database.CountriesDao().addCountries(countryModel);,我得到以下房间数据库编译错误: 错误:(58、31)错误:无法弄清楚如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。

应该有另一个名为 CountryLang 的表吗?如果是这样,如何告诉空间在插入语句中连接它们?

CountryLang 对象本身如下所示:

响应如下所示:

对于每个国家/地区,它不会超过这里的一个项目。我很乐意为 country_lang 列表中的一项设计它。所以我可以为 country_lang 制作一个表格,然后将其链接到 CountryModel。但如何?我可以使用外键吗?我希望我不必使用平面文件。所以你说我必须将它存储为 json ?是否建议不要临时使用房间?改用什么?

0 投票
14 回答
84261 浏览

android - Android 房间持久库 - 错误的 TypeConverter 错误:无法弄清楚如何将字段保存到数据库”

由于错误,我无法在房间中创建 typeConverter。我似乎遵循文档中的所有内容。我想将列表转换为 json 字符串。让我们看看我的实体:

country_lang是我想转换为字符串 json 的内容。所以我创建了以下转换器:Converters.java:

那么问题出在我放置@TypeConverters({Converters.class}) 的任何地方,我一直收到错误消息。但正式这是我放置注释以注册 typeConverter 的地方:

我得到的错误是:

0 投票
6 回答
18207 浏览

android - Rxjava2 just 方法 - 如何在另一个线程上运行房间插入?

我有一个房间持久数据库插入方法,如下所示:

我意识到这不能在主线程上运行。这是我定义数据库的方式:

我正在尝试使用 rxjava2,这样我就不会在主线程上运行。我创建了以下方法:

对我来说,这显然现在正在另一个线程上运行。不是主线程,但是当我运行此代码时,出现以下错误:

完整的堆栈跟踪如下。为什么会这样?

进程:com.mobile.myapp.staging,PID:12990
java.lang.IllegalStateException:调度程序抛出致命异常。原因:java.lang.IllegalStateException:无法访问主线程上的数据库,因为它可能会长时间锁定 UI。在 io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:111) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95 ) 在 android.os.Looper.loop(Looper.java:

不重要,但如果您需要知道 defaultSubscriber 类在这里的样子,它是:

DefaultSubscriber.java