在Android 中与 Room 合作了几个月之后,我们遇到了一些问题,与市场上的其他 ORM(如 Hibernate)相比,这些问题确实阻碍了我们的发展。发现的一些问题如下:
安卓问题中的房间
- 不允许手动插入查询,只能用@Insert对方法进行说明,并在发生冲突时定义替换策略。
- 它不允许我们将外键定义为实体中的集合。例如,如果我们有一个相册实体,我们无法将列表 <Track> 定义为其中的外键,但强制我们将一个”相册 Id”字段作为外键在轨道轨道实体中进行说明。这使得”相册”表中的插入不是原子的,因为您必须将它们单独插入到两个表中(也不允许自定义插入查询,如第一点所示)。
- 它不允许在插入中定义返回的类型。换句话说,如果我们想要插入主键定义为 String 的表中,插入方法将始终返回 Long(或 List <Long>如果插入多个元素),则此 Long 是 rowId。
- 通过不允许实体中的外键列表,为了阅读,我们必须创建一个视图(以数据类的形式),其中我们包括我们想要读取的实体的关系,以便我们按我们所做的同一实体的每个读取来复制数据库模型,并且具有只有一个 ID 的”精选”实体:
Java
Ⅹ
1
FEATURED_TABLE_NAME)2数据类特色实体(
3名称=特色Db)。FEATURED_ID_FIELD_NAMEvarid字符串
4)
然后,我们有 N 个实体通过外键引用此精选(在本例中,它仅是相册):
Java
xxxxxxx
11名称 = 专辑db)。ALBUM_ID_FIELD_NAME) var ID:字符串,(3var标题字符串,
4名称=专辑db)。FEATURED_ID_KEY_FKvar功能已设字符串?=空
5)
如果我们想要在单个查询中按 ID 读取特色实体,我们必须有一个中间模型,例如:
Java
xxxxxxx
11var 特色实体:特色实体,3(
4实体=相册实体::类,
5父列="id",
6实体列="特色 Id"
7var相册列表=空列表()
8)
这些只是我们遇到的一些困难,尽管无疑还有很多其他困难,这将让我们重新思考在未来项目中使用Android空间Android 中的房间也为我们提供了工具,让我们的生活更轻松。
安卓空间优势
- 大量使用注释意味着我们不必编写任何代码来与数据库进行交互。例如,在使用 Realm 时,会错过这种情况。
- Android 中的房间提供开箱即用的 LiveData 和 RxJava 的集成,这使得创建被动应用程序变得更加容易,而无需处理可观察器的创建,这使我们能够观察数据库中的更改,以便立即做出反应。
Comments are closed.