NSFetchRequest从使用UIManagedDocument创建的数据库中获取实体的零匹配

时间:2013-08-13 21:02:54

标签: uimanageddocument

我在Core Data上使用Justin Driscoll's article,使用单例模式的UIManagedDocument为UITabViewController设置它。我在模拟器上运行应用程序。它第一次正常工作。数据库创建成功,我可以在tableview控制器中查看每个选项卡的数据。但是当我重新启动我的应用程序时,tableviews是空的,因为NSFetchRequest为实体提取0匹配。第一次运行期间,相同的提取请求会获取正确的结果。

我认为在我在模拟器中停止应用程序之前,它与加载数据和数据的异步性质有关。因此,在第二轮应用程序中无法获得数据。

我在代码中看到的数据加载方式。 fetchDataIntoDocument方法执行初始加载数据。

// Document Handler Singleton Class

 -(void) performWithDocument:(OnDocumentReady)onDocumentReady {

     void (^OnDocumentDidLoad)(BOOL) = ^(BOOL Success) {
              onDocumentReady(self.document);
     };

    if (![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]]) {
        **[self fetchDataIntoDocument:self.document];**  
        [self.document saveToURL:self.document.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:OnDocumentDidLoad];
    } else if (self.document.documentState == UIDocumentStateClosed) {
        [self.document openWithCompletionHandler:OnDocumentDidLoad];
    } else if (self.document.documentState == UIDocumentStateNormal) {  
        OnDocumentDidLoad(YES);
    }
 }

 -(void)fetchDataIntoDocument:(UIManagedDocument *)document {

       MyEntityDataController *dc= [[MyEntityDataController alloc] init];
       NSDictionary *entityInfo  =[dc getEntityInfo];
       [document.managedObjectContext performBlock:^{
                 [Entity createEntityWithInfo:entityInfo   inManagedObjectContext:document.managedObjectContext];
       }];
 }

我的TableViewController类

 -(void)viewWillAppear:(BOOL)animated {

      [super viewWillAppear:animated];
      if (!self.databaseDocument) {
           [[LTDatabaseDocumentHandler sharedDatabaseDocumentHandler] performWithDocument:^    (UIManagedDocument *document) {
           self.databaseDocument = document;
           [self populateTableViewArrayFromDocument:self.databaseDocument];
           }];
      }
  } 

在populateTableViewArrayFromDocument中,我正在执行我的获取请求

  -(void)populateTableViewArrayFromDocument:(UIManagedDocument *)document
{
       NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Entity2"];
       NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
     NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
      [request setSortDescriptors:sortDescriptors];

     NSError *error = nil;
     NSArray *matches = [self.databaseDocument.managedObjectContext  executeFetchRequest:request error:&error];
     NSLog(@" matches count for Entity2 %d", matches.count);
     for (Entity2 *entity2 in matches) {
        //do stuff with data and add it to tableview array
     }
    }

1 个答案:

答案 0 :(得分:1)

我想我已经找到了你为什么遇到这个问题。我刚刚遇到这个问题,需要进行一些研究才能弄明白。基本上,你是对的。问题确实存在于UIManagedDocument的异步特性中。您需要等到文档加载到内存中然后进行提取。

这是我用来确保文档准备就绪的代码:

 if ([[NSFileManager defaultManager] fileExistsAtPath:[_URLDocument path]]) {
        [_managedDocument openWithCompletionHandler:^(BOOL success){
            [self ready]
            if (!success) {
                // Handle the error.
            }
        }];
 } 

希望这有帮助,欢呼!