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でこれを行っています。私の質問は、ビュー コントローラーでこれらのメソッドを毎回実装せずにコア データ データベースにアクセスするにはどうすればよいかということです。fetch リクエストを実行したいときは managedobject コンテキストが必要だからです。そして今のところ、次の方法でのみ取得できます

self.genkDatabase.managedObjectContext

助けてください よろしくお願いします

4

2 に答える 2

0

そうですね、一つ思いつく方法があります。アプリ全体で共有される AppDelegate で managedObjectContext プロパティを作成できます。Xcode で新しいプロジェクトを作成し (master-Detail アプリケーションを選択)、作成中に「コア データを使用する」オプションをチェックする場合。Xcode は、必要なすべてのコードを自動的に生成し、managedObjectContext プロパティも作成します。

また、次を使用して、アプリ内の任意の場所でコンテキストを取得できます。

AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = appDelegate.managedObjectContext;
于 2012-10-04T09:17:23.543 に答える
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 に答える