在 CoreData 中创建实例

Posted

技术标签:

【中文标题】在 CoreData 中创建实例【英文标题】:Creating instance in CoreData 【发布时间】:2017-07-08 18:41:20 【问题描述】:

我正在使用 swift,但我遇到了 CoreData 问题。 我想要实现的是创建文本字段(数量取决于用户)并将它们存储在核心数据中,并在第二个视图中显示此结果。这可能吗? 我有一个提示,我可以为文本字段创建一个实体,并在创建新文本字段时创建和存储该条目的实例,但我该怎么做?

我的应用程序基本上是这样的, firstView -> tableView -> secondView 并且在 firstView 用户可以添加他们想要的尽可能多的文本字段。我想保存这些制作的文本字段的文本并将其显示在 tableView 上。当用户选择单元格时,它会调用 secondView,它基本上是详细视图,并且它需要与 firstView 具有相同数量的文本字段。这可能吗?

谢谢你的变化很大。

【问题讨论】:

基本上不会在 Core Data 中保存 UI 元素的实例。保存相关属性/参数,根据参数动态创建UI元素。 非常感谢 :) 但是抱歉,我该怎么做呢?我一直在研究,但我不知道该怎么做:(如果你能告诉我怎么做,那将非常有帮助 【参考方案1】:

你需要的是一个segue。在 ios 中,CoreData 用于存储一些用户关闭应用程序后可以重复使用的数据。因此,在您的情况下,如果您只想让表格视图在第一个视图中显示用户输入,只需使用 segue。然后,您可以在这个为 segue 准备的方法中传递数据。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if let destinationViewController = segue.destination as? YourTableViewController 

        destinationViewController.texts = self.texts
        //...
    

假设您有 10 个文本字段,并且您希望将其中的文本存储到 Core Data 中。您需要首先获取所有文本并将它们放入一个字符串数组中。将来,当您取出字符串数组时,您将通过对数组进行计数来知道有多少文本字段。

要将数组保存到CoreData,必须先将数组转换成Data,因为CoreData不能接受数组类型。所以转换为 NSData 然后保存到 CoreData 的代码将是

let appDelegate =
    UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
let entity =  NSEntityDescription.entityForName("Device", inManagedObjectContext:managedContext)
let device = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedContext)
let data = NSKeyedArchiver.archivedDataWithRootObject(array)
device.setValue(data, forKey: "dataOfArray")
do 
    try managedContext.save()
    devices.append(device)
 catch let error as NSError  
    print("Could not save \(error), \(error.userInfo)")

当你想取出数据并转换回数组时

let appDelegate =
    UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
let fetchRequest = NSFetchRequest(entityName: "Device")

do 
    let results = try managedContext.executeFetchRequest(fetchRequest)
    if results.count != 0 
        for result in results 
                let data = result.valueForKey("dataOfArray") as! NSData
                let unarchiveObject = NSKeyedUnarchiver.unarchiveObjectWithData(data)
                let arrayObject = unarchiveObject as AnyObject! as! [[String: String]]
                let array = arrayObject
        
    
 catch let error as NSError 
    print("Could not fetch \(error), \(error.userInfo)")

【讨论】:

是的,我知道这一点。但我不知道如何将数据保存到没有属性的护理数据中。因为用户可以制作他们想要的尽可能多的文本字段,所以当我无法设置属性时,我不知道如何保存它。或者我可以吗?我知道我可以设置属性并将数据保存在那里,因为我已经多次使用核心数据。但是我可以用无限数量的文本字段来做到这一点吗?我该怎么做? @dropscar Gocha,最后一个问题。你必须使用核心数据吗?读取和写入数组到核心数据的代码就像 50 行。如果你可以使用 UserDefaults,它只需要写 1 行,读 1 行 不幸的是我这样做了:(这是我正在做的项目,它需要在 CoreData 中。非常感谢你,希望你有一个解决方案:( @dropscar 更新了我的答案 非常感谢您如此快速的回复!我会尽快试试这个!非常感谢 !! :)

以上是关于在 CoreData 中创建实例的主要内容,如果未能解决你的问题,请参考以下文章

在 CoreData 的后台线程中创建实体

使用简单的 init 在测试中创建 CoreData 对象

如何在 coredata 中创建数据库视图

如何在一个类中创建 CoreData 实体并在另一个类中访问?

用 CoreData 对象填充 NSSet

coreData 中的关系如何工作