Core data ManagedObjectModel子类没有';我不能在斯威夫特工作
总结一下我所做的工作:Core data ManagedObjectModel子类没有';我不能在斯威夫特工作,core-data,swift,nsmanagedobject,nsmanagedobjectmodel,Core Data,Swift,Nsmanagedobject,Nsmanagedobjectmodel,总结一下我所做的工作: 创建了一个名为2048的项目 创建了NSManagedObject的子类 class BestScore: NSManagedObject { @NSManaged var bestScoreModel: BestScoreModel func update(score: Int) { self.bestScoreModel!.score = score } } 创建了NSManagedObjectModel的子类 class
class BestScore: NSManagedObject {
@NSManaged var bestScoreModel: BestScoreModel
func update(score: Int) {
self.bestScoreModel!.score = score
}
}
class BestScoreModel: NSManagedObjectModel {
@NSManaged var score: Int
}
class HomeViewController: UIViewController {
var bestScore: BestScore?
@lazy var context: NSManagedObjectContext = {
let serviceName = NSBundle.mainBundle().infoDictionary.objectForKey("CFBundleName") as String
let modelURL = NSBundle.mainBundle().URLForResource(serviceName, withExtension: "momd")
let model = NSManagedObjectModel(contentsOfURL: modelURL)
if model == nil {
println("Error initilizing model from : \(modelURL)")
abort()
}
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: model)
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
let storeURL = (urls[urls.endIndex-1]).URLByAppendingPathComponent("\(serviceName).sqlite")
var error: NSError? = nil
var store = coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: &error)
if store == nil {
println("Failed to load store at \(storeURL) with error: \(error?.localizedDescription)")
abort()
}
var context = NSManagedObjectContext()
context.persistentStoreCoordinator = coordinator
return context
}()
override func viewDidLoad() {
super.viewDidLoad()
let entity: NSEntityDescription = NSEntityDescription.entityForName("BestScoreModel", inManagedObjectContext: context)
bestScore = BestScore(entity: entity, insertIntoManagedObjectContext: context)
bestScore.update(0)
}
}
2014-07-13 00:56:59.944 2048[76600:4447122] -[NSManagedObject update:]: unrecognized selector sent to instance 0x10bc55d20
2014-07-13 00:56:59.948 2048[76600:4447122] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSManagedObject update:]: unrecognized selector sent to instance 0x10bc55d20'
我对iOS开发完全是新手,以前没有任何经验。我想利用Swift作为一个机会,在不学习objective-c的情况下开始编写应用程序。如果我有什么配置错误,请告诉我
谢谢你的帮助
PS:我从中获得托管对象上下文的实现。非常感谢作者 NSManagedObjectModel描述了应用程序中使用的所有实体的集合,通常没有理由对其进行子类化 我建议您对实体和对应实体使用相同的名称 托管对象子类。(这也是Xcode在创建Objective-C托管对象子类时所做的) Swift托管对象子类(Xcode还不能自动创建) 看起来就像这样:
class BestScore: NSManagedObject {
@NSManaged var score: NSNumber
}
我使用了NSNumber
类型而不是Int16
,因为Swift中的标量访问器方法
对象子类尚未正常工作,请进行比较
然后将使用创建一个新的BestScore对象
bestScore = NSEntityDescription.insertNewObjectForEntityForName("BestScore", inManagedObjectContext: context) as BestScore
您可以直接访问其属性,而无需使用update()
函数:
bestScore!.score = 0
附加说明:将bestScore
属性定义为
隐式展开可选,因为您希望它在
viewDidLoad:
。这将在以后为您节省许多显式展开:
var bestScore: BestScore!
此外,如果应用程序再次运行,则可能需要重新加载
现有最佳分数,而不是创建新对象。
这意味着您必须首先执行一个获取请求,然后插入一个新的
对象(仅当未找到时):
let request = NSFetchRequest(entityName: "BestScore")
var error : NSError?
let result = context.executeFetchRequest(request, error: &error)
if !result || result.count == 0 {
// Error or no object found: create new one:
bestScore = NSEntityDescription.insertNewObjectForEntityForName("BestScore", inManagedObjectContext: context) as BestScore
bestScore.score = 0
} else {
// Use existing object:
bestScore = result[0] as BestScore
}
let score = bestScore.score.integerValue // NSNumber --> Integer
尝试为
.xcdatamodeld
文件中的实体指定模块名称。有关详细说明,请参见本书的“实现核心数据管理对象子类”部分。很抱歉响应太晚。我尝试了你的建议,现在我能够实例化托管对象上下文。但调用NSEntityDescription.insertNewObjectForEntityForName()时仍会出现异常。线程异常是:thread#1:tid=0x3b9e05,0x00000001001e4dfa libswift_stdlib_core.dylib swift_dynamiccastcastcastcastcastcastcastcastcastcastcastcastcastcastcastcastcast+106,queue='com.apple.main thread',-stop-reason=EXC_断点(code=EXC_I386_BPT,subcode=0x0)
@Bing:我想我在发布代码之前已经测试过了,它运行正常。您是否在核心数据模型检查器中将实体的“实体”和“类”都设置为“BestScore”?如果您指的是2048.xcdatamodeld文件,则是的,我已将实体重命名为BestScore,将类重命名为2048.BestScore。我还试着把这门课评为最佳成绩。两个案例都引发了相同的异常:(我肯定遗漏了一些东西,我觉得用swift进行调试非常困难,我不确定Objective-C,但我使用了我原来的方式(分别创建NSEntityDescription和BestScore)它成功了!但现在我在尝试调用更新方法时遇到了另一个异常。按照您的建议直接更改分数值确实有效,但我仍然希望更新方法能够工作,因为这主要是为了学习。我遇到的异常是因未捕获的异常“NSInvalidArgumentEx”而终止应用程序异常“,原因:”-[NSManagedObject updateBestScore:withBestLevel:::无法识别的选择器已发送到实例0x10bf39e50'
非常感谢您的帮助!