Android 中与 Room 合作了几个月之后,我们遇到了一些问题,与市场上的其他 ORM(如 Hibernate)相比,这些问题确实阻碍了我们的发展。发现的一些问题如下:

安卓问题中的房间

  • 不允许手动插入查询,只能用@Insert对方法进行说明,并在发生冲突时定义替换策略。
  • 它不允许我们将外键定义为实体中的集合。例如,如果我们有一个相册实体,我们无法将列表 <Track> 定义为其中的外键,但强制我们将一个”相册 Id”字段作为外键在轨道轨道实体中进行说明。这使得”相册”表中的插入不是原子的,因为您必须将它们单独插入到两个表中(也不允许自定义插入查询,如第一点所示)。
  • 它不允许在插入中定义返回的类型。换句话说,如果我们想要插入主键定义为 String 的表中,插入方法将始终返回 Long(或 List <Long>如果插入多个元素),则此 Long 是 rowId。
  • 通过不允许实体中的外键列表,为了阅读,我们必须创建一个视图(以数据类的形式),其中我们包括我们想要读取的实体的关系,以便我们按我们所做的同一实体的每个读取来复制数据库模型,并且具有只有一个 ID 的”精选”实体:
Java

 

 
1
FEATURED_TABLE_NAME

2
数据特色实体
3
@PrimaryKey@ColumnInfo(@ColumnInfo名称=特色Db)。FEATURED_ID_FIELD_NAMEvarid字符串
4
)

然后,我们有 N 个实体通过外键引用此精选(在本例中,它仅是相册):

Java

 

xxxxxxx
1
 
1
@PrimaryKey@ColumnInfo @ColumnInfo名称 = 专辑db)。ALBUM_ID_FIELD_NAME) var ID字符串

3
var标题字符串
4
@ColumnInfo(名称=专辑db)。FEATURED_ID_KEY_FKvar功能已设字符串=
5
)

如果我们想要在单个查询中按 ID 读取特色实体,我们必须有一个中间模型,例如:

Java

 

xxxxxxx
1
 
1
@Embedded var 特色实体特色实体

3
@Relation
4
实体=相册实体::
5
父列="id"
6
实体列="特色 Id"
7
var相册列表=空列表()
8
)

这些只是我们遇到的一些困难,尽管无疑还有很多其他困难,这将让我们重新思考在未来项目中使用Android空间Android 中的房间也为我们提供了工具,让我们的生活更轻松。

安卓空间优势

  • 大量使用注释意味着我们不必编写任何代码来与数据库进行交互。例如,在使用 Realm 时,会错过这种情况。
  • Android 中的房间提供开箱即用的 LiveData 和 RxJava 的集成,这使得创建被动应用程序变得更加容易,而无需处理可观察器的创建,这使我们能够观察数据库中的更改,以便立即做出反应。
Comments are closed.