Я пытаюсь записать в Realm DB из файла JSON (используя swiftyJSON), получаю следующую ошибку:
libc ++ abi.dylib: завершение с неперехваченным исключением типа NSException *** Завершение работы приложения из-за неперехваченного исключения 'RLMException', причина: 'Недопустимое значение' {vehicle: true, viewable: true, id: 0, weapon: false, жанры: [Fantasy, General], name: Car} 'для инициализации объекта типа' Item ': отсутствует ключ' id ''
Мой файл JSON имеет следующую структуру:
[
{
"id": 0,
"name": "Car",
"genres": "[Fantasy, General]",
"viewable": true,
"weapon": false,
"vehicle": true
},
{
"id": 1,
"name": "Truck",
"genres": "[General]",
"viewable": true,
"weapon": false,
"vehicle": true
},
]
Мой класс БД Realm:
class Item: Object {
@objc dynamic var id: Int = 0
@objc dynamic var name = ""
let genres = List<String>()
@objc dynamic var visable: Bool = false
@objc dynamic var weapon: Bool = false
@objc dynamic var vehicle: Bool = false
override static func primaryKey() -> String? {
return "id"
}
override static func indexedProperties() -> [String] {
return ["genre", "visable"]
}
}
а код для записи JSON в RealmDB выглядит следующим образом:
func jsonAdd() {
if let path = Bundle.main.path(forResource: "Data", ofType: "json") {
do {
let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe)
let json = JSON(data)
for (index,subJson):(String, JSON) in json {
do {
try realm.write {
realm.create(Item.self, value: subJson, update: .modified)
}
} catch let error as NSError {
print("Unable to write")
print(error)
}
}
} catch {
print("Error")
}
}
}
Я думаю, что проблема связана с отображением JSON, но мы будем очень благодарны за любую помощь, чтобы записать JSON в базу данных Realm, включая жанры в виде списка.
NB: Мне удалось записать в базу данных Realm, используя следующий код (на основе документации Realm) перед функцией «Запись», но, похоже, не могу заставить ее работать для моей структуры JSON.
let newdata = "{\"id\": 0, \"name\": \"Car\", \"genres\": [\"Fantasy\",\"General\"], \"viewable\": true, \"weapon\": false, \"vehicle\": true}".data(using: .utf8)!
let json = try! JSONSerialization.jsonObject(with: newdata, options: [])
Спасибо!
let genres = List<String>()
наlet genres = List<MyStringClass>()
. Дополнительные сведения см. здесь. Также существует проблема с первичным ключом объекта, которым является Int, и описывающая его функцияoverride static func primaryKey() -> String?
, возвращающая String - person Jay   schedule 07.02.2021class Genres: Object
и заменил жанры наlet genres = List<Genres>()
. Мне также удалось решить свою проблему, поэтому вскоре я опубликую ответ. - person ecjps82   schedule 08.02.2021