与核心数据的数据库
问题描述:
我与核心数据的数据库工作工作。到目前为止,我的工作是从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
得到它请帮助 提前感谢
答
那么,有我能想到的一种方式。您可以在AppDelegate中创建managedObjectContext属性,该属性将在应用程序中共享。如果您在Xcode中创建一个新项目并(选择master-Detail应用程序)并在创建时选中“使用核心数据”选项。 Xcode将自动生成所有需要的代码,并且还将创建一个managedObjectContext属性。
而且你可以通过使用应用程序的任何地方获得的情况下,
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = appDelegate.managedObjectContext;
答
如果我是你,我会用一个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' 将被调用。
的主要思想是单独的后端代码和前端的代码。如果我
评论是错误的。