Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 域Swift嵌套递归列表未正确保存数据_Ios_Swift_Realm_Codable_Realm List - Fatal编程技术网

Ios 域Swift嵌套递归列表未正确保存数据

Ios 域Swift嵌套递归列表未正确保存数据,ios,swift,realm,codable,realm-list,Ios,Swift,Realm,Codable,Realm List,好的,我有一个领域模型,它本身有一个RealmList(递归)。在swift中通过Decodable进行解码时,它在调试时显示完美,但当它保存到域中时,它没有正确保存。只存储选项卡,不存储列和字段。以下是我的模型(删除了一些int或string类型的属性): 类工作流:对象,可编码{ @objc动态变量workflowId=0 @objc动态变量字段名:字符串?=nil @objc动态变量字段值:字符串?=nil 让tabs=List() let columns=List() 让字段=列表()

好的,我有一个领域模型,它本身有一个RealmList(递归)。在swift中通过Decodable进行解码时,它在调试时显示完美,但当它保存到域中时,它没有正确保存。只存储选项卡,不存储列和字段。以下是我的模型(删除了一些int或string类型的属性):

类工作流:对象,可编码{
@objc动态变量workflowId=0
@objc动态变量字段名:字符串?=nil
@objc动态变量字段值:字符串?=nil
让tabs=List()
let columns=List()
让字段=列表()
私有枚举编码键:字符串,编码键{
案例id=“tenantFieldSetupId”
案例fieldName=“fieldName”
案例fieldLabel=“fieldLabel”
case tabs=“tabs”
case fields=“字段”
case columns=“columns”
}
公共所需便利初始化(来自解码器:解码器)抛出{
self.init()
做{
let container=try decoder.container(keyedBy:CodingKeys.self)
self.workflowId=try container.decodeIfPresent(Int.self,forKey:.workflowId)??Constants.defaultRealmInt
self.fieldName=try container.decodeIfPresent(String?.self,forKey:.fieldName)??Constants.defaultRealmIdString
self.fieldLabel=try container.decodeIfPresent(String?.self,forKey:.fieldLabel)??Constants.defaultRealmIdString
让TestAbs=try container.decodeIfPresent([Workflow].self,forKey:.tabs)??[]
self.tabs.append(objectsIn:abs)
让tempFields=try container.decodeIfPresent([Workflow].self,forKey:.fields)??[]
self.fields.append(objectsIn:tempFields)
让tempColumns=try container.decodeIfPresent([Workflow].self,forKey:.columns)??[]
self.columns.append(objectsIn:tempColumns)
}
抓住{
打印(错误。本地化描述)
}
}
这是我传递json以将其转换为工作流对象的方法:

func jsonToObject <T: Decodable> (jsonString: String) -> T? {
    if let data = jsonString.data(using: .utf8) {
        return self.jsonToObject(jsonData: data)
    }
    return nil
}
func-jsonToObject(jsonString:String)->T{
如果let data=jsonString.data(使用:.utf8){
返回self.jsonToObject(jsonData:data)
}
归零
}
他们从上面的方法完美地返回了工作流数组。我将数组传递给下面的方法,我使用该方法将其保存到域数据库(其实际工作流列表)中。它可以正常工作。但当我检查数据库时,工作流列表不同。没有字段和列

 private func  insertOrUpdateList<T : Object> (list : Array<T>, update : Bool) -> Bool { // Run when primary key is defined in Model

     return autoreleasepool { () -> Bool in
         let realm = getRealm()

         if realm.isInWriteTransaction {
         // logging that realm is in write transaction
             return false
         }else{
             realm.beginWrite()
            realm.add(list,update: update ? .modified: .all)
             do {
                 try realm.commitWrite()
                 return true
             }catch let err {
                 return false
             }
         }
     }
 }
private func insertOrUpdateList(列表:数组,更新:Bool)->Bool{//在模型中定义主键时运行
返回自动释放池{()->Bool in
让realm=getRealm()
if realm.isInWriteTransaction{
//将该领域记录在写事务中
返回错误
}否则{
realm.beginWrite()
realm.add(列表,更新:update?.modified:.all)
做{
请尝试realm.commitWrite()
返回真值
}捉迷藏{
返回错误
}
}
}
}

Hi Talib,你能分享更多的代码吗?我们可以更好地帮助你吗?@rs7完成了,提供了所有必要的详细信息,你可以跟踪为什么只保存选项卡。你可以使用打印语句。例如,在域处于写事务中时添加打印语句,并在提交写不起作用时打印错误。是否执行有意义吗?一旦你这样做了,请在这里分享这些信息,希望我们能弄清楚发生了什么。@rs7没有错误发生。明白了。那么一定是这个领域在写事务中?
 private func  insertOrUpdateList<T : Object> (list : Array<T>, update : Bool) -> Bool { // Run when primary key is defined in Model

     return autoreleasepool { () -> Bool in
         let realm = getRealm()

         if realm.isInWriteTransaction {
         // logging that realm is in write transaction
             return false
         }else{
             realm.beginWrite()
            realm.add(list,update: update ? .modified: .all)
             do {
                 try realm.commitWrite()
                 return true
             }catch let err {
                 return false
             }
         }
     }
 }