问题标签 [grdb]
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.
swift - 如何使用 GRDB 设置内部联接
SQLite.Swift 版本有效。使用 GRDB 版本时,应用程序崩溃,我收到以下错误。线程 1:致命错误:数据库方法不可重入。
我在 GRDB 版本上做错了什么。
这是 SQLite.Swift 版本。
这就是我所拥有的 GRDB 版本。
ios - 如何使用 GRDB 将项目添加到结构中但不在 Db 表中的数组中
在 Db 的 My_Quotes 表(参见下面的 MyQuotes 结构)中,我存储了从设备上的用户联系人中选择的联系人的 ID。这样,如果联系人信息发生更改,ID 将保持不变。因此,我从 Db 中的 My_Quotes 表中提取 ContactID,并使用它通过 func get_ContactName_Org 构建 ContactFullName、ContactFirst、ContactLast 和 ContactOrg。
我遇到的问题是 ContactFullName、ContactFirst、ContactLast 和 ContactOrg(请参阅下面的 QuoteList 结构)不在 My_Quotes 表中。错误是:致命错误:无法从缺少的列 ContactFullName 中读取字符串
我理解错误,但将这些项目添加到 My_Quotes 表中会导致许多其他问题。如何将这些项目插入到数组中?
swift - 查询时 SQLite 比预期慢
我有一个相当大(3,000,000 行)的 SQLite 数据库。它由一张桌子组成。该表有一个整数 id 列、一个基于文本的标记列、一个保存为 int 的时间戳列和 15 个双精度列。我在标签和时间戳列上有一个唯一索引,因为我总是使用两者来查找条目。
我需要运行数据库并进行大量计算。主要是调用一堆select语句。选择语句的复杂性非常简单。我正在使用 GRDB 库。
这是一个示例查询。
当我对我的程序生成的查询(使用explain query plan
)运行调试跟踪时,我可以看到正在使用索引。
我必须遍历很多查询,所以我对一部分查询进行了基准测试。我发现 600 个查询大约需要 28 秒。我在 10 核 iMac Pro 上运行该程序。这似乎很慢。我一直认为 SQLite 更快。
循环中的其他代码基本上将某些数字相加并可能创建一个平均值,因此没有什么复杂且计算量大的问题。
我试图通过将以下配置添加到数据库连接来加快速度。
我能做些什么来加快速度吗?GRDB 是否会减慢速度?我做错什么了吗?我应该使用不同的数据库,如 mySQL 之类的吗?
感谢您的任何提示/输入
ios - 如何在 SQlite 的数据库表中使现有的非可选字段成为可选字段?
我正在使用GRDB
本地持久性。
在Item
表中创建具有以下约束的列。
table.column(Item.CodingKeys.text.rawValue, .text).notNull()
现在我想更改它以支持可选值。
table.column(Item.CodingKeys.text.rawValue, .text)
但是为了迁移,我不能改变它的属性。仅add, rename
适用于列。
在保持向后兼容性的同时,我应该采取什么方法来正确迁移?
ios - 如何使用枚举值作为 GRDB 记录中的列?
我想记录4种不同的类型。我有以下代码
现在它抱怨Type 'Record' does not conform to protocol 'Decodable'
当然,当我从结构中删除类型时,这种抱怨就消失了。由于类型在技术上是 Int16,为什么这使它不可解码?
swift - 一个实体具有多个相同类型的属性的多对多关系
我不确定如何表达这一点,这可能是我找不到任何信息的原因,但我有一个多对多的关系,其中一个实体具有许多其他实体的多个属性。
例如,以Artist
andSong
关系为例。一个艺术家可以有很多歌曲,而一首歌可以有很多艺术家。但是,一首歌可以有(许多)主要艺术家、(许多)特色艺术家和(许多)专辑艺术家。所以这些都来自同一张表,但我不确定如何建模。
在代码中,我在 Swift 中使用 GRDB,因此我遵循以下文档:
我想如果一首歌中只有“艺术家”的话,这会很好。但是对于一首歌,我有 3 种不同类型的艺术家(主要、精选、专辑艺术家),但它们都来自同一个 Artist 表。
解决这个问题的最佳方法是什么?
ios - 如何在 Swift 中使用 GRDB 创建多对多关联?
我正在尝试在歌曲和专辑之间建立关联。每首歌可以出现在一个或多个专辑中,并且每个专辑可以包含一首或多首歌曲。我决定为我的数据库解决方案使用GRDB,但我被困在这个问题上。
我尝试了什么:正如文档所示,我创建了一个passport
结构,如下所示:
然后在 SPTTrack 类中:
在 SPTAlbum 类中:
我在文档中找不到关于如何使用这些关联构建请求的好例子。在 SPTAlbum 类中,我添加了linkedTracks
属性
然后在我的数据库管理器中:
我收到错误:
SQLite 错误 1:没有这样的表:albumPassport
这是不言自明的,但我不知道应该如何以及在哪里为AlbumPassport
结构创建表,如果有任何其他步骤我应该采取实际使用专辑/曲目连接填充此表。
SPTTrack/SPTAlbum 都有一个名为的字段,该字段在第一次迁移期间id
设置。primaryKey
sqlite - SQLite 请求特定日期之间的日历事件
我正在使用 SQLite 包装器GRDB并尝试在特定日期之间请求日历事件。我的表格的缩写版本Event
如下。
ID | 标题 | 开始时间 | 时间结束 | isAllDay |
---|---|---|---|---|
1 | 会议 1 | 2021-10-16 14:15:00.000 | 2021-10-16 17:15:00.000 | 0 |
2 | 会议 2 | 2021-10-16 16:15:00.000 | 2021-10-16 17:15:00.000 | 0 |
3 | 假期 | 2021-10-16 00:00:00.000 | 2021-10-17 00:00:00.000 | 1 |
目前我有一个看起来像这样的请求
除全天活动外,此请求工作正常。数据库以 UTC 格式存储日期,全天事件的时间为 0:00。为了说明这个问题,我的时区是 UTC-3。考虑到上述数据,如果我请求 10 月 16 日的开始和结束之间的事件,则响应会省略全天事件(UTC stanrttime 为 0:00),因为我的开始时间转换为 UTC是 3:00。
我考虑更新全天的开始和结束时间以反映当前时区,但我很快就打消了这个想法,因为如果用户更改时区,我也会遇到同样的问题。我还考虑过使用isAllDay
布尔值以不同的方式处理这些事件,但我无法设计解决方案。关于如何实现请求的任何建议?
ios - 如何使用 GRDB Swift 迁移更改列类型?
我有几个表格UUID
,它们的列类型。
我想将这些列转换为,String
而不是UUID
因为调试很麻烦(例如,使用DB Browser for SQLite浏览sqlite文件需要我执行 SQL 查询,只是为了将对象转换为s 以查看 id 值。UUID
String
回到这个问题,最实用的方法是什么?
我正在考虑,并且即将做,但我想先问这个:
- 在 中
registerMigration
,创建一个新表。 - 新表现在有字符串列。
- 循环遍历旧表的行,并将这些行移动到新表中,但要确保 id 现在在
String
s 中而不是UUID
s 中。 - 丢弃旧表
- 将新表重命名为旧表的名称。