标签: nsmanagedobjectcontext

不同上下文中对象之间的非法关系:但我只有一个上下文?

我收到以下错误:

'NSInvalidArgumentException',原因:'非法尝试在不同上下文中的对象之间建立关系'条件'

在运行我的iPhone应用程序时.我模型的相关部分如下所示:

AssessmentTree
-has one TreeCrown

TreeCrown
-has one TreeCrownCondition
-has one AssessmentTree

TreeCrownCondition
-has many TreeCrowns
Run Code Online (Sandbox Code Playgroud)

为了上下文,我将提到该模型的这一部分旨在让树艺师记录树冠的状况.它存储了一个用于评估树冠的选项列表,也可以由用户编辑(So TreeCrownConditions包含选项,TreeCrown.condition指向评估中的特定选择).

我有一个UIPickerView加载这些选项,并使用didSelectRow中的以下代码将所选选项与AssessmentTree相关联:inComponent:

TreeCrownCondition *fc = (TreeCrownCondition *)[conditionArray objectAtIndex:[conditionPicker selectedRowInComponent:0]];
tree.crown.condition = fc;
Run Code Online (Sandbox Code Playgroud)

当我运行它时,前几次我选择一个选项一切都很好,但有时(通常在添加/编辑/删除TreeCrownCondition选项后)应用程序将崩溃在上面的行与我在开头发布的错误.

这个错误似乎很容易解决,除了我只在整个应用程序中使用一个NSManagedObjectContext.每个新控制器在加载以下代码时都会抓取它:

if(!managedObjectContext){
    managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}
Run Code Online (Sandbox Code Playgroud)

我找不到关于此错误或如何解决此错误的非常多信息,我当然没有找到任何人在没有使用多个上下文的情况下遇到此问题.

我只能假设我确实有多个上下文,但我看不出这是怎么回事.我错过了什么?

编辑 Heres堆栈跟踪:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship 'condition' between objects in different contexts (source = <TreeCrown: 0x64b9f00> (entity: TreeCrown; id: 0x648db30 <x-coredata://6E17F271-7670-44EA-9901-5AB58DCA8AC7/TreeCrown/p3> …
Run Code Online (Sandbox Code Playgroud)

iphone core-data nsmanagedobjectcontext

7
推荐指数
1
解决办法
2844
查看次数

NSUndoManager,核心数据和选择性撤消/重做

我正在研究一个核心数据应用程序,它具有相当大的托管对象层次结构,类似于树.

创建基础对象时,它会创建一些子对象,这些子对象又创建自己的子对象,依此类推.这些子对象中的每一个都可以使用NSURLConnections收集信息.

现在,我想在managedObjectContext中使用undoManager支持undo/redo.问题是,如果用户创建基础对象,然后尝试撤消该操作,则不会删除基础对象.相反,可以移除一个或多个子对象.显然,这种行为是不可预测的,也是不受欢迎的.

所以我尝试默认禁用撤消注册.我通过disableUndoRegistration:在managedObjectContext中修改任何内容之前调用来完成此操作.然后,在基本操作(例如创建基础对象)之前启用撤销注册,再次重新禁用后续注册.

现在,当我尝试撤消时,我收到此错误:

undo:NSUndoManager 0x1026428b0处于无效状态,使用过多的嵌套撤销组调用undo

思考?

cocoa core-data nsundomanager nsmanagedobject nsmanagedobjectcontext

7
推荐指数
2
解决办法
3187
查看次数

同时可靠地使用核心数据

我正在构建我的第一个iOS应用程序,理论上应该非常简单,但我很难让它足够防弹,让我有信心将它提交到App Store.

简而言之,主屏幕具有表格视图,在选择行时,它将分段到另一个表格视图,该表格视图以主 - 细节方式显示与所选行相关的信息.基础数据每天从Web服务检索为JSON数据,然后缓存在Core Data存储中.删除当天之前的数据以阻止SQLite数据库文件无限增长.所有数据持久性操作都使用Core Data执行,并具有NSFetchedResultsController详细信息表视图的基础.

我看到的问题是,如果你在主屏幕和细节屏幕之间快速切换几次,同时检索,解析和保存新数据,应用程序会冻结或完全崩溃.似乎存在某种竞争条件,可能是由于Core Data在后台导入数据而主线程正在尝试执行获取,但我猜测.我在捕获任何有意义的崩溃信息时遇到了麻烦,通常它是Core Data堆栈中的一个SIGSEGV.

下表显示加载详细信息表视图控制器时发生的事件的实际顺序:

Main Thread                          Background Thread
viewDidLoad

                                     Get JSON data (using AFNetworking)

Create child NSManagedObjectContext (MOC)

                                     Parse JSON data
                                     Insert managed objects in child MOC
                                     Save child MOC
                                     Post import completion notification

Receive import completion notification
Save parent MOC
Perform fetch and reload table view

                                     Delete old managed objects in child MOC
                                     Save child MOC
                                     Post deletion completion notification

Receive deletion completion notification
Save parent MOC

在JSON数据到达时触发AFNetworking完成块后,将NSManagedObjectContext创建嵌套并传递给"导入器"对象,该对象解析JSON数据并将对象保存到Core …

iphone cocoa-touch core-data nsmanagedobjectcontext ios

7
推荐指数
1
解决办法
3242
查看次数

RestKit崩溃,因为NSKagedObjectContext在RKResponseMapperOperation中为nil

我正在研究我的文凭项目,其中包括一个带有Core Data数据库和Ruby on Rails服务器的iOS客户端.我正在使用RestKit进行通信.目前我在使整个系统工作时遇到了一个大问题:当我尝试将响应映射到服务器上的对象时,我得到以下异常:

2013-02-08 22:40:43.947 App[66735:5903] *** Assertion failure in -[RKManagedObjectResponseMapperOperation performMappingWithObject:error:], ~/Repositories/App/RestKit/Code/Network/RKResponseMapperOperation.m:358
2013-02-08 23:04:30.562 App[66735:5903] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Unable to perform mapping: No `managedObjectContext` assigned. (Mapping response.URL = http://localhost:3000/contacts?auth_token=s78UFMq8mCQrr12GZcyx)'
*** First throw call stack:
(0x1de9012 0x1c0ee7e 0x1de8e78 0x16a4f35 0x8f56e 0x8d520 0x1647d23 0x1647a34 0x16d4301 0x23a253f 0x23b4014 0x23a52e8 0x23a5450 0x90ac6e12 0x90aaecca)
libc++abi.dylib: terminate called throwing an exception
Run Code Online (Sandbox Code Playgroud)

我正在尝试从服务器加载一个列表(一个数组)的联系人,这些联系人应该在Core Data中保存为"Users".

我在数据模型类中构建了所有核心数据代码,就像我在本视频中看到的那样:http://nsscreencast.com/episodes/11-core-data-basics.这里是:

头文件:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@interface …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails core-data nsmanagedobjectcontext ios restkit

7
推荐指数
1
解决办法
3386
查看次数

什么是使用NSManagedObjectContext的objectWithID的"正确"方法:

文档说明:

...此方法始终返回一个对象.假定objectID表示的持久性存储中的数据存在 - 如果不存在,则在访问任何属性时(即,触发错误时),返回的对象将引发异常.此行为的好处是它允许您创建和使用故障,然后在以后或在单独的上下文中创建基础行.

在Apple的'Core Recipes'示例应用程序中,该方法的结果用于填充NSFetchRequest,然后使用请求的结果,并对此结果进行注释:

 // first get the object into the context
 Recipe *recipeFault = (Recipe *)[context objectWithID:objectID];

 // this only creates a fault, which may NOT resolve to an object (for example, if the ID is for
 // an objec that has been deleted already):  create a fetch request to get the object for real
 NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
 [request setEntity: [NSEntityDescription entityForName:@"Recipe" inManagedObjectContext:context]];
 NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(self == %@)", recipeFault];
                    [request …
Run Code Online (Sandbox Code Playgroud)

cocoa core-data nsmanagedobjectcontext

6
推荐指数
1
解决办法
3770
查看次数

如何删除核心数据持久性存储

我需要删除我的持久存储(按对象执行它不实用,因为我有超过100,000个对象).我试过这个:

- (IBAction)resetDatabase:(id)sender {

    NSPersistentStore* store = [[__persistentStoreCoordinator persistentStores] lastObject];

    NSError *error = nil;
    NSURL *storeURL = store.URL;

    // release context and model
    [__managedObjectContext release];
    [__managedObjectModel release];
    __managedObjectModel = nil;
    __managedObjectContext = nil;

    [__persistentStoreCoordinator removePersistentStore:store error:nil];

    [__persistentStoreCoordinator release];
    __persistentStoreCoordinator = nil;

    [[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];
    if (error) {
        NSLog(@"filemanager error %@", error);
    }    

     // recreate the stack
     __managedObjectContext = [self managedObjectContext];

}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试之后将实体插入商店时,我收到此错误:

This NSPersistentStoreCoordinator has no persistent stores.  It cannot perform a save operation.
Run Code Online (Sandbox Code Playgroud)

更新: 我尝试在删除持久存储之前释放MOC和MOM,但我仍然得到相同的错误.

cocoa core-data objective-c nsmanagedobjectcontext

6
推荐指数
1
解决办法
9057
查看次数

在XCode中调试:异常断点

我正在调试一个随机的SIGTRAP崩溃,这​​只是在后台发生.这可能与某个NSManagedObjectContext地方有关.

除此之外,我正在尝试使用异常断点对其进行调试,以至少找出它的起源.唯一的问题是崩溃/断点发生在0 objc_exception_throw中,这对我没有帮助.

我得到的数据如下所示:

libobjc.A.dylib`objc_exception_throw:
0x32a3a960:  push   {r4, r5, r6, r7, lr} // breakpoint stops here
0x32a3a962:  add    r7, sp, #12
0x32a3a964:  mov    r4, r0
0x32a3a966:  movs   r0, #16
0x32a3a968:  blx    0x32a46854                ; symbol stub for: -[NSObject isEqual:]
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,如何创建一个异常断点来提前启动?我试图让断点发生在崩溃前的实际Objective-C代码的最后一点.

我已经尝试编辑要共享的断点,中断抛出,然后中断catch,并且在没有运气的情况下更改了Objective-C,C++和"all"之间的异常类型.

我怎样才能使异常断点更早出现?

除非有办法破译我发布的代码.如果可能的话,请给我一个简短的解释,说明它意味着什么,以及你如何破译它以便我也可以学习这样做:)

感谢大家!

如果我让程序运行...

它继续崩溃,看起来像这样:

libsystem_kernel.dylib`mach_msg_trap:
0x30830ea0:  mov    r12, sp
0x30830ea4:  push   {r4, r5, r6, r8}
0x30830ea8:  ldm    r12, {r4, r5, r6}
0x30830eac:  mvn    r12, #30
0x30830eb0:  svc    #128
0x30830eb4:  pop    {r4, r5, r6, r8} // SIGTRAP throws …
Run Code Online (Sandbox Code Playgroud)

xcode objective-c nsmanagedobjectcontext ios

6
推荐指数
1
解决办法
3442
查看次数

Swift从实体获取特定的NSManagedObject(核心数据)

我的" ProjName.xcdatamodel"中有一个名为"Questions" 的实体.在这个实体中,我有5个属性("icehockey","排球","足球"......),每个属性都有类型transformable.每行(属性)将填充NSMutableArray.我想要做的是获取此实体中特定属性的值.这是我的代码:

func readQuestionsFromCore(sport:NSString) -> NSMutableArray {
    var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
    var context:NSManagedObjectContext = appDel.managedObjectContext!

    var request = NSFetchRequest(entityName: "Questions")
    request.returnsObjectsAsFaults = false
    var results: NSArray = context.executeFetchRequest(request, error: nil)!
    var qArr:NSMutableArray!
    if results.count > 0 {
        var res = results[0] as NSManagedObject
        qArr = res.valueForKey("\(sport)") as NSMutableArray
        return qArr
    } else {
        qArr = []
        return qArr
    }
}
Run Code Online (Sandbox Code Playgroud)

这将不起作用,因为我从数据库(results[0] as NSManagedObject)中取出结果的第一个索引,因此如果该元素与我正在寻找的valueForKey不同,它将崩溃.

如何获得我正在寻找的一个结果行?即"足球",或者至少我可以以某种方式循环结果并比较每个结果行的键,以便当我尝试使用错误的键时它不会崩溃?喜欢这样的东西:

for (res) in results as NSManagedObject {
   if(res.key …
Run Code Online (Sandbox Code Playgroud)

nsmanagedobject nsmanagedobjectcontext xcdatamodel swift

6
推荐指数
1
解决办法
2140
查看次数

应用程序返回前景时CoreData保存上下文导致崩溃.迅速

好的,所以我遇到一个令人沮丧的问题,我希望得到一些帮助或建议.基本上我有一个我正在开发的应用程序,Core Data用于存储众多用户属性.我在开发过程中几个月来一直在做的是,managedObjectContext每当用户从活动状态转换到后台时,我都会保存.我使用了一些后台获取请求,所以我被告知要专门使用applicationDidEnterBackgroundin AppDelegate而不是applicationWillTerminate函数.基本上我正在做类似的事情:

func applicationDidEnterBackground(application: UIApplication) {

    if !userSaved {
        saveUserDataLocally()
    }

}

func saveUserDataLocally() {

    // Handle all the data, store it properly in managedObjectContext
    // .........
    // .......
    do {
        try managedObjectContext.save()
        print("Success on save")
    } catch let error {
        print("Error saving user \(error)")
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,当我通过xCode在我的iPhone上测试应用程序时,这已经好几个月了.每当我将应用程序推入后台时它仍然可以正常工作,并等待几秒钟以保存managedObjectContext到完成(如果存储了大量数据,有时可能需要3-4秒).只有当我通过xCode测试应用程序时才会出现问题.因此,如果我在手机上安装了应用程序,并且只是在乘坐公共汽车去学校时尝试测试,我会遇到问题.当我将应用程序推入后台模式时,它只会导致崩溃,然后立即点击主屏幕上的应用程序图标再次启动它(好像我不小心点击了主页按钮将其推入后台).如果我没有通过xCode测试并尝试强制退出应用程序,情况也是如此.在这种情况下,它不会崩溃,因为应用程序没有运行,但它永远不会完成保存.

我已经不知疲倦地尝试重新解决这个问题,同时让我的手机插入我的电脑并通过xCode进行测试,这样我就可以安装断点并找到问题的根源.通过xCode进行测试时,此问题始终存在.当我测试它时,我可以将应用程序推送到后台,然后半秒后将其重新启动,不仅原始保存请求完成,而且不会导致崩溃.此外,我可以强制退出应用程序,同时通过xCode运行它,它将允许保存完成,然后应用程序将终止.

我确信你可以想象,这是非常令人沮丧的,因为如果我在使用xCode提供的调试工具时无法重新创建问题,我很难找到错误的来源.只是明哲保身,我确信无数次,没有什么是被称为在AppDelegateapplicationWillEnterForegroundapplicationDidBecomeActive方法.我完全迷失了.在我看来,通过将应用程序推回到前台,同时处于保存状态managedObjectContext,它会变得混乱和崩溃...但是当我在使用xCode测试我的设备上的应用程序时,为什么不会发生这种情况?

任何人都可以帮我吗?我可能在几个小时内没有留下任何头发!;-)

||| 更新06/03 |||

所以在一些评论者的帮助下,我能够发现问题的一部分是由于CoreData请求堵塞主线程,然后导致应用程序停止响应.我不确定这是我具体问题的确切解决方案,但绝对有助于完全识别问题.转换到后台时我试图完成所有保存的原因之一是因为我在主线程上执行了所有保存,当我在应用程序使用期间执行保存时,会导致延迟或陷入困境主线程.我一直在尝试在后台线程上执行保存执行,这非常有帮助.这样,我可以在应用程序的其他部分运行时将我的用户数据保存在后台,并且它不会阻塞主线程.这有助于使我在转换到后台时甚至不需要保存,因此崩溃不会再发生了.

CoreData在mainthread.com上找到了一个名为Justin …

xcode core-data nsmanagedobjectcontext ios swift

6
推荐指数
0
解决办法
2027
查看次数

NSManagedObjectID 与自定义 UUID 标识符属性 - 获取性能

我真的很想避免使用它NSManagedObjectID作为将我的模型结构连接到其 CoreData 对象的方式。我的意思是这样的:

假设我Book在 CoreData 中有一个实体,然后我有一个像这样的模型结构,代表我的模型层:

struct BookModel {
    let name: String
    ...

    let objectID: NSManagedObjectID // I need this to refer back to the entry in the database
}
Run Code Online (Sandbox Code Playgroud)

我不喜欢这种方法。它使得使用结构变得乏味,例如,测试很烦人,因为我总是必须生成虚拟 objectId 或使其成为BookModel.objectID可选。

我想要的是实体内部id的类型属性。这将很容易连接到结构,并且还允许结构在没有数据库的情况下正确存在:UUIDBook

struct BookModel {
    let name: String
    ...
    let id: UUID
    ...

    func object() -> Book {
        // Retrieve managed object using a fetch request with a predicate.
    }
}
Run Code Online (Sandbox Code Playgroud)

我注意到您实际上可以UUID在实体中拥有属性。然而,性能差异似乎是巨大的。我创建了一个尝试获取单个对象 10000 次的示例。

首先,我使用context …

core-data nsmanagedobjectcontext nsmanagedobjectid swift

6
推荐指数
1
解决办法
2107
查看次数