标签: nsmanagedobjectcontext

CoreData:从未保存的上下文中获取对象

在我将ManagedObject插入上下文后,我想稍后在保存上下文之前获取它(我会在插入所有对象后保存).如果以前没有保存上下文,那么稍后使用有关这些对象的提取查询上下文似乎不会返回任何内容.有没有办法只在最后保存?(我想我可以将我的对象保存在数组或字典中并查询但我认为coredata会为我做这个)

iphone core-data nsmanagedobject nsmanagedobjectcontext

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

什么是使用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
查看次数

NSManagedObject不反映后台线程NSManagedObjectContextDidSaveNotification后的更改

我遇到问题,NSManagedObject没有反映在后台线程保存上下文后对持久存储所做的更改.

安装程序

在一个简单的测试应用程序中,我有一个窗口列出了我的核心数据持久存储中的所有对象,一个用于过滤结果的搜索框和一个用于显示所选项目名称的文本字段,并允许更改名称.

绑定如下:

ArrayController --> AppDelegate --> ManagedObjectContext
TableView Col 1 --> ArrayController --> values --> arrangedObjects.widgetName
TableView Col 2 --> ArrayController --> values --> arrangedObjects.uid

SearchField --> ArrayController --> predicate --> filterPredicate

TextField --> ArrayController --> value --> selection.widgetName

我还有一个按钮,用于启动从Web服务器获取数据的后台(NSOperation).

过程

当用户单击刷新按钮时,NSOperation将启动并异步抓取窗口小部件,解析响应,检查要删除的不在响应中的本地窗口小部件,要添加的新窗口小部件未存储在本地和现有本地应使用从服务器检索的数据更新的小部件.

处理完成后,将使用以下方式通知主要上下文:

[mainContext performSelectorOnMainThread:
       @selector(mergeChangesFromContextDidSaveNotification:) 
                              withObject:notification 
                           waitUntilDone:YES];
Run Code Online (Sandbox Code Playgroud)

我在主控制器中有一个观察者进行测试,显示变化经过了很好,主控制器得到了通知.

问题

如果我使用文本字段对选定对象进行更改,则在保存后台线程上的数据时,UI中的对象不会更新以反映这些更改(即,它不会覆盖具有更改的UI)服务器).

例如,给出以下三个小部件和ID:

Test Name 1 | ID 123
Test Name 2 | ID 234
Test Name 3 | ID 345

如果我的UI更改名称Test Name 2Renamed 2我有以下几点: …

objective-c background-process nsarraycontroller cocoa-bindings nsmanagedobjectcontext

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

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

我需要删除我的持久存储(按对象执行它不实用,因为我有超过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
查看次数

NSFetchedResultsController错过了对合并的NSManagedObjectContext的更新

我有两个托管对象上下文,A和B.这两个上下文通过在保存(通过监视NSManagedObjectContextDidSaveNotification)时将更改从一个更改为另一个来保持同步.我已经确认A和B的更改正在合并.

我有NSFetchedResultsController对B 的监视更新.我发现A的某些更新不会导致在B.上触发nsfrc.当创建一个新的托管对象并使用nsfrc正在寻找的属性(在B上)添加到A时,在B合并A的保存更改后,nsfrc会触发.但是,如果A(和B)上已经存在托管对象,我修改了对象并保存了A,而我可以看到B正在合并保存通知中的更改A,nsfrc监控B不会触发.

我在这里错过了什么?

merge core-data nsfetchedresultscontroller nsmanagedobjectcontext

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

NSManagedObjectContextObjectsDidChangeNotification并不总是立即被调用

我有一个使用NSPersistentDocument的Mac应用程序.我希望在删除对象时收到通知,以使用Core Data保存此信息.所以我正在侦听NSManagedObjectContextObjectsDidChangeNotification.通常在删除对象时立即调用它,但有时仅在保存持久文档之后调用,之前未通知所有已删除的对象.因为我想让用户直接导出所有现有对象(而不是已删除的对象)我必须做什么才能立即收到通知以保存删除信息,或者我是否必须以其他方式使用它?

macos core-data nsnotifications nsmanagedobjectcontext nspersistentdocument

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

核心数据错误

我使用Restkit从服务器映射Json数据,我通过从db获取来显示这些数据.我的视图中有一个刷新按钮,它再次执行上述操作.

场景:我有两个表Key和Profile,它们有一对一的关系.我使用以下代码从DB获取数据

NSFetchRequest *fetchRequest = [Key fetchRequest];
[fetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"Profile"]];
[fetchRequest setIncludesSubentities:YES];
NSArray *sortedObjects = [Key executeFetchRequest:fetchRequest]; 
Run Code Online (Sandbox Code Playgroud)

上面的数组返回DB中的所有对象.但是当我检查使用断点时,我得到了一些核心数据错误,这是没有显示所有数据的原因.

// sortedObjects中的所有数据都是这样的.

<Key: 0x889f2f0> (entity: Key; id: 0x889e400 <x-coredata://981A476D-55AC-4CB4-BBD8-E0285E522412/Key/p1489> ; data: <fault>)
Run Code Online (Sandbox Code Playgroud)

任何的想法

core-data objective-c fault nsmanagedobjectcontext ios

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

核心数据多级父级 - 子级上下文

在我的应用程序中,我有UITableViewController显示事件列表.此控制器使用ManagedObjectContext Say ParentContext.现在,如果选择了任何事件,则会显示详细的视图控制器,用户可以在其中编辑事件的详细信息.所以我创建了一个子上下文说,

ChildContext with type "NSPrivateQueueConcurrencyType"

ChildContext whose parent Context is "ParentContext".

我的代码是:

  NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
  childContext.parentContext = self.context ;
Run Code Online (Sandbox Code Playgroud)

现在又有一些领域和关系需要另一个向下钻取.所以我为新的视图控制器创建了另一个ChildContext,

GrandChildContext with type "NSPrivateQueueConcurrencyType"

GrandChildContext whose parent context is "ChildContext"

这个过程是另一个级别(从父级(tableView)到子级的总共4级)

self.context - Parent Context
  |
  |
ChildContext
  |
  |
GrandChildContext
  |
  |
GrandGrandChildContext
Run Code Online (Sandbox Code Playgroud)

我的实体看起来像这样

EntityA           -- ( Edit View Controller  - uses ChildContext )
 |
 |- Field1
 |
 |- Field2
 |
 |- RelationShip (1 to Many ) - ( Relationship Add …
Run Code Online (Sandbox Code Playgroud)

core-data objective-c nsmanagedobjectcontext ios

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

使用NSManagedObject子类来传输持久性和非持久性数据

我对如何使用一些核心数据的NSManagedObject子类来处理持久数据和非持久数据有一些想法.

假设您有一个配方应用程序,显示您自己的CoreData配方列表,在同一个应用程序中,您也可以搜索其他用户配方.这些其他用户配方当然来自API,我们不希望将它们保存到核心数据中.但我们想要的是我们的配方细节View Controller,无论是给定持久配方还是非持久性配方,它都可以起作用.我自然认为我们应该在数据周围使用相同的对象包装器,让我们的View Controller对数据的来源视而不见.

问题是NSManagedObject子类不能手动初始化,必须插入上下文.这对我们的其他用户食谱不利.另一方面,对于我们自己的配方,我们需要将这些对象插入到上下文中.

我有几个解决方案,但我真的很想看看你们对这个问题的看法.

您是否认为这是一些实现问题,应该通过将两个数据对象包装到一个对象中来解决?例如,通过覆盖所有getter和setter来处理coredata对象和NSDictionary对象?

或者它是一个体系结构问题,您可以通过嵌套NSManagedContext或使用多个持久性存储(一个在内存中,另一个在Sqlite中)来解决它?

core-data nsmanagedobject nsmanagedobjectcontext ios

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

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
查看次数