iOS Swift - 如何使用Core Data存储数组?

时间:2015-03-13 09:18:22

标签: ios swift core-data

我是iOS开发的新手,我想知道应该指定哪种数据类型来存储多个字符串(数组)。该应用程序与食物有关,我需要将多种成分存储为一个属性。

我当时正在考虑将原料作为实体,但我只是想让原料变得容易。 我读过有关可转换类型的内容,但人们似乎并不建议使用它来存储数组。

4 个答案:

答案 0 :(得分:12)

警告:提前找到答案。

你不是。

将数据存储在数组中并不会让您更轻松。相反,它会让事情变得更加困难一小时。想象一下,你想要显示包含所选成分的所有食谱。对于你的阵列黑客而言,这并不容易,只要有一行代码就可以使用合适的模型。

我建议与"加入实体"使用良好的旧关系。

basic Recipe data model

是的,这比黑客攻击更难复杂。但这是正确的方法。

答案 1 :(得分:2)

你在想什么才是你应该做的。核心数据用于存储数组结构中的值。您应该创建实体成分并将您的食品实体(或您想要称之为的任何实体)与成分实体的关系连接起来。

答案 2 :(得分:1)

有一种方法。您可以手动执行每个元素,例如 你有你的阵列:

let employee: NSMutableArray = []

employee.addObject(["name":"Bill","LastName":"Hanks"])
employee.addObject(["name":"Rolex","LastName":"Swarzer"])
employee.addObject(["name":"Clive","LastName":"Martin"])
employee.addObject(["name":"Jimi","LastName":"Hendrix"])

假设您已使用Entity" Employee"创建了您的coreData。和属性"名称"和"姓氏"您执行以下操作将其添加到...

let appDel = UIApplication.sharedApplication().delegate as! AppDelegate
let context = appDel.managedObjectContext

for item in employee {
    do {
        let newUser = NSEntityDescription.insertNewObjectForEntityForName("Employee", inManagedObjectContext: context)
        newUser.setValue(item["name"], forKey: "name")
        newUser.setValue(item["LastName"], forKey: "lastname")
        try context.save()
    } catch {
        //do nothing
    }

然后,您可以使用获取请求或NSFetched结果控制器

获取所有元素

答案 3 :(得分:0)

我已经在Swift 4中完成了

将更多阵列存储到 allDataArray (一个阵列)中。从 CoreData (AllData)获取数组对象并在TableView中显示

import UIKit
import Foundation
import CoreData

class ViewController: UIViewController {

    var allTableDataArray : [AllData] = [AllData]()
    let allDataArray : NSMutableArray = []

    var listOfArray1 = ["#849578", "#849302"]
    var listOfArray2 = ["Vasuki Shiv", "Prathap Dusi"]

    override func viewDidLoad() {
        super.viewDidLoad()

        saveAllDataToCoredata()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)

        fetchAllDataFromCoredata()
    }


    func saveAllDataToCoredata() {

        deleteAllData(entity: "AllData")

            let context = PersistenceSerivce.context
            allDataArray.add(["requestNo" : listOfArray1[0], "vendorName" : listOfArray2[0]])
            allDataArray.add(["requestNo" : listOfArray1[1] , "vendorName" : listOfArray2[1]])

        for item in (allDataArray){
            do {
                let newUser = NSEntityDescription.insertNewObject(forEntityName: "AllData", into: context)

                guard let requestNoNew = item as? [String:Any] else {
                    return
                }
                let requestNoStr = requestNoNew["requestNo"]  as! String
                newUser.setValue(requestNoStr, forKey: "requestNo")

                guard let vendorNameNew = item as? [String:Any] else {
                    return
                }
                let vendorNameStr = vendorNameNew["vendorName"]  as! String
                newUser.setValue(vendorNameStr, forKey: "vendorName")
                PersistenceSerivce.saveContext()
                try context.save()
            } catch {
                //do nothing
            }
        }
    }

    func fetchAllDataFromCoredata(){

        let context = PersistenceSerivce.context
        let fetchRequest = NSFetchRequest<AllData>(entityName: "AllData")
        allTableDataArray.removeAll()
        do {
            allTableDataArray = try context.fetch(fetchRequest)
        } catch {
            print("Unable to fetch from Coredata", error)
        }
    }

    func deleteAllData(entity: String) {

        let managedContext = PersistenceSerivce.context
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
        fetchRequest.returnsObjectsAsFaults = false

        do
        {
            let results = try managedContext.fetch(fetchRequest)
            for managedObject in results
            {
                let managedObjectData:NSManagedObject = managedObject as! NSManagedObject
                managedContext.delete(managedObjectData)
            }
        } catch let error as NSError {
            print("Delete all data in \(entity) error : \(error) \(error.userInfo)")
        }
    }
}

//MARK:- UITableView
extension ViewController : UITableViewDelegate, UITableViewDataSource {

    func tableView(_ tableView: UITableView,

                   heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 44
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return (allTableDataArray.count)
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: “TableViewCellID”) as? TableViewCell
        let allData = allTableDataArray[indexPath.row]
        cell?.requestNoLabel.text = allData.requestNo
        cell?.vendorNameLabel.text = allData.vendorName
        return cell!
    }
}