iOS Swift-如何使用核心数据存储阵列?

iOS Swift-如何使用核心数据存储阵列?,ios,swift,core-data,Ios,Swift,Core Data,我是iOS开发新手,想知道应该指定哪种数据类型来存储多个字符串(数组)。该应用程序与食物有关,我需要将多种成分存储为一个属性 我想把配料做成一个整体,但我只想让它成为一个简单的开胃菜。 我读过关于transformable type的文章,但人们似乎不推荐使用它来存储数组。您所想的正是您应该做的。核心数据用于以类似数组的结构存储值。你应该创建实体成分,并将你的食物实体(或你想叫它的任何东西)与成分实体的关系联系起来。警告:前面的答案是自以为是的 你没有 将东西存储在数组中并不会使任何事情变得更容

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

我想把配料做成一个整体,但我只想让它成为一个简单的开胃菜。
我读过关于transformable type的文章,但人们似乎不推荐使用它来存储数组。

您所想的正是您应该做的。核心数据用于以类似数组的结构存储值。你应该创建实体成分,并将你的食物实体(或你想叫它的任何东西)与成分实体的关系联系起来。

警告:前面的答案是自以为是的

你没有

将东西存储在数组中并不会使任何事情变得更容易。相反,一个小时后,事情会变得更加困难。假设您想要显示包含选定成分的所有食谱。这对你的数组黑客来说并不容易,有了一个合适的模型,它只需要几行代码

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


是的,这比拼凑一些几乎不起作用的东西要复杂得多。但这是正确的方法

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

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"])
假设您已经使用实体“Employee”和属性“name”和“lastname”创建了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 Results控制器提取所有元素

将更多数组存储到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!
    }
}
导入UIKit
进口基金会
导入CoreData
类ViewController:UIViewController{
变量allTableDataArray:[AllData]=[AllData]()
让allDataArray:NSMutableArray=[]
var listOfArray1=[“#849578”,“#849302”]
var listOfArray2=[“Vasuki Shiv”,“Prathap Dusi”]
重写func viewDidLoad(){
super.viewDidLoad()
saveAllDataToCoredata()
}
覆盖函数视图将出现(uo动画:Bool){
super.viewwillbeen(true)
fetchAllDataFromCoredata()
}
func saveAllDataToCoredata(){
deleteAllData(实体:“AllData”)
让context=PersistenceSerivce.context
allDataArray.add([“requestNo”:listOfArray1[0],“vendorName”:listOfArray2[0]]))
allDataArray.add([“requestNo”:listOfArray1[1],“vendorName”:listOfArray2[1]]))
对于中的项(allDataArray){
做{
让newUser=NSEntityDescription.insertNewObject(forEntityName:“AllData”,插入:上下文)
guard let requestNoNew=项目为?[String:Any]其他{
返回
}
让requestNoStr=requestNoNew[“requestNo”]作为!字符串
setValue(requestnoster,forKey:“requestNo”)
guard let vendorNameNew=项目为?[字符串:任何]其他{
返回
}
让vendorNameStr=vendorNameNew[“vendorName”]作为!字符串
setValue(vendorNameStr,forKey:“vendorName”)
PersistenceSerivce.saveContext()
尝试context.save()
}抓住{
//无所事事
}
}
}
func fetchAllDataFromCoredata()函数{
让context=PersistenceSerivce.context
let fetchRequest=NSFetchRequest(entityName:“AllData”)
allTableDataArray.removeAll()
做{
allTableDataArray=try context.fetch(fetchRequest)
}抓住{
打印(“无法从Coredata中提取”,错误)
}
}
func deleteAllData(实体:字符串){
让managedContext=PersistenceSerivce.context
let fetchRequest=NSFetchRequest(entityName:entity)
fetchRequest.returnsObjectsAsFaults=false
做
{
let results=尝试managedContext.fetch(fetchRequest)
对于结果中的managedObject
{
让managedObjectData:NSManagedObject=managedObject为!NSManagedObject
managedContext.delete(managedObjectData)
}
}将let错误捕获为NSError{
打印(“删除\(实体)错误:\(错误)\(错误.用户信息)”中的所有数据)
}
}
}
//MARK:-UITableView
扩展视图控制器:UITableViewDelegate、UITableViewDataSource{
func tableView(tableView:UITableView,
indexPath:indexPath)->CGFloat的高度{
返回44
}
func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{
返回(allTableDataArray.count)
}
func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
将cell=tableView.dequeueReusableCell(标识符为:“TableViewCellID”)设为TableViewCell
让allData=allTableDataArray[indexPath.row]
单元格?.requestNoLabel.text=allData.requestNo
单元格?.vendornamelab.text=allData.vendorName
返回单元!
}
}

谢谢:)我会选择正确的方法。但是这些数据存储在哪里?谢谢你的建议。你说得对。我应该做得很好。你能告诉我是否需要在联合实体中显式创建配方id和成分id的属性吗?或者,如果建立了关系,xcode会自动处理它吗?我明白你所说的排序和显示搜索结果的意思了。但是,他现在不需要自定义Ingreditet对象数组吗?我的应用程序需要一个字符串数组(并且不会从上面的模型中受益),我仍然不知道如何存储数组。有什么帮助吗?它有一个与我的主实体关联的文件路径列表,最大大小为10。所以即使我创建了一个新的文件路径