【问题标题】: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

标签: ios swift core-data appdelegate


【解决方案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)
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-19
        相关资源
        最近更新 更多