支持 UPSERT 的 Android SQLite ORM? [关闭]
Posted
技术标签:
【中文标题】支持 UPSERT 的 Android SQLite ORM? [关闭]【英文标题】:Android SQLite ORM with UPSERT support? [closed] 【发布时间】:2022-01-24 00:49:22 【问题描述】:我想在 android 上的 SQLite 中使用 UPSERT 指令。 哪个 ORM 支持它?
我知道很容易在 android 项目中包含任何版本的 SQLite,例如,使用 Android SQLite support library,我说的不是这个。
我需要 ORM 级别的upsert
子句的支持。我需要这样写:
@Upsert (onConflict = Do.Update, set = "name = :name")
suspend fun upsert(name: String)
Room
不支持这种原生的upsert
查询,所以,我不能以这种方式使用这个库。
更新:您可以要求 google room 开发团队添加此功能:https://issuetracker.google.com/issues/117855270
【问题讨论】:
【参考方案1】:您发布的链接说:-
UPSERT syntax was added to SQLite with version 3.24.0 (2018-06-04)
所以你会发现 Room 确实支持 UPSERT,但只有 IF 目标设备的 SQLite 版本为 3.24.0 或更高,即 API 30+ 的设备应该有 SQLite 版本 3.28.0或更高。
房间或原生 SQLite 支持的内容不取决于 API,而是取决于已安装的 SQLite 版本,它接受或拒绝 SQL 的语法。不确定其他 ORM 是否支持原生 SQLite 以外的任何东西,但如果您想针对 API 30 (android R) 以下的目标,这将是一个额外的要求。
【讨论】:
不,Room 根本不支持upsert
。您可以只编写一个原始查询,但注释处理器级别不支持此指令。
@JamesBond 好吧,这真的很震惊,马提尼酒看起来像 Room 不支持 SELECT 因为没有 @Select
注释,也没有 @Drop
注释,也没有 @Create
注释......我猜你最好创建一个问题,因为 Room 显然没有任何用处。也许他们会创建一个 @Issue
注释,同时根据您的原则修复 Room 不支持的所有内容。【参考方案2】:
您可以构建和包含任何您想要的 SQLite 版本。 官方wiki上有详细说明:https://www.sqlite.org/android/doc/trunk/www/install.wiki 如果你不想从源代码编译 SQLite,你可以使用预构建的 AAR。
【讨论】:
以上是关于支持 UPSERT 的 Android SQLite ORM? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章