标签: nsmanagedobjectcontext

核心数据managedObjectContext - 它来自哪里?

我一直在看Objective-c不到一个月,绝对是新手.

我正在尝试编写一些我从Web服务检索到的数据.这个数据叫做"Sens",我创建了Core-data结构和NSManagedObject类 - "Sens.h".我一直在尝试创建Sens对象的几种不同方法,但我很难确定上下文(NSManagedObjectContext).我读到它应该来自对象(这是下面的代码) - 不工作.我也尝试过self.managedObjectContext - 也没用.

这里的代码 - 问题行是:

NSManagedObjectContext *context = [Sens managedObjectContext];
Sens *newSens = [NSEntityDescription insertNewObjectForEntityForName:@"Sens" inManagedObjectContext:context];
Run Code Online (Sandbox Code Playgroud)

整段代码是:

#import "RootViewController.h"
#import "XMLElement.h"
#import "Sens.h"


@implementation RootViewController

@synthesize xmlDocument;


-(void) xmlDocumentDelegateParsingFinished:(XMLDocument *)paramSender {
NSLog(@"Finished downloading and parsing the remote XML");
// loop through the parsed items - sens
if ([paramSender.rootElement.name isEqualToString:@"ArrayOfSensItem"]) {
    for (int i = 0; i < [paramSender.rootElement.children count]; i++) {
        XMLElement *element = [[XMLElement alloc] init];
        element = [paramSender.rootElement.children objectAtIndex:i];

        // we would …
Run Code Online (Sandbox Code Playgroud)

core-data objective-c nsmanagedobjectcontext

3
推荐指数
1
解决办法
3288
查看次数

NSManagedObjectContext:如何更新主上下文

我有一个使用Core Data和默认AppDelegate的项目.我在我的代码中有以下线程,其中WSObject下载了我的NSManagedObject的图像.正如您将注意到的,我正在NSManagedObjectContext为此后台线程创建一个新的.我试图在网上阅读不同的文档和其他论坛主题,但是在我的对象保存在后台上下文中之后,我无法理解如何在AppDelegate中通知我的主要上下文.

- (void) downloadImageForObjectID:(NSManagedObjectID*)objectID {
    dispatch_queue_t imageDownloaderQueue = dispatch_queue_create("imagedownloader", NULL);
    dispatch_async(imageDownloaderQueue, ^{
        NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
        context.persistentStoreCoordinator = [(AppDelegate *)[[UIApplication sharedApplication] delegate] persistentStoreCoordinator];
        context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;

        WSObject *item = (WSObject*)[context objectWithID:objectID];
        item.image.data = [item.image download];

        if ([context hasChanges]) {
            NSError *error = nil;
            [context save:&error];
        }
    });
    dispatch_release(imageDownloaderQueue);
}
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我该方法和AppDelegate要添加什么才能使其正常工作?据我所知,NSManagedObjectContextDidSaveNotification当我在后台线程中保存上下文时会发送一个.我应该向AppDelegate添加什么代码来收听此通知以及收到通知时该怎么做?

EDIT1: 我已将观察者添加到后台线程中.

if ([context hasChanges]) {
    NSError *error = nil;


    NSManagedObjectContext *mainContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
    [[NSNotificationCenter defaultCenter] addObserver:self …
Run Code Online (Sandbox Code Playgroud)

core-data objective-c nsmanagedobjectcontext

3
推荐指数
1
解决办法
7463
查看次数

核心数据和托管对象上下文

我是Core Data的新手,我对如何以正确的方式做事情有一些疑问.我想我需要一个temporaryManagedObjectContext来处理临时实体,而用户正在编辑一个新实体.当用户点击保存该数据时,我想在persistedManagecObjectContext中插入这些实体,然后保存saveContext.实现这一目标的最佳做法是什么?由于我不想在临时环境中保存,因此必须使用线程?

谢谢你的知识!

core-data nsmanagedobjectcontext ios

3
推荐指数
1
解决办法
2068
查看次数

主线程上的NSFetchedResultsController忽略从另一个线程保存到Core Data?

我有一个NSFetchedResultsController主线程.同样从主线程,我异步发送JSON的网络请求.当JSON字符串返回时,我启动NSOperation一个新的(后台)NSManagedObjectContext,解析JSON字符串,创建/更新NSManagedObject,并将它们保存在上下文中.后台上下文与主上下文具有相同的persistentStore.有了这个,我有两个问题:

  1. 我认为从任何上下文(在任何线程上)对持久性存储的任何保存都会通知主要NSFetchedResultsController有变化,但到目前为止它没有发现任何变化.我应该做些什么来通知主线程NSFetchedResultsController有外部save的,以便相应的tableView更新?

  2. 因此,在主线程上,我订阅NSManagedObjectContextWillSaveNotification并正确查看所有上下文(包括完全在单独线程上存在的上下文)何时执行save操作.的苹果文档说的是notification.userInfo具有应3个阵列,一个阵列的每个在后台线程的"更新,删除和插入的"模型对象的字典.但是,这对我userInfo来说总是如此nil.我有什么想法我做错了吗?

订阅NSManagedObjectContextWillSaveNotificationAppDelegate:

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(managedObjectContextDidSave:)
                                             name:NSManagedObjectContextWillSaveNotification 
                                           object:nil];
Run Code Online (Sandbox Code Playgroud)

以及在AppDelegate中保存上下文的方法:

- (void)managedObjectContextDidSave:(NSNotification *)notification {
    DLog(@"notification: %@", notification); //not nil
    DLog(@"notification user info: %@", notification.userInfo); // always nil... why??

    NSManagedObjectContext *theContext = notification.object;
    if(theContext != context) {
        DLog(@"---- SAVED ON ANOTHER CONTEXT");

        // should I notify NSFetchedResultsController that there were …
Run Code Online (Sandbox Code Playgroud)

multithreading core-data nsfetchedresultscontroller nsoperationqueue nsmanagedobjectcontext

3
推荐指数
1
解决办法
1338
查看次数

核心数据多线程:代码示例

我的多线程Core Data启用应用程序一直存在问题,我想我应该仔细研究一下我在做什么以及如何做.如果以下情况有效,请告知我们.

我有一个DataManager处理Core Data东西的单例类.它有一个属性managedObjectContext,为每个线程返回不同的MOC.因此,给定NSMutableDictionary *_threadContextDict(字符串线程名称到上下文)和NSMutableDictionary *_threadDict(字符串线程名称到线程),它看起来像这样:

-(NSManagedObjectContext *)managedObjectContext
{
  if ([NSThread currentThread] == [NSThread mainThread])
  {
    MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    return delegate.managedObjectContext; //MOC created in delegate code on main thread
  }
  else
  {
    NSString *thisThread = [[NSThread currentThread] description];
    {
      if ([_threadContextDict objectForKey:thisThread] != nil)
      {
        return [_threadContextDict objectForKey:thisThread];
      }
      else
      {
        NSManagedObjectContext *context = [[NSManagedObjectContext alloc]init];
        MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
        [context setPersistentStoreCoordinator:delegate.persistentStoreCoordinator];
        [_threadContextDict setObject:context forKey:thisThread]; …
Run Code Online (Sandbox Code Playgroud)

multithreading core-data objective-c grand-central-dispatch nsmanagedobjectcontext

3
推荐指数
1
解决办法
3439
查看次数

对象不会保存到SQL Lite中,即使它说已保存[RestKit ManagedObjectContext]

所以我遇到了一个非常令人沮丧的问题......我正在使用Restkit从我的Django服务器获取对象,并且映射已成功完成.那样就好!现在,我试图从我的SQLLite数据库中获取该对象并更改该对象并将其保存回来.例如:

    _managedObjectContext = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext;


    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"User"];
    fetchRequest.predicate = [NSPredicate predicateWithFormat: @"identifier == 3"];
    NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"identifier" ascending:NO];
    fetchRequest.sortDescriptors = @[descriptor];
    NSError *error = nil;

    NSFetchedResultsController *fetchedResultsController2 = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                                        managedObjectContext:_managedObjectContext
                                                                          sectionNameKeyPath:nil
                                                                                   cacheName:nil];
    BOOL fetchSuccessful = [fetchedResultsController2 performFetch:&error];
    if (! fetchSuccessful) {
        NSLog(@"%@", error.description);
    }

    PokaUser* user = [[fetchedResultsController2 fetchedObjects]objectAtIndex:0];
    user.firstName = @"NewFirstName";
    BOOL hasSaved = [user.managedObjectContext save:&error];
    NSLog(@"INFO:{%s} CoreData has Saved: %@ (%d)\nerror:%@ | %@ | %@", __FUNCTION__, (hasSaved) ? @"YES" : @"NO", …
Run Code Online (Sandbox Code Playgroud)

core-data nsmanagedobjectcontext ios restkit

3
推荐指数
1
解决办法
797
查看次数

添加多个/顺序行 - 在Coredata中填充DB

如何在coredata和xcode中插入多个/顺序的新行?

-(void)LoadDB{
    CoreDataAppDelegate *appdelegate = [[UIApplication sharedApplication]delegate];
    context = [appdelegate  managedObjectContext];

    NSManagedObject *newPref;        
    newPref = [NSEntityDescription
           insertNewObjectForEntityForName:NSStringFromClass([Preference class])
           inManagedObjectContext:context];
    NSError *error;

    [newPref setValue: @"0" forKey:@"pid"];      
    [context save:&error];

    [newPref setValue: @"1" forKey:@"pid"];    
    [context save:&error];
}
Run Code Online (Sandbox Code Playgroud)

刚刚结束的代码写入了上一个条目.插入下一行的正确程序是什么?

core-data nsmanagedobjectcontext ios

3
推荐指数
1
解决办法
1687
查看次数

上下文不保存更改,错误1550

我正在尝试更新实体并保存更改.我总是得到以下错误:

The operation couldn’t be completed. (Cocoa error 1550.)
Run Code Online (Sandbox Code Playgroud)

方法:

- (BOOL) updateEvent:(EventDTO*)eventDTO{
    BOOL saved = YES;

    [self getDataCoreContext];

    if (context) {
        NSError *error;

        Event *myEvent = (Event *)[context existingObjectWithID:eventDTO.entitysID error:&error];

        myEvent.name = eventDTO.name;
        myEvent.descrptn = eventDTO.description;
        myEvent.date = eventDTO.date;
        myEvent.locLatitude = [eventDTO getLatidude];
        myEvent.locLongitude = [eventDTO getLongitude];
        myEvent.numberOfInvited= [NSNumber numberWithInteger:[eventDTO.invitedMembers count]];

        for (User *invUser in eventDTO.invitedMembers) {
            [myEvent addInvitedUsersObject:invUser];
        }

        for (User *accUser in eventDTO.acceptedMembers) {
            [myEvent addAcceptedUsersObject:accUser];
        }

        myEvent.createdBy = (User*)[context existingObjectWithID:eventDTO.creator.objectID error:&error];

        if (![context save:&error]) {
            NSLog(@"Whoops, …
Run Code Online (Sandbox Code Playgroud)

core-data objective-c nsmanagedobject nsmanagedobjectcontext

3
推荐指数
1
解决办法
6369
查看次数

在不同的线程上访问NSManagedObject的objectID?

我的UITableViewCell内容创建的一部分因一个对象(CoreData NSManagedObject)初始访问时发生的错误而延迟.这表现在一个小的打嗝,细胞首先滚动到视图中.我决定将这些对象的访问权限推送到后台线程.

这就是我实现它的方式,它运行良好,但我们都知道我们不应该在另一个线程中访问一个线程(主线程)的NSManagedObjectContext,但是我们可以在第二个线程中获取对象的objectID它最初是在第一个线程中获取的?

获取objectID需要花费很少的时间,我希望将其他所有东西都推到后台.

MyRecord *record = [self.frc objectAtIndexPath: indexPath];

// Should the following be here or can it be below in the background thread?
// NSManagedObjectID *recordObjectID = record.objectID;

dispatch_async(_recordViewQueue, ^(void) {
    if ([cell.origIndexPath isEqual:indexPath]) {

        // should the following be here or above?  It works here, but am I just lucky?
        // this call seems to take about 2/100 of a second
        NSManagedObjectID *recordObjectID = record.objectID;

        NSManagedObjectContext *bgndContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
        bgndContext.persistentStoreCoordinator = App.sharedApp.storeCoordinator;
        MyRecord *newRecord = …
Run Code Online (Sandbox Code Playgroud)

core-data grand-central-dispatch nsmanagedobject nsmanagedobjectcontext ios

3
推荐指数
1
解决办法
1617
查看次数

将ManagedObjectContext传递/注入视图控制器

我试图通过将我的MOC传递到需要它们的视图控制器来做正确的事情.我正在使用第三方库创建一个侧面/导航菜单,我无法弄清楚如何让我的MOC通过SideController进入我的ViewControllers来完成这项工作.

从这开始(简单部分)第1步:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    LoginViewController *rootView = (LoginViewController *) self.window.rootViewController;
    rootView.managedObjectContext = self.managedObjectContext;
}
Run Code Online (Sandbox Code Playgroud)

然后在我的用户登录后,我将其传递给第三部分控制器(仍然可以在这里)步骤2:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    NSString *segueIdentifier = [segue identifier];
    if ([segueIdentifier isEqualToString:@"LoginSegue"]) {
        TheRootViewController *rootViewController = [segue destinationViewController];
        rootViewController.managedObjectContext = self.managedObjectContext;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是第三部分代码第3步:

- (void)awakeFromNib
{

...
    MyNavigationController *navigationController = [self.storyboard instantiateViewControllerWithIdentifier:@"contentViewController"];
    navigationController.managedObjectContext = _managedObjectContext;
    self.contentViewController = navigationController;
...
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,在步骤2中的segue有机会在RootViewController上设置MOC之前,第3步(awakeFromNib)中的代码被调用.

基本上我可以找到的所有示例都是使用故事板,但由于我的第三方应用程序使用代码,因此我有点混合.如何调用awakeFromNib之前将MOC送到TheRootController?这甚至是可能的.还有另外一种方法吗?

我真的很早就参与了这个项目,并且不想在AppDelegate中开始填充东西,而是想弄清楚如何在第三方应用程序中做正确的事情.

core-data nsmanagedobjectcontext ios

3
推荐指数
1
解决办法
376
查看次数