ios - iOS Swift Couchbase Lite 主键和类配置
问题描述
我正在通过 couchbase-lite 在我的下一个 iOS 应用程序中使用它。我现在创建了一个名为 Surah 的模型。当然,我以后会有更多的模型课。
基本上我在这里有四个问题。
- 如何在 couchbase-lite 中添加 _id 作为我的主键?
- 因为我将有更多的课程,我将如何处理这些?当我创建 MutableDocument 时,这将如何区分我的每个类?
- 正如我所看到的,我必须遍历我的每个项目才能批量插入,对于大型数据集来说这不会变慢吗?
如何将大数据查询的结果转换为模型类数组。(在本例中是 Surah 数组)
类古兰经:可解码{
enum Keys: String, CodingKey { case _id case index case englishName case englishMeaning case name case place case count } var _id = "" var index = 1 var page = 1 var numberOfAyahs = 1 var englishName = "" var englishMeaning = "" var name = "" var place = "" var isFavorite = false var dictionary: [String: Any] { return ["_id": _id, "index": index, "page": page] } required init() {} required init(_id: String, index: Int, name: String, englishName: String, englishMeaning: String, place: String, count: Int) { self._id = _id self.index = index self.name = name self.englishName = englishName self.englishMeaning = englishMeaning self.place = place self.numberOfAyahs = count } required convenience init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: Keys.self) // defining our (keyed) container let _id: String = try container.decode(String.self, forKey: ._id) let index: Int = try container.decode(Int.self, forKey: .index) let name: String = try container.decode(String.self, forKey: .name) let englishName: String = try container.decode(String.self, forKey: .englishName) let englishMeaning: String = try container.decode(String.self, forKey: .englishMeaning) let place: String = try container.decode(String.self, forKey: .place) let count: Int = try container.decode(Int.self, forKey: .count) self.init(_id: _id, index: index, name: name, englishName: englishName, englishMeaning: englishMeaning, place: place, count: count) }}
数据库查询代码
let surahs = try JSONDecoder().decode([Surah].self, from: data!)
DispatchQueue.global(qos: .background).async {
//background code
do {
if let db = App.shared.database {
try db.inBatch {
for item in surahs {
let doc = MutableDocument(data: item.dictionary)
doc.setString("users", forKey: "type")
doc.setValue(Keys._id, forKey: item._id)
// doc.setValue(Keys.englishName, forKey: item.englishName)
try db.saveDocument(doc)
let index = IndexBuilder.valueIndex(items:
ValueIndexItem.expression(Expression.property("_id")), ValueIndexItem.expression(Expression.property("type")))
try db.createIndex(index, withName: "TypeNameIndex")
print("saved user document \(doc.string(forKey: "englishName"))")
}
}
}
} catch let error {
DispatchQueue.main.async {
seal.reject(error)
}
}
DispatchQueue.main.async {
seal.fulfill(surahs)
}
}
解决方案
- 不确定“主键”是什么意思。您始终可以通过 id 找到文档。包含它的字段的名称是
Meta.id
。该字段的值为mutableDoc.getId()
。正如您所注意到的,您还可以在创建时显式设置 id - Couchbase 不存储类,它存储 JSON 文档。如果你有不同类型的文档(不同的内部结构,类似于不同的 SQL 表),给它们一个类型字段并在你的查询中使用它
- 利用
Database.inBatch()
- 与将任何 JSON 文档转换为相应类的方式相同:gson、Jackson、Moshi 等
推荐阅读
- php - 如何在跟踪数据集更改的同时最好地构建数据库
- javascript - 使用 render props 函数将上下文中的表单名称传递给 Redux Form formValueSelector
- ruby - Ruby JSONP 返回 Errno::EPROTONOSUPPORT
- postgresql - 通过 Powershell Start-Transcript 将时间戳添加到 Postgres PSQL 执行输出
- vue.js - 作用于从 JSON 构建的 Vue 中的单个输入
- php - Mariadb 一遍又一遍地重复查询
- reactjs - 用css模块反应js添加类
- php - PHP 无法上传视频和音频文件
- python - 在 Python 中使用 enumerate 遍历列表时是否应该创建副本
- python - 如何在 Python 3 中删除字符串中的特殊字符?