使用核心数据将联系人保存到tableview中

时间:2016-12-30 22:59:58

标签: ios swift uitableview core-data swift2

我有一个使用iOS 9+的Contacts框架的应用程序。我制作了一个tableview,用户可以保存一些选定的联系人。我希望能够保留此联系人列表。做这个的最好方式是什么?我在考虑使用核心数据。

我的问题是联系人是“var Contacts = CNContact”因此不是NSManagedObject类型。我的印象是,使用核心数据保存数据时,变量必须是NSManagedObject类型,而我的变量是CNContact类型。

1 个答案:

答案 0 :(得分:1)

以下是使用plists保存数据的示例。假设您有一个对象,例如" User"。例如,该用户具有用户名和密码。

然后在你的用户类中你应该有这样的东西:

class User: NSObject, NSCoding {

var username: String
var password: String

required init?(coder aDecoder: NSCoder) {
    username = aDecoder.decodeObject(forKey: "Username") as! String
    password = aDecoder.decodeObject(forKey: "Password") as! String
    }

init(username: String, password: String, subjects: [Subject], colorPreferences: [Subject: UIColor], assessments: [Assessment]) {
    self.username = username
    self.password = password

}

func encode(with aCoder: NSCoder) {
    aCoder.encode(username, forKey: "Username")
    aCoder.encode(password, forKey: "Password")

}

}

然后你需要在viewController中做什么,你正在使用用户对象:

var loggedInUser: User?

class MyViewController: UIViewController {

func documentsDirectory() -> String {
    let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
    return paths[0]
}

func dataFilePath() -> String {
    return (documentsDirectory() as NSString).appendingPathComponent("AppInfo.plist") //name of your plist
}

func saveData() {

    let data = NSMutableData()
    let archiver = NSKeyedArchiver(forWritingWith: data)
    archiver.encodeObject(loggedInUser, forKey: "Logged In User") //whatever key you want
    archiver.finishEncoding()
    data.write(toFile: dataFilePath(), atomically: true)


}

func loadData() {
    let path = dataFilePath()

    if FileManager.default.fileExists(atPath: path){

        if let data = NSData(contentsOfFile: path){

            let unarchiver = NSKeyedUnarchiver(forReadingWith: data as Data)
            loggedInUser = unarchiver.decodeObjectForKey("Logged In User") as? UserProfile

            unarchiver.finishDecoding()
        }

    }
}

}

所以这是一个简化版本,但您应该能够调整它以保存您的CNContacts列表。如果有任何问题,请告诉我。我在自己的应用程序中使用此代码,因此它应该可以正常工作。