在每个JSON序列化中,领域Swift对象都重复

问题描述

首次下载我的应用程序时,它需要一个JSON文件并将其序列化到Realm数据库中。这是我发现的唯一方法,它允许我预填充领域数据库并同时使其可写。由于Realm不接受字符串列表,因此我必须创建一个具有MyString属性的名为text的对象。

问题:
我的应用程序在每个新更新中都重新序列化JSON,以说明数据库中的更改。仅只读属性被重写。这是我的方法:

func serialize() {
    let path = Bundle.main.path(forResource: "JSONFile",ofType: "json")
    let url = URL(fileURLWithPath: path!)
    let jsonDecoder = JSONDecoder()
    do {
        let data = try Data(contentsOf: url)
        let json = try JSONSerialization.jsonObject(with: data,options: .allowFragments)
        guard json is [AnyObject] else { assert(false,"failed to parse"); return }
        do {
            let myItems = try jsonDecoder.decode([Item].self,from: data)
            for myItem in myItems {
                try! realm.write {
                    realm.create(Item.self,value: [
                        "id": myItem.id,"entitle": myItem.entitle,"artitle": myItem.artitle,"submenus": myItem.submenus,// This is a List<MyString>
                        "dates": myItem.dates        // This is a List<MyString>
                    ],update: .modified)
                    // Other write-only propeties are left out to not overwrite the user's changes
                }
            }
        } catch let error { print("failed to convert data: \(error)") }
    } catch let error { print(error) }
}

现在,每次我的应用程序更新(以及第一次打开该应用程序)时,此代码都会运行并重做所有序列化。 update: .modified是允许我不复制Item对象的原因,这很棒。但是,每次运行时,它都会创建一个新的MyString对象,而不是覆盖它。现在每个人都将每个MyString对象复制了5次,并且每次更新都会增加。有没有办法:

  1. 删除当前用户的所有重复项? 5个重复项中的4个未被使用。它们只是存在于数据库中。我无法在每次序列化之前删除所有MyString对象,因为其中一些是用户输入的只写属性。删除所有这些内容也会删除用户的数据。
  2. 将其设置为每次都不重复吗?我尝试添加一个primaryKey作为name,但这给了我这个错误:Primary key property 'class_MyString.text' has duplicate values after migration.。问题是,它们并不都是唯一的。他们中的许多人共享相似的text,那么如何区分他们?

解决方法

您可以预填充Realm文件,并将其作为应用程序捆绑包的一部分包含在内。请参阅此文档:https://realm.io/docs/swift/latest/#bundling-a-realm

添加/更新已经存在的对象时,也请使用realm.add(Item(),update: .modified)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...