相关疑难解决方法(0)

核心数据:删除实体所有实例的最快方法

我正在使用Core Data在本地持久保存Web服务调用的结果.Web服务返回完整的对象模型,比方说,"汽车" - 可能是大约2000个(我不能让Web服务返回任何小于1或所有汽车.

下次打开我的应用程序时,我想通过再次调用所有汽车的Web服务来刷新Core Data持久化副本,但是为了防止重复,我需要首先清除本地缓存中的所有数据.

是否有更快的方法来清除托管对象上下文中特定实体的所有实例(例如"CAR"类型的所有实体),或者我是否需要查询它们,然后遍历结果以删除每个实例,然后保存?

理想情况下,我可以说删除所有实体是Blah的地方.

core-data objective-c ios

373
推荐指数
11
解决办法
15万
查看次数

如何将iPhone核心数据与Web服务器同步,然后推送到其他设备?

我一直在研究一种方法,用于在多个设备(如iPad或Mac)之间同步存储在iPhone应用程序中的核心数据.在iOS上使用Core Data的同步框架并不多(如果有的话).但是,我一直在考虑以下概念:

  1. 对本地核心数据存储进行更改,并保存更改.(a)如果设备在线,它会尝试将变更集发送到服务器,包括发送变更集的设备的设备ID.(b)如果变更集未到达服务器,或者设备未联机,则应用程序会将更改集添加到队列中以在其联机时发送.
  2. 位于云中的服务器将其接收的特定更改集与其主数据库合并.
  3. 在云服务器上合并更改集(或更改集队列)后,服务器会使用某种轮询系统将所有这些更改集推送到向服务器注册的其他设备.(我想使用Apple的推送服务,但显然根据评论,这不是一个可行的系统.)

我需要考虑什么花哨的东西吗?我查看了REST框架,例如ObjectiveResource,Core ResourceRestfulCoreData.当然,这些都与Ruby on Rails一起使用,我并不依赖它,但它是一个开始的地方.我对我的解决方案的主要要求是:

  1. 任何更改都应该在后台发送而不会暂停主线程.
  2. 它应该使用尽可能少的带宽.

我考虑过一些挑战:

  1. 确保服务器上附加了不同设备上不同数据存储的对象ID.也就是说,我将有一个对象ID和设备ID表,它们通过对存储在数据库中的对象的引用来绑定.我将有一条记录(DatabaseId [此表是唯一的],ObjectId [整个数据库中的项目唯一],Datafield1,Datafield2),ObjectId字段将引用另一个表AllObjects:(ObjectId,DeviceId,DeviceObjectId).然后,当设备推送更改集时,它将从本地数据存储中的核心数据对象传递设备Id和objectId.然后我的云服务器将检查AllObjects表中的objectId和设备ID,并找到要在初始表中更改的记录.
  2. 所有更改都应加上时间戳,以便合并它们.
  3. 设备必须轮询服务器,而不会耗尽太多电池.
  4. 如果/当从服务器收到更改时,本地设备还需要更新内存中保存的任何内容.

还有什么我在这里失踪的吗?我应该考虑哪些框架才能实现这一目标?

iphone sync core-data ios data-synchronization

291
推荐指数
7
解决办法
9万
查看次数

为什么删除时会引发 Core Data NSManagedObject 错误?

我正在尝试有效地批量删除大量NSManagedObjects (不使用NSBatchDeleteRequest)。我一直遵循这个答案中的一般过程(适用于 Swift),通过批处理请求对象、删除、保存然后重置上下文的操作。我的获取请求设置includesPropertyValuesfalse.

然而,当它运行时,当每个对象从上下文中删除时,错误就会被触发。添加日志记录如下:

// 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 …

core-data nsmanagedobject nsmanagedobjectcontext ios swift

5
推荐指数
1
解决办法
1073
查看次数

在CoreData中执行批量INSERT/UPDATE/DELETE的有效方法.

我有一个包含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)

iphone core-data ios ios6

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

如何在没有错误错误的情况下删除每个Core Data实体?

如何刷新该死的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)

sqlite core-data ios magicalrecord

0
推荐指数
1
解决办法
1927
查看次数