- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将 Core Data 与 UIManagedDocument 一起用于库存管理应用程序。我遇到的问题是,在将项目添加到核心数据后使用 UIDocumentSaveForOverwriting 进行保存时,“saveToURL:...”方法实际上删除了 Documents 目录中的 UIManagedDocument 文件。这只发生在第一次从新版本启动时。我创建了一个核心数据/UIManagedDocument 辅助单例以在整个应用程序中使用。
下面是我如何初始化 UIManagedDocument 实例:
@interface VDFCoreDataHelper : NSObject
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) UIManagedDocument *managedDocument;
@implementation VDFCoreDataHelper
- (void)createManagedDocument
{
NSURL *docsURL = [self getDocsURL];
if (![[NSFileManager defaultManager] fileExistsAtPath:[docsURL path]]) {
NSLog(@"new doc made");
_managedDocument = [[UIManagedDocument alloc] initWithFileURL:docsURL];
[self saveManagedDocumentForCreation];
[self openManagedDocument];
} else {
NSLog(@"existing doc");
_managedDocument = [[UIManagedDocument alloc] initWithFileURL:docsURL];
[self openManagedDocument];
}
}
CreateManagedDocument 在init 方法中被调用。我有两种保存方法。一种用于创建,另一种用于覆盖。第一个是在我创建托管文档时调用的。
此时,我只保存了一次,UIManagedDocument 目录和持久存储文件存在于我的文档文件夹中。
当我想插入一个Item对象时(一个Item实体存在),我调用这个方法:
- (void)insertManagedObject:(NSManagedObject *)object success:(void (^)(BOOL successful))successBlock
{
NSManagedObjectContext *context = [self context];
[context insertObject:object];
NSError *error;
[context save:&error];
if (self.managedDocument.documentState == UIDocumentStateNormal) {
[self.managedDocument saveToURL:[self getDocsURL] forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success){
successBlock(success);
}];
}
}
调用覆盖写入的“saveToURL:forSaveOperation:”后,我的管理文档目录和我的Documents文件夹中的文件都被自动删除了。 managedObjectContext、Item 对象和 managedDocument 对象此时都有效。文档的 URL 指向正确的目的地,但所有文件都不见了。
在我的“insertManagedObject”方法完成后,我使用导航 Controller 弹出回到 rootViewController,其中包含一个列出项目的 TableView 。我添加的数据保存在内存中,fetchedResultsController 加载它,但数据没有保存到磁盘,因为不再有持久存储。当我退出应用程序并重新进入时,什么也没有显示,并且重新创建了一个新的托管文档。
只有在我清除构建并首次启动它时才会发生这种情况。如果我启动并立即退出,然后再次进入应用程序,一切正常。就是这个“saveToURL:...: 删除我的持久存储的方法。
我已经尝试子类化 UIManagedDocument 并记录错误,但它没有显示任何错误。我试过注释掉一些代码,但它们没有什么不同。
如果我不使用“saveToURL”,持久存储不会被删除,但在重新启动时,fetchResultsController.fetchObjects 返回一个空数组并尝试访问不存在的 indexPath,从而导致应用程序崩溃。
我正在考虑现在放弃 UIManagedDocument。希望有人能告诉我我可能做错了什么,或者遇到过同样的问题。
谢谢。
最佳答案
我遇到了和你一样的问题。但是没有找到任何帮助...
没有任何错误的删除部分让我抓狂,我几乎放弃了 UIManagedDocument。
但我做了一些实际有效的事情!
实际上我认为问题是在创建文档后尝试访问它,调用选择器:
[_document saveToURL:self.documentURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {}];
然后我所做的就是在保存文档后关闭它,获取一个新实例然后重新打开它。像这样:
[_coreDocument saveToURL:self.documentURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
if (success) {
NSLog(@"Document created");
[_coreDocument closeWithCompletionHandler:^(BOOL success) {
if (success) {
NSLog(@"Closed recently created document, will open it again");
_coreDocument = nil;
_coreDocument = [[CheckinManagedDocument alloc] initWithFileURL:self.documentURL];
[_coreDocument openWithCompletionHandler:^(BOOL success) {
NSLog(@"Document oppened afer creating and closing it");
[self documentIsReadyForUse];
}];
}
}];
} else {
NSLog(@"Could not save the document at path: %@", self.documentURL.path);
}
}];
关于ios - 使用 saveToURL :forSaveOperation:completionHandler: 自动删除 UIManagedDocument 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23944075/
我一直在阅读苹果文档,但仍然有一个问题,我找不到答案。我有一个 UIManagedDocument 对象,它有两个嵌套上下文 - 主线程上的子上下文和私有(private)线程上的父上下文。接下来,我
我已经看过 How do I create a global UIManagedDocument instance per document-on-disk shared by my whole ap
在UIManagedDocument的文档中简要提到了以下内容: 为了支持异步数据写入,Core Data实际上使用一对嵌套的托管对象上下文。 是特定于UIManagedDocument还是Core
所以我将核心数据迁移到UIManagedDocument。 在iPhone模拟器上调用openWithCompletionHandler可以正常工作,但是当我尝试在真实设备上运行项目时,它始终返回NO
我有一个连接到 NSFetchedResultsController 的 TableView ,相应的 managedObjectContext 是 self.myDatabase.managedOb
好吧,假设我正在制作一个观鸟应用。 有一个“官方”鸟类数据库。它存储在一个 UIManagedDocument 中。它用于将所有鸟类填充到 UITableView 中,并使用图片和数据为每只鸟类提供详
我正在尝试使用 Core Data 制作一个 iPhone 应用程序。我必须使用 NSManagedObjectContext 来访问数据,为此我使用了 UIManagedDocument。但是,如果
我的应用使用核心数据 SQLite 数据库。我想让我的用户使用 iCloud 在设备之间同步它 - 我想我可以使用 UIManagedDocument。 我按照 Apple 的文档对其进行了子类化,并
我正在使用这个博客:http://www.adevelopingstory.com/blog/2012/03/core-data-with-a-single-shared-uimanageddocum
我找到了这些斯坦福教程 https://itunes.apple.com/us/course/ipad-iphone-app-development/id495052415 ,一直在听有关核心数据的讲
我正在开发一个使用 UIManagedDocument 子类的 iPhone 应用程序并将其文档存储在 iCloud 上。 一切正常,直到我更改了我的核心数据模型/方案(添加了一个新的模型版本 - 就
首先,我应该提到这是我在这个网站上的第一篇文章。我正在尝试自学 iOS 编程,在谷歌搜索答案时,我发现我经常被引导到这里。所以感谢所有在这里做出贡献的人。你已经帮了我很多了。 我一直在参加斯坦福大学
在斯坦福大学 CS193P 类(class)中,我开始在我的应用程序中使用 CoreData,该类(class)涉及 iOS 5 新类 UIManagedDocument 的使用。该方法本身非常简单,
我的应用程序中有一项功能,用户可以通过单击按钮重置应用程序上的所有内容。此时,我没有尝试删除所有核心数据关系(级联删除)和其他并发症,而是决定使用这段代码实际删除整个 UIManagedDocumen
我设置了异常断点,当我调用时- (void)saveToURL:(NSURL *)url forSaveOperation:(UIDocumentSaveOperation)saveOperation
我正在使用 UIManagedDocument 读取和写入 CoreData。我有 Document 类。这是一些教程中的文档: .h #import #import typedef void (
最近,我在 iOS 中使用一个时间表应用程序,我在使用 Core Data 时遇到了问题。 我的应用程序有一个主用户界面,有点像 Apple 创建的原始日历应用程序,我将所有事件数据保存在 Core
我在使用 UIManagedDocument 保存实体时遇到问题。我有一个 NSFetchedResultsController,其上下文设置为 UIManagedDocuments 上下文。我在 C
如标题中所述,我想同步打开 UIManagedDocument,即,我希望我的执行等到打开完成。我仅在 mainThread 上打开文档。 当前要打开的 API 使用 block [UIManaged
我一直在关注 CS193p 关于核心数据的讲座,但在插入新的托管对象时遇到了问题。 错误是: Terminating app due to uncaught exception 'NSInternal
我是一名优秀的程序员,十分优秀!