CoreData 在设备上发生错误,但在模拟器上很好
Posted
技术标签:
【中文标题】CoreData 在设备上发生错误,但在模拟器上很好【英文标题】:CoreData occurred error on device but fine on simulator 【发布时间】:2014-11-06 11:18:10 【问题描述】:我只是尝试使用核心数据做一些事情,我的目标是创建一个带有子上下文的对象,为一个对象分配值,然后在做一些操作后将其保存到存储中。
在模拟器上运行正常,但在设备上运行时出错。
这是错误:
CoreData: 错误: 改变一个托管对象 0x174033540 (0x1740cb600) 从其上下文中删除后。
我的代码:
扩展
extension NSManagedObject
class func GV_New() -> NSManagedObject
let entity = self.MR_entityDescription();
let parentContext = NSManagedObjectContext.MR_defaultContext();
let childContext = NSManagedObjectContext.MR_contextWithParent(parentContext);
let managedObject = NSManagedObject(entity: entity, insertIntoManagedObjectContext: childContext);
return managedObject;
class func GV_Insert(object: NSManagedObject) -> Bool
var result: Bool = false;
let keyPath = "userInfo.primaryKey";
let primaryKey = self.MR_entityDescription().valueForKeyPath(keyPath) as String!;
if primaryKey != nil
if (self.MR_findFirstByAttribute(primaryKey, withValue: object.valueForKey(primaryKey)) != nil)
result = false;
else
let managedObjectId = object.objectID;
let managedObjectContext = object.managedObjectContext;
let managedObject = managedObjectContext!.existingObjectWithID(managedObjectId, error: nil);
managedObject?.managedObjectContext?.MR_saveOnlySelfAndWait();
NSManagedObjectContext.MR_defaultContext().MR_saveToPersistentStoreAndWait();
result = true;
return result;
视图控制器
class ViewController: UIViewController
var camera: Camera!;
override func viewDidLoad()
super.viewDidLoad();
println("\(Camera.MR_countOfEntities())");
camera = Camera.GV_New() as Camera;
camera.camera_id = 4567;
Camera.GV_Insert(camera);
println("\(Camera.MR_countOfEntities())");
for (index, value) in enumerate(Camera.MR_findAll())
let result = value as Camera;
println("result: \(value.camera_id)");
【问题讨论】:
【参考方案1】:刚刚解决了这个问题,
我没有保留子上下文,因为 swift 还不支持类变量,
只需在文件上设置 managedContext。
让 managedContext = NSManagedObjectContext.MR_context();
let managedContext = NSManagedObjectContext.MR_context();
extension NSManagedObject
class func GV_New() -> NSManagedObject
return self.MR_createInContext(managedContext) as NSManagedObject;
class func GV_Insert(object: NSManagedObject) -> Bool
var result: Bool = false;
let keyPath = "userInfo.primaryKey";
let primaryKey = self.MR_entityDescription().valueForKeyPath(keyPath) as String!;
if primaryKey != nil
if (self.MR_findFirstByAttribute(primaryKey, withValue: object.valueForKey(primaryKey)) != nil)
result = false;
else
object.managedObjectContext?.MR_saveOnlySelfAndWait();
NSManagedObjectContext.MR_defaultContext().MR_saveToPersistentStoreAndWait();
result = true;
return result;
【讨论】:
如果您使用的是 MagicalRecord 3.0,则不需要这个以上是关于CoreData 在设备上发生错误,但在模拟器上很好的主要内容,如果未能解决你的问题,请参考以下文章
UIWebview 在 iPhone 设备上很慢,在模拟器上很快
iPhone 核心数据 - 获取的托管对象未在设备上发布(在模拟器上很好)
Xcode 5 项目在模拟器 3.5 上运行,但在设备上出现链接器错误