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