Swift + Core Data仅保存最后一个循环。 [重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

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

我从服务器上的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")
}

控制台打印

Xander的

这是20个列表中的姓氏。任何想法?

ios json swift core-data
1个回答
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")
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.