无法将值保存到核心数据

Posted

技术标签:

【中文标题】无法将值保存到核心数据【英文标题】:Unable to save values to Core Data 【发布时间】:2018-08-06 05:50:09 【问题描述】:

我正在尝试将数据存储到 AppDelegate 本身的核心数据中,然后从 ViewController 获取该数据。由于某种原因,它没有保存在 Core-Data 中。我已经尝试在互联网上搜索这个问题,但没有得到任何具体的解决方案。我已经粘贴了下面的代码 -

AppDelegate.swift

func saveContext () 
    let context = persistentContainer.viewContext
    print(context)
    let entity = NSEntityDescription.entity(forEntityName: "Msg", in: context)
    print(entity)
    let new = NSManagedObject(entity: entity!, insertInto: context)
    print(new)
    print(getData.alert_message)
    new.setValue(getData.alert_message, forKey: "title")
    do 
        try context.save()
        print("save")
        print(new.value(forKey: "title"))
     catch 
        let nserror = error as NSError
        fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
      

控制台输出

【问题讨论】:

请提供您正在打印的日志详细信息。 不清楚您是否在保存或获取时遇到问题,标题说明的是一回事,而文字说明的是另一回事。 获取数据是后面的部分,首先我需要检查它是否存储在核心数据中。 @Khushbu 我已经提供了日志截图 代码有什么问题?根据控制台输出,记录被保存。但是你为什么不为NSManagedObject 子类和点表示法使用通用API 【参考方案1】:

您可以通过NSFetchRequest从实体中获取记录

尝试以下方法,您只需将实体名称作为函数的参数传递。

func getAllRecordFromTableWhere(_ tableName: String) -> [NSManagedObject]? 
    let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: tableName)
    do 
        return try managedContext.fetch(fetchRequest)
     catch let error as NSError 
        print("Could not fetch. \(error), \(error.userInfo)")
    
    return nil

并调用类似

的函数
if let arrayOfData = DBHelper.getAllRecordFromTableWhere("Msg") 
    print(arrayOfData)

【讨论】:

【参考方案2】:
 Hear I have Set My Own Solution, Hope This help You


let contex = ((UIApplication.shared.delegate) as! AppDelegate).persistentContainer.viewContext

func SaveData()
 
 let entity = NSEntityDescription.insertNewObject(forEntityName: "Employee", into: contex);
        entity.setValue(txtname.text, forKey: "empname") // txtname.text is My TexField name 
        entity.setValue(txtadd.text, forKey: "empadd");
        do
        
            try contex.save();
        
        catch
        

        
 

【讨论】:

【参考方案3】:

我认为您没有为实体的所有属性赋值,因此请先检查。

尝试类似的东西

new.setValue(msgdata, forKey: "msgdata")

//msgdata 是你要保存在 Coredata 实体上的内容

//试试这样的方法

【讨论】:

检查我在问题中的代码我已经在函数本身中尝试过。 new.setValue(getData.alert_message, forKey: "title") 为所有属性赋值并检查所有属性名称是否应与 coredata 中声明的相同。 github.com/Ashutos39/ContactBookDemo希望对您有所帮助。 谢谢你的链接,如果需要我会参考它。【参考方案4】:

就我而言,我试图更新保存在核心数据中的数据。但每次它都返回旧数据(不是更新版本)

保存成功的消息正在与您相同的控制台中打印

这里有一些简单的步骤最终解决了我的问题

使用NSFetchRequest获取数据 将数据保存到临时变量中 从核心数据中删除旧数据 修改临时变量中的数据 最后保存上下文

这是我的更新数据函数

func updateUserData(_ userDetails: UserModel) 

    let request = UserDetails.fetchRequest() as NSFetchRequest<UserDetails>
    do 
        let result = try persistentContainer.viewContext.fetch(request)
        if let data = result.first?.userData as Data? 
            var loginModel = LoginModel(data: data)
            loginModel?.user = userDetails
            self.clearUserData() //deleting old data
            self.userLoginData = loginModel?.jsonData
        
    catch let error as NSError 
        debugPrint(error.localizedDescription)
    


【讨论】:

以上是关于无法将值保存到核心数据的主要内容,如果未能解决你的问题,请参考以下文章

如何将值保存到 YAML 文件中? [复制]

无法保存到核心数据中

需要有关 CoreData 保存的帮助

无法识别的选择器 - 保存到核心数据

无法将自定义对象从 API 保存到核心数据

将值附加到数据数组并保存在 Userdefault swift