【问题标题】:Swift + Core Data only saving last in loop. [duplicate]Swift + Core Data 只保存最后一个循环。 [复制]
【发布时间】:2018-06-13 14:37:27
【问题描述】:

我正在尝试最基本的核心数据实现,但由于某种原因,我似乎无法让它工作。

我从服务器上的 json 文件中获取数据并像这样保存数据:

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context  = appDelegate.persistentContainer.viewContext
context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
let users = NSEntityDescription.insertNewObject(forEntityName: "Users", into: context)

Alamofire.request(jsonLocation).responseJSON { (responseData) -> Void in
    if((responseData.result.value) != nil) {
        let swiftyJsonVar = JSON(responseData.result.value!)

            for (_, value) in swiftyJsonVar {

                let name = value["name"].stringValue
                let age = value["age"].stringValue

                //print("User: \(name)(\(age)).")

                users.setValue(name, forKey: "name")
                users.setValue(rank, forKey: "age")

                do {
                    try context.save()
                    print("Saved..... ")
                } catch {
                    print("save error")
                }

            }

    } else {
        print("response is nil")
    }
}

当我尝试使用以下方式查看数据时:

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context  = appDelegate.persistentContainer.viewContext


let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")

request.returnsObjectsAsFaults = false

do {
   let results = try context.fetch(request)

    if results.count > 0 {
        for result in results as! [NSManagedObject] {
            if let userName = result.value(forKey: "name") as? String {
                print(userName)
            }
        }
    } else {
        print("no records found")
    }
} catch {
    print("did not get")
}

控制台打印

山德

20 人名单中的姓氏是哪一个。有什么想法吗?

【问题讨论】:

    标签: ios json swift core-data


    【解决方案1】:

    您需要为每个用户拨打NSEntityDescription.insertNewObject。你只调用一次。

    将您的代码更改为:

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context  = appDelegate.persistentContainer.viewContext
    context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
    
    Alamofire.request(jsonLocation).responseJSON { (responseData) -> Void in
        if((responseData.result.value) != nil) {
            let swiftyJsonVar = JSON(responseData.result.value!)
    
            for (_, value) in swiftyJsonVar {
                let name = value["name"].stringValue
                let age = value["age"].stringValue
    
                //print("User: \(name)(\(age)).")
    
                let user = NSEntityDescription.insertNewObject(forEntityName: "Users", into: context)
                user.setValue(name, forKey: "name")
                user.setValue(rank, forKey: "age")
            }
    
            do {
                try context.save()
                print("Saved..... ")
            } catch {
                print("save error")
            }
        } else {
            print("response is nil")
        }
    }
    

    【讨论】:

    • 如果你愿意,你也可以在你的 for 循环完成后只保存一次。
    • 太棒了。谢谢。我不敢相信事情就这么简单。谢谢你。我不能接受 9 分钟,所以会接受 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 2019-08-01
    相关资源
    最近更新 更多