【问题标题】:How can I use Core Data Objects outside of a managed object context?如何在托管对象上下文之外使用核心数据对象?
【发布时间】:2009-08-23 18:15:17
【问题描述】:

我想在托管对象上下文之外使用 Core Data 托管对象。我在这个网站上看到其他帖子说你不应该这样做,但这是我的问题:

我有一个“Feed”对象和一个“story”对象。提要就像一个 RSS 提要,故事就像来自该提要的单个故事。我可以为提要添加书签,并且我使用 Core Data 来保存这些提要,但是当我从提要下载故事时,我不想将这些故事插入到托管对象上下文中。然而,创建我的对象的唯一方法是这样做:

[NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:managedObjectContext];

这意味着它将在下一次保存事件中持久化。

我不希望这些对象在用户选择它们之前一直保留。

我尝试定义一个“TransientStory”和一个“PersistentStory”,它们都实现了一个名为“Story”的协议,但这是一场噩梦。有什么想法吗?

【问题讨论】:

    标签: core-data


    【解决方案1】:

    您可以创建这些对象,而不是将它们插入上下文中:

    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName
                                              inManagedObjectContext:managedContext];
    ManagedObjectClass *volatileObject = [[ManagedObjectClass alloc] initWithEntity:entity
                                                     insertIntoManagedObjectContext:nil];
    

    如果你想保存它,你只需将它插入到上下文中:

    [managedContext insertObject:volatileObject];
    

    (如果您忘记添加它,当您尝试将其保存在上下文中时,它会给您一个悬空对象错误)

    【讨论】:

      【解决方案2】:

      使用内存存储创建一个新的NSManagedObjectContext。然后你可以把你的瞬态对象放到这个上下文中,它们不会被持久化。

      NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:[NSArray arrayWithObject:[NSBundle mainBundle]]]; // though you can create a model on the fly (i.e. in code)
      NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc]     initWithManagedObjectModel:mom];
      
      NSError *err;
      
      // add an in-memory store. At least one persistent store is required
      if([psc addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:&err] == nil) {
        NSLog(@"%@",err);
      }
      
      NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init];
      [moc setPersistentStoreCoordinator:psc];
      

      如果您确实想保留它们,只需稍后将它们移动到正确的存储,或合并上下文。

      或者,如果您最终还是要将它们放入该上下文中(即您只是不希望它们出现在列表中,直到它们被保存),那么只需在您的 @ 中将 setIncludesPendingChanges 设置为 NO 987654325@.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        • 1970-01-01
        • 2023-03-30
        相关资源
        最近更新 更多