我正在使用Core Data在本地持久保存Web服务调用的结果.Web服务返回完整的对象模型,比方说,"汽车" - 可能是大约2000个(我不能让Web服务返回任何小于1或所有汽车.
下次打开我的应用程序时,我想通过再次调用所有汽车的Web服务来刷新Core Data持久化副本,但是为了防止重复,我需要首先清除本地缓存中的所有数据.
是否有更快的方法来清除托管对象上下文中特定实体的所有实例(例如"CAR"类型的所有实体),或者我是否需要查询它们,然后遍历结果以删除每个实例,然后保存?
理想情况下,我可以说删除所有实体是Blah的地方.
我一直在研究一种方法,用于在多个设备(如iPad或Mac)之间同步存储在iPhone应用程序中的核心数据.在iOS上使用Core Data的同步框架并不多(如果有的话).但是,我一直在考虑以下概念:
我需要考虑什么花哨的东西吗?我查看了REST框架,例如ObjectiveResource,Core Resource和RestfulCoreData.当然,这些都与Ruby on Rails一起使用,我并不依赖它,但它是一个开始的地方.我对我的解决方案的主要要求是:
我考虑过一些挑战:
还有什么我在这里失踪的吗?我应该考虑哪些框架才能实现这一目标?
我正在尝试有效地批量删除大量NSManagedObjects (不使用NSBatchDeleteRequest)。我一直遵循这个答案中的一般过程(适用于 Swift),通过批处理请求对象、删除、保存然后重置上下文的操作。我的获取请求设置includesPropertyValues为false.
然而,当它运行时,当每个对象从上下文中删除时,错误就会被触发。添加日志记录如下:
// Fetch one object without property values
let f = NSFetchRequest<NSManagedObject>(entityName: "Entity")
f.includesPropertyValues = false
f.fetchLimit = 1
// Get the result from the fetch. This will be a fault
let firstEntity = try! context.fetch(f).first!
// Delete the object, watch whether the object is a fault before and after
print("pre-delete object is fault: \(firstEntity.isFault)")
context.delete(firstEntity)
print("post-delete object is fault: \(firstEntity.isFault)")
Run Code Online (Sandbox Code Playgroud)
产生输出:
pre-delete object is fault: true …
我有一个包含200,000个项目的JSON对象.我需要迭代这些对象,并确定它们是否存在并执行相关操作(插入/更新/删除).这个shell如下所示.当然,它实际上并没有保存任何东西.更多的是看这种方式需要多长时间.考虑到甚至还没有发生任何变化,这个动作在iPhone 4上处理大约需要8分钟,看起来很疯狂.
有没有更有效的方法来处理这个?
任何建议或指示将不胜感激.
- (void) progressiveInsert
{
prodAdd = 0;
prodUpdate = 0;
prodDelete = 0;
dispatch_queue_t backgroundDispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
dispatch_async(backgroundDispatchQueue,
^{
_productDBCount = 0;
NSLog(@"Background Queue");
NSLog(@"Number of products in jsonArray: %lu", (unsigned long)[_products count]);
NSManagedObjectContext *backgroundThreadContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
[backgroundThreadContext setPersistentStoreCoordinator:_persistentStoreCoordinator];
[backgroundThreadContext setUndoManager:nil];
[fetchRequest setPredicate:predicate];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Products" inManagedObjectContext:_managedObjectContext]];
[fetchRequest setIncludesSubentities:NO]; //Omit subentities. Default is YES (i.e. include subentities)
[fetchRequest setFetchLimit:1];
[_products enumerateObjectsUsingBlock:^(id product, NSUInteger idx, BOOL *stop) {
predicate = [NSPredicate predicateWithFormat:@"code == %@", …Run Code Online (Sandbox Code Playgroud) 如何刷新该死的Core Data对象?
请原谅,我只想删除对象20分钟.删除就好了,但Core Data会在一段时间后引发异常.
我到目前为止尝试过:
删除所有对象(MR_truncateAll),然后保存.
删除所有对象,处理挂起的更改,保存.
关闭撤消管理器,删除,转回撤消管理器.
删除Core Data sqlite文件,销毁上下文,然后重新创建.
使用[MagicalRecord cleanUp],删除核心数据sqlite文件.
尽管如此,当我想创建对象时,经过2-3次尝试后,我将获得Faulting,然后因故障而崩溃.
CoreData could not fulfill a fault for '0xd000000000840002 <x-coredata://...
(
0 CoreFoundation 0x0000000102016795 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x0000000101d79991 objc_exception_throw + 43
2 CoreData 0x0000000100265a93 _PFFaultHandlerLookupRow + 1075
3 CoreData 0x00000001002f33a3 -[NSManagedObject(_NSInternalMethods) _updateFromRefreshSnapshot:includingTransients:] + 243
4 CoreData 0x0000000100297563 -[NSManagedObjectContext(_NestedContextSupport) _copyChildObject:toParentObject:fromChildContext:] + 771
5 CoreData 0x000000010029701b -[NSManagedObjectContext(_NestedContextSupport) _parentProcessSaveRequest:inContext:error:] + 1019
6 CoreData 0x00000001002fd243 __82-[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:]_block_invoke + 563
7 libdispatch.dylib 0x0000000102ce005a …Run Code Online (Sandbox Code Playgroud)