iOS Первичный ключ Swift Couchbase Lite и конфигурация класса - PullRequest
1 голос
/ 25 февраля 2020

Я просматривал couchbase-lite, чтобы использовать его в своем следующем iOS приложении. Я создал модель по имени Сура на данный момент. Определенно, у меня будет больше моделей классов позже.

Здесь у меня четыре вопроса.

  • Как мне добавить _id в качестве основного ключа в couchbase-lite?
  • Как у меня будет больше классов, как я буду справляться с ними? Когда я создаю MutableDocument, как это будет дифференцировать каждый мой класс?
  • Как я вижу, мне приходится перебирать каждый из моих элементов для пакетной вставки, не станет ли это медленным для больших наборов данных?
  • Как преобразовать результаты запроса с большими данными в массив класса модели. (в данном случае массив сур)

    класс сур: декодируемый {

    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)
                                            }
                                        }

1 Ответ

0 голосов
/ 13 марта 2020
  1. Не уверен, что вы подразумеваете под "первичным ключом". Вы всегда можете найти документ по его идентификатору. Имя поля, которое содержит его, Meta.id. Значение поля mutableDoc.getId(). Как вы заметили, вы также можете явно установить идентификатор при создании
  2. Couchbase не хранит классы, он хранит JSON документы. Если у вас есть документы разных типов (разные внутренние структуры, аналогичные разным SQL таблицам), дайте им поле типа и используйте его в своем запросе
  3. Используйте Database.inBatch()
  4. То же самое способ преобразования любого JSON документа в соответствующий класс: gson, Джексон, Моши и др. c
...