我知道这已被问过几次,但通常的解决方案对我来说似乎不起作用。我使用< 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")
控制台输出: 虽然对象没有在控制台中打印,但似乎已经以某种方式创建并在该对象上设置值引用了核心数据对象
当我在没有子类的情况下使用它时,它按预期工作(将类名设置回默认值):
let object = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: CoreDataManager.sharedInstance.managedObjectContext) as NSManagedObject
println("-->\(object)<--")
输出:
这是我的子类声明:
import Foundation
import CoreData
class User: NSManagedObject {
@NSManaged var userID: NSNumber
@NSManaged var username: String
}
这里是核心数据模型表单:
代码有什么问题?或者我会错过什么?
答案 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)