【问题标题】:How to delete every Core Data entity without Faulting errors?如何删除每个核心数据实体而不会出现错误?
【发布时间】:2014-04-14 08:50:46
【问题描述】:

如何刷新该死的核心数据对象?

请原谅措辞,我现在只想删除对象 20 分钟。删除就好了,但 Core Data 会在一段时间后引发异常。

到目前为止我试过了:

删除所有对象 (MR_truncateAll),然后保存。

删除所有对象,处理挂起的更改,保存。

关闭撤消管理器,删除,关闭撤消管理器。

删除 Core Data sqlite 文件,销毁上下文,然后重新创建。

使用[MagicalRecord cleanUp],删除核心数据sqlite文件。


不过,当我想创建对象时,经过 2-3 次尝试,我会得到错误,然后因为错误而崩溃。

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 _dispatch_barrier_sync_f_slow_invoke + 45
    8   libdispatch.dylib                   0x0000000102cef6fd _dispatch_client_callout + 8
    9   libdispatch.dylib                   0x0000000102cdf46c _dispatch_main_queue_callback_4CF + 354
    10  CoreFoundation                      0x0000000102074729 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    11  CoreFoundation                      0x0000000101fc19a4 __CFRunLoopRun + 1764
    12  CoreFoundation                      0x0000000101fc0ed3 CFRunLoopRunSpecific + 467
    13  GraphicsServices                    0x00000001032f03a4 GSEventRunModal + 161
    14  UIKit                               0x0000000100e48a63 UIApplicationMain + 1010
    15  GitHub!                             0x0000000100002f53 main + 115
    16  libdyld.dylib                       0x0000000102f9c7e1 start + 0
)

我使用单一上下文。由 MagicalRecord 在后台创建。

如何删除、刷新Core Data?

【问题讨论】:

标签: ios sqlite core-data magicalrecord


【解决方案1】:

这可行,但我不确定实体是否真的被删除(但我希望如此)。

在每 2-3 次尝试时仍显示失败错误,但不会引发错误。我简直不敢相信他们无法完成 [NSPersistentStoreCoordinator deleteEveryStuffSeriouslyNotKidding] 方法。

// Cut every retaining references.
self.someEntity = nil;
self.entityUsingRelations = nil;

[self.context processPendingChanges];
[[self.context undoManager] disableUndoRegistration];

// You can use simple Core Data `delete` methods.
[SomeEntity MR_truncateAll];
[ReleatiedEntity MR_truncateAll];
[AnotherReleatedEntity MR_truncateAll];
[EntityUsingRelations MR_truncateAll];

[self.context processPendingChanges];
[[self.context undoManager] enableUndoRegistration];

[self.context MR_saveToPersistentStoreAndWait];

【讨论】:

  • 看起来您实际上并没有将删除的内容保存到商店,至少使用这个 sn-p。 TruncateAll 基本上将这些对象标记为在下次保存时删除。尝试保存删除的内容。
  • 是的,我将重置切换为保存。它可以工作,尽管有时它仍然显示故障。我一共使用了 30 个实体,尽管它在 p100-p150 实体上显示了错误……无论如何,thermal-core.com/CoreDataEditor 显示了正确的 30 个实体。 Core Data 中有太多意想不到的行为,但我知道它是为性能而设计的。
【解决方案2】:

这应该适合你

[ClassName MR_truncateAll];

[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];

这里的ClassName 是您的实体的NSManagedObject 子类。

【讨论】:

  • 如果将 MR_truncateAll 放在 [MagicalRecord saveWithBlockAndWait:^{}] 内会更安全
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
相关资源
最近更新 更多