2012-10-04 111 views
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上做了這個。 我的問題是知道我怎樣才能到不用每次都核心數據的數據庫實現我的視圖控制器這些方法?因爲當我想執行提取請求時,我需要一個managedobject上下文。而現在我只能通過以下

self.genkDatabase.managedObjectContext

得到它請幫助 提前感謝

回答

0

那麼,有我能想到的一種方式。您可以在AppDelegate中創建managedObjectContext屬性,該屬性將在應用程序中共享。如果您在Xcode中創建一個新項目並(選擇master-Detail應用程序)並在創建時選中「使用核心數據」選項。 Xcode將自動生成所有需要的代碼,並且還將創建一個managedObjectContext屬性。

而且你可以通過使用應用程序的任何地方獲得的情況下,

AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate; 
NSManagedObjectContext *context = appDelegate.managedObjectContext; 
0

如果我是你,我會用一個singletone對象(例如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' 將被調用。

的主要思想是單獨的後端代碼和前端的代碼。如果我

評論是錯誤的。