Swift CoreData子类不起作用

时间:2014-09-06 16:24:31

标签: core-data swift

我知道这已被问过几次,但通常的解决方案对我来说似乎不起作用。我使用< ProjectName>创建了一个CoreData实体及其子类。< SubclassName>语法为类名。像这样创建一个新对象:

let object = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: CoreDataManager.sharedInstance.managedObjectContext) as User
println("-->\(object)<--")

object.setValue(12, forKey: "userID")
object.setValue("username", forKey: "username")

控制台输出: enter image description here 虽然对象没有在控制台中打印,但似乎已经以某种方式创建并在该对象上设置值引用了核心数据对象

当我在没有子类的情况下使用它时,它按预期工作(将类名设置回默认值):

let object = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: CoreDataManager.sharedInstance.managedObjectContext) as NSManagedObject
println("-->\(object)<--")

输出: enter image description here

这是我的子类声明:

import Foundation
import CoreData

class User: NSManagedObject {

    @NSManaged var userID: NSNumber
    @NSManaged var username: String

}

这里是核心数据模型表单:

enter image description here

代码有什么问题?或者我会错过什么?

4 个答案:

答案 0 :(得分:2)

要打印出NSManagedObject的值,请不要使用:

println(...)

而是使用:

NSLog(...)

请在下面找到使用NSLog和NSManagedObject的示例:

/**
* Called when the user clicks on the save button.
*/
@IBAction func saveTapped(sender: AnyObject) {
    // Reference to our app delegate
    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate

    // Reference MOC
    let context: NSManagedObjectContext = appDel.managedObjectContext!
    let en = NSEntityDescription.entityForName("List", inManagedObjectContext: context)

    // Create instance of put data model and initialize
    var newItem: List = List(entity: en!, insertIntoManagedObjectContext: context)

    // Map our properties
    newItem.item = textFieldItemName.text
    newItem.quantity = textFieldQt.text
    newItem.info = textFieldMoreInfo.text

    // Save our context
    var error: NSError? = nil;
    if (context.hasChanges) {
        if (!context.save(&error)) { // save failed
            println("Save Failed: \(error!.localizedDescription)")
        } else {
            println("Save Succeeded")
        }
    }

    NSLog("newItem: %@", newItem)

    // Navigate back to root ViewController
    self.navigationController?.popToRootViewControllerAnimated(true)
}

注意:我不知道确切的原因(错误或实现可能......)但事实证明,当我们使用println(...)函数时,它不会打印出一个值,而不是它返回一个空字符串。

因此,当你想要打印出NSManagedObject的值时,我建议所有人使用NSLog(...)函数而不是println(...)。

答案 1 :(得分:1)

如果你打印表达式CoreDataManager.sharedInstance.managedObjectContext两次,你每次都会得到一个不同的指针吗?

听起来管理对象上下文在您使用后立即被解除分配,这表明您的CoreDataManager.sharedInstance.managedObjectContext属性每次都返回一个新的托管对象上下文,而不是同一个上下文或您的{{1} } property每次都返回一个新实例。

托管对象的内存中状态存储为对托管对象上下文的弱引用。当上下文从您下面退出时(例如,它不再被引用,因此被释放),您的托管对象的存储将消失。

发生这种情况的一些好指标:

  • 您尚未保存托管对象上下文,但新创建的托管对象显示为错误
  • 当您尝试设置属性时,会出现奇怪的错误
  • 当您尝试检索刚刚设置的属性时,会出现奇怪的错误

答案 2 :(得分:1)

在.swift文件的顶部包含以下内容

导入CoreData

不工作的原因是它不知道要引用哪个库。 希望它有所帮助

答案 3 :(得分:0)

尝试使用此方法创建它:

let entityDescripition = NSEntityDescription.entityForName(“User”, inManagedObjectContext: managedObjectContext)
let user = User(entity: entityDescripition, insertIntoManagedObjectContext: managedObjectContext)