0

我正在使用核心数据数据库。到目前为止,我的工作是从 Web 服务获取我的所有数据并将其放入核心数据数据库中。为此,我正在做以下事情。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    if (!self.genkDatabase) {  // we'll create a default database if none is set
        NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
        url = [url URLByAppendingPathComponent:@"Default appGenk Database"];
        self.genkDatabase = [[UIManagedDocument alloc] initWithFileURL:url]; // setter will create this for us on disk
    }
}
- (void)fetchGenkDataIntoDocument:(UIManagedDocument *)document
{
    NSLog(@"Fetch data");
    dispatch_queue_t fetchQ = dispatch_queue_create("Genk fetcher", NULL);
    dispatch_async(fetchQ, ^{
        NSArray *news       = [GenkData getNews];
        NSArray *players    = [GenkData getPlayers];
        NSArray *staff      = [GenkData getStaff];
        NSArray *trainingen = [GenkData getTrainingen];

        [document.managedObjectContext performBlock:^{ // perform in the NSMOC's safe thread (main thread)
            for (NSDictionary *genkInfo in news) {
               [News newsWithGenkInfo:genkInfo inManagedObjectContext:document.managedObjectContext];
                // table will automatically update due to NSFetchedResultsController's observing of the NSMOC
            }
            for (NSDictionary *genkInfo in staff) {
                [Staff staffWithGenkInfo:genkInfo inManagedObjectContext:document.managedObjectContext];
                // table will automatically update due to NSFetchedResultsController's observing of the NSMOC
            }
            for (NSDictionary *genkInfo in players) {
                [Team teamWithGenkInfo:genkInfo inManagedObjectContext:document.managedObjectContext];
                // table will automatically update due to NSFetchedResultsController's observing of the NSMOC
            }
            for (NSDictionary *genkInfo in trainingen ) {
                [Training trainingWithGenkInfo:genkInfo inManagedObjectContext:document.managedObjectContext];

            }
            [document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];
            // note that we don't do anything in the completion handler this time
        }];
    });
}
- (void)setGenkDatabase:(UIManagedDocument *)genkDatabase
{
    if (_genkDatabase != genkDatabase) {
        _genkDatabase = genkDatabase;
        [self useDocument];
    }
}
- (void)useDocument
{
    if (![[NSFileManager defaultManager] fileExistsAtPath:[self.genkDatabase.fileURL path]]) {
        // does not exist on disk, so create it
        [self.genkDatabase saveToURL:self.genkDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {

            [self setupFetchedResultsController];
            [self fetchGenkDataIntoDocument:self.genkDatabase];

        }];
    } else if (self.genkDatabase.documentState == UIDocumentStateClosed) {
        // exists on disk, but we need to open it
        [self.genkDatabase openWithCompletionHandler:^(BOOL success) {
            [self setupFetchedResultsController];
        }];
    } else if (self.genkDatabase.documentState == UIDocumentStateNormal) {
        // already open and ready to use
        [self setupFetchedResultsController];
    }

}

- (void)setupFetchedResultsController // attaches an NSFetchRequest to this UITableViewController
{

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"News"];
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO]];

    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                        managedObjectContext:self.genkDatabase.managedObjectContext
                                                                          sectionNameKeyPath:nil
                                                                                   cacheName:nil];

}

我在打开的第一个 viewController 上执行此操作。我的问题是知道如何在不每次都在视图控制器中实现这些方法的情况下访问核心数据数据库?因为当我想执行一个获取请求时,我需要一个托管对象上下文。现在我只能通过以下方式获得它

self.genkDatabase.managedObjectContext

请帮助 非常感谢提前

4

2 回答 2

0

如果我是你,我会使用单调对象(例如 FetchDataHandler)和 ObjectDelegate 来处理这个问题。

1.So you don't need to keep repeating the code.

与其把代码放在视图控制器中,不如把它放在这个对象中,并提供方法。

- (void)fetchDataFrom:(NSURL *)_url

和代表

- (void)fetchDataHandler:(FetchDataHandler *) _handler didFinishFetchingData:(XXXXX *) _XXXX

其中 XXXX 是您从 URL 返回的内容。

根据您的代码,替换

[self setupFetchedResultsController]; 

[self.delegate fetchDataHandler:self didFinishFetchingData:self.data];

因此,您可以使用 'fetchDataFrom' 开始获取,当它完成时将调用 'didFinishFetchingData'。

主要思想是分离后端代码和前端代码。

如果我错了,请发表评论。

于 2012-10-04T09:26:01.623 回答
0

好吧,我能想到一种方法。您可以在 AppDelegate 中创建 managedObjectContext 属性,该属性将在整个应用程序中共享。如果您在 Xcode 中创建一个新项目并(选择 master-Detail 应用程序)并在创建时选中“使用核心数据”选项。Xcode 会自动生成所有需要的代码,还会创建一个 managedObjectContext 属性。

您可以使用以下方法在应用程序中的任何位置获取上下文,

AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = appDelegate.managedObjectContext;
于 2012-10-04T09:17:23.543 回答