在 NSManagedObject 类中获取和保存数据的函数

Posted

技术标签:

【中文标题】在 NSManagedObject 类中获取和保存数据的函数【英文标题】:Functions for fetching and saving data in an NSManagedObject class 【发布时间】:2015-06-08 11:47:23 【问题描述】:

我想直接在类定义中实现核心数据的保存和获取。但是当我尝试实例化它时,我收到以下错误: “CoreData:错误:无法在 NSManagedObject 类‘用户’上调用指定的初始化程序”。谁能告诉我我做错了什么?实体已创建,类以项目名称为前缀。当我在 ViewController 中有这些函数时它可以工作,但是当我尝试在类中实现它时出现错误。

到目前为止我的代码是:

import Foundation
import CoreData
import UIKit

@objc(User)
class User: NSManagedObject 

@NSManaged var name: String
@NSManaged var email: String

var users = [NSManagedObject]()

func saveUser(name: String, email: String) 
    //1
    let appDelegate =
    UIApplication.sharedApplication().delegate as AppDelegate

    let managedContext = appDelegate.managedObjectContext!

    //2
    let entity =  NSEntityDescription.entityForName("User",
        inManagedObjectContext:
        managedContext)

    let user = NSManagedObject(entity: entity!,
        insertIntoManagedObjectContext:managedContext)

    //3
    user.setValue(name, forKey: "name")
    user.setValue(email, forKey: "email")

    //4
    var error: NSError?
    if !managedContext.save(&error) 
        println("Could not save \(error), \(error?.userInfo)")
    
    //5
    users.append(user)


func fetchUser() 
    //1
    let appDelegate =
    UIApplication.sharedApplication().delegate as AppDelegate

    let managedContext = appDelegate.managedObjectContext!

    //2
    let fetchRequest = NSFetchRequest(entityName:"User")

    //3
    var error: NSError?

    let fetchedResults =
    managedContext.executeFetchRequest(fetchRequest,
        error: &error) as? [NSManagedObject]

    if let results = fetchedResults 
        users = results
     else 
        println("Could not fetch \(error), \(error!.userInfo)")
    


func isValidEmail(testStr:String) -> Bool 
    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]2,4"
    if let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx) as NSPredicate? 
        return emailTest.evaluateWithObject(testStr)
    
    return false
  

在 ViewController 中实例化:

var userInstance:User = User()

【问题讨论】:

var userInstance:User = User() 在不使用指定初始化程序的情况下创建用户对象。 那我该如何初始化呢?我找到的大多数例子都是在 Objective-C 中的,我几乎不知道 Swift,所以请你帮忙吗? :) 您已经在fetchUser() 方法中正确地做到了:let user = NSManagedObject(entity: entity!, insertIntoManagedObjectContext:managedContext) 那我为什么会收到错误消息?我可以像在 C# 中一样使这个类“静态”,这样我就不必实例化它了吗? 调用User() is 创建它的一个实例(或尝试这样做),并使该类等效于 Swift 中的 C# 的 static 类实际上意味着有no 初始化器,因此,您将无法使用 NSManagedObject() 方法实例化它。我的意思是,它只是没有意义。如果这对您正在做的事情有意义,您可能会创建函数的 class 函数。 【参考方案1】:

var userInstance:User = User() 不使用指定的初始化器创建用户对象,这会导致错误消息。

如果创建此User 对象的唯一原因 是调用saveUser()fetchUser() 方法然后它是 错误的方法,您应该将方法定义为 class 方法:

class func saveUser(name: String, email: String)  ... 

class func fetchUser()  ... 

然后你可以称之为

User.saveUser(...)
User.fetchUser()

但请注意

var users = [NSManagedObject]()

不应是User 类的属性。应该是(例如) 视图控制器的属性,正确键入为

var users = [User]()

fetchUser() 方法应该返回一个数组。

【讨论】:

听起来不错,但我不是 ios 开发人员(显然),所以我不知道该怎么做:/。感谢您抽出宝贵时间,但显然我需要查看文档。 我完全按照你说的做了,它部分有效,但我仍然得到以下信息:“CoreData:警告:无法为实体“用户”加载名为“AppName.User”的类。找不到类,而是使用默认的 NSManagedObject。”您可以添加任何可以帮助我解决此问题的内容吗? @MarkoMiletić:参见***.com/questions/25076276/… 及其各种答案。 当我从类名中删除“AppName”时它起作用了,不知道为什么通常它需要在那里,但现在可以了。 :) 再次感谢您的帮助。

以上是关于在 NSManagedObject 类中获取和保存数据的函数的主要内容,如果未能解决你的问题,请参考以下文章

保存对 NSManagedObject 的更改

避免获取已删除的 NSManagedObject

在 NSManagedObject 类中初始化 @NSManaged 变量?

消失的 NSManagedObject

核心数据 - NSManagedObject 返回 nil

无论当前上下文状态如何,如何获取 NSManagedObject 的持久存储副本