Ios 如何保存核心数据?

Ios 如何保存核心数据?,ios,swift,core-data,binary-data,Ios,Swift,Core Data,Binary Data,我已经搜索了一些关于如何在核心数据中存储NSArray的示例代码有一段时间了,但没有找到任何运气。我现在知道如何存储数据,比如NSStrings、NSDate和其他类型的数据,但很难存储NSArray。我读过很多文章,说你必须把它写到磁盘上,然后写到文件上,但我似乎不明白 import UIKit class Person: NSObject { var fullName : String! var mobileNumbers : [Mobile]! } import UIKit clas

我已经搜索了一些关于如何在核心数据中存储NSArray的示例代码有一段时间了,但没有找到任何运气。我现在知道如何存储数据,比如NSStrings、NSDate和其他类型的数据,但很难存储NSArray。我读过很多文章,说你必须把它写到磁盘上,然后写到文件上,但我似乎不明白

import UIKit

class Person: NSObject {
var fullName : String!
var mobileNumbers : [Mobile]!
}

import UIKit

class Mobile: NSObject {

    var mobileNumber : String!
 }

// core data save method
下面的方法显示保存到核心数据

 func save(name: Person) {


     guard let appDelegate =
            UIApplication.shared.delegate as? AppDelegate else {
                return
        }
         var managedContext = NSManagedObjectContext()

        if #available(iOS 10.0, *) {
             managedContext = appDelegate.persistentContainer.viewContext
        } else {
            // Fallback on earlier versions
        }


        let entity = NSEntityDescription.entity(forEntityName: "Contact",in: managedContext)!

        let person = NSManagedObject(entity: entity,insertInto: managedContext)

         person.setValue(name.fullName, forKeyPath: "fullName")

       if let mob = name.mobileNumberList{

            let arch = NSKeyedArchiver.archivedData(withRootObject: mob[0])
            print(arch)

            person.setValue(arch, forKey: "mobileNumberList")

        }



        do {
            try managedContext.save()
        } catch let error as NSError {
            print("Could not save. \(error), \(error.userInfo)")
        }


    }

U可以在核心数据中存储一个数组

 func save(name: Person) {


     guard let appDelegate =
            UIApplication.shared.delegate as? AppDelegate else {
                return
        }
         var managedContext = NSManagedObjectContext()

        if #available(iOS 10.0, *) {
             managedContext = appDelegate.persistentContainer.viewContext
        } else {
            // Fallback on earlier versions
        }


        let entity = NSEntityDescription.entity(forEntityName: "Contact",in: managedContext)!

        let person = NSManagedObject(entity: entity,insertInto: managedContext)

         person.setValue(name.fullName, forKeyPath: "fullName")

       if let mob = name.mobileNumberList{

            let arch = NSKeyedArchiver.archivedData(withRootObject: mob[0])
            print(arch)

            person.setValue(arch, forKey: "mobileNumberList")

        }



        do {
            try managedContext.save()
        } catch let error as NSError {
            print("Could not save. \(error), \(error.userInfo)")
        }


    }
在.xcdatamodeld文件中,创建实体名称“Contact”,并添加属性(任意名称),然后选择类型“Transformable”

然后


有关swift中核心数据工作的更多详细信息,请勾选此项

 func save(name: Person) {


     guard let appDelegate =
            UIApplication.shared.delegate as? AppDelegate else {
                return
        }
         var managedContext = NSManagedObjectContext()

        if #available(iOS 10.0, *) {
             managedContext = appDelegate.persistentContainer.viewContext
        } else {
            // Fallback on earlier versions
        }


        let entity = NSEntityDescription.entity(forEntityName: "Contact",in: managedContext)!

        let person = NSManagedObject(entity: entity,insertInto: managedContext)

         person.setValue(name.fullName, forKeyPath: "fullName")

       if let mob = name.mobileNumberList{

            let arch = NSKeyedArchiver.archivedData(withRootObject: mob[0])
            print(arch)

            person.setValue(arch, forKey: "mobileNumberList")

        }



        do {
            try managedContext.save()
        } catch let error as NSError {
            print("Could not save. \(error), \(error.userInfo)")
        }


    }
在.xcdatamodeld文件中,创建实体名称“Contact”,并添加属性(任意名称),然后选择类型“Transformable”

然后

有关swift中核心数据工作的更多详细信息,请勾选此项

   guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {return}

                let managedContext = appDelegate.persistentContainer.viewContext
                let user:UserModel =  NSEntityDescription.insertNewObject(forEntityName: "User", into: managedContext) as! UserModel


                user.name = txtName.text!

              var arr: [UInt32] = [32, 4, UInt32.max]
         let data = Data(buffer: UnsafeBufferPointer(start: &arr, count: arr.count))                

                user.arr = data



                do {
                    try managedContext.save()


                } catch let error as NSError
                {
                    print("Could not save. \(error), \(error.userInfo)")
                }
试试这个:-

   guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {return}

                let managedContext = appDelegate.persistentContainer.viewContext
                let user:UserModel =  NSEntityDescription.insertNewObject(forEntityName: "User", into: managedContext) as! UserModel


                user.name = txtName.text!

              var arr: [UInt32] = [32, 4, UInt32.max]
         let data = Data(buffer: UnsafeBufferPointer(start: &arr, count: arr.count))                

                user.arr = data



                do {
                    try managedContext.save()


                } catch let error as NSError
                {
                    print("Could not save. \(error), \(error.userInfo)")
                }

简而言之,你不能

您有两种选择:

  • 为您的移动对象(在您的数据模型中)创建一个新的核心数据实体,并使用1:many关系链接到Person。核心数据将自动为您生成方法(例如addToMobiles(uValue:Mobile))

  • 将Person的属性建模为NSString中的“mobileNumbers”。然后将手机号码存储为JSON blob(或任何其他结构)


  • 第一种可能更“正确”,但如果您只存储数字,第二种更容易。

    简而言之,您不能

    您有两种选择:

  • 为您的移动对象(在您的数据模型中)创建一个新的核心数据实体,并使用1:many关系链接到Person。核心数据将自动为您生成方法(例如addToMobiles(uValue:Mobile))

  • 将Person的属性建模为NSString中的“mobileNumbers”。然后将手机号码存储为JSON blob(或任何其他结构)


  • 第一种可能更“正确”,但如果只存储数字,第二种更容易。

    coredata提供了一种称为可转换的选项数据类型,而不是使用Archiver。您可以在实体中将数据类型设置为可转换。。查看我在这个链接上的答案,将字典替换为数组类型看起来您已经有了执行此操作的代码,用于
    mobileNumberList
    属性。它不起作用吗?如果没有,具体出了什么问题?coredata没有使用Archiver,而是提供了一个名为Transformable的选项数据类型。您可以在实体中将数据类型设置为可转换。。查看我在这个链接上的答案,将字典替换为数组类型看起来您已经有了执行此操作的代码,用于
    mobileNumberList
    属性。它不起作用吗?如果没有,具体出了什么问题?根据您@venkat更改数组类型根据您@venkat更改数组类型