支持 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? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Android 房间持久性库:Upsert

upsert方法的Android sqlite语法错误

ThinkPHP Mongo驱动update方法支持upsert参数

Android 手写数据库框架

Android 手写数据库框架

Hudi Upsert原理