iphone – Core Data to SQL无法正常工作
我一直在努力想弄清楚如何在我的核心数据和我之间建立联系.我的SQL数据库.数据库未预先填充,但在启动时将在许多不同的用户中使用.
我已经完成了核心数据和斯坦福大学提供的iCloud课程三次无济于事.我也深入研究iOS中的SQLite / SQL关系数据库无济于事.我唯一的另一个选择是来到这里,发布我能做的所有代码,并祈祷有人会给我一个答案.所以这里…… AppDelegate.m - (void)saveContext { NSError *error = nil; NSManagedObjectContext *managedObjectContext = self.managedObjectContext; if (managedObjectContext != nil) { if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { NSLog(@"Unresolved error %@,%@",error,[error userInfo]); abort(); } } } #pragma mark - Core Data stack - (NSManagedObjectContext *)managedObjectContext { if (_managedObjectContext != nil) { return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { _managedObjectContext = [[NSManagedObjectContext alloc] init]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; } return _managedObjectContext; } - (NSManagedObjectModel *)managedObjectModel { if (_managedObjectModel != nil) { return _managedObjectModel; } NSURL *modelURL = [self applicationDocumentsDirectory]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; return _managedObjectModel; } - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (_persistentStoreCoordinator != nil) { return _persistentStoreCoordinator; } NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"shindy.sqlite"]; NSError *error = nil; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { NSLog(@"Unresolved error %@,[error userInfo]); abort(); } return _persistentStoreCoordinator; } #pragma mark - Application's Documents directory - (NSURL *)applicationDocumentsDirectory { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *path = [documentsDirectory stringByAppendingPathComponent:@"shindy.sqlite"]; return [NSURL fileURLWithPath:path]; } HomeViewController.m - (void)setupFetchedResultsController { NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Shindy"]; request.sortDescriptors = [NSArray arrayWithObjects: [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES],[NSSortDescriptor sortDescriptorWithKey:@"dateAndTime" ascending:YES],[NSSortDescriptor sortDescriptorWithKey:@"photo" ascending:YES],[NSSortDescriptor sortDescriptorWithKey:@"details" ascending:YES],[NSSortDescriptor sortDescriptorWithKey:@"timePosted" ascending:YES],[NSSortDescriptor sortDescriptorWithKey:@"location" ascending:YES],nil]; self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.shindyDatabase.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; } - (void)fetchShindyDataIntoDocument:(UIManagedDocument *)document { dispatch_queue_t fetchQ = dispatch_queue_create("Shindy Fetcher",nil); dispatch_async(fetchQ,^{ NSArray *shindys = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]; NSLog(@"shindys = %@",shindys); [document.managedObjectContext performBlock:^{ for (NSDictionary *shindyInfo in shindys) { [Shindy shindyWithShindyDBInfo:shindyInfo inManagedObjectContext:document.managedObjectContext]; NSLog(@"fire"); } }]; }); } - (void)useDocument { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *path = [documentsDirectory stringByAppendingPathComponent:@"shindy.sqlite"]; if (![[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil]) { [self.shindyDatabase saveToURL:self.shindyDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) { [self setupFetchedResultsController]; [self fetchShindyDataIntoDocument:self.shindyDatabase]; }]; } else if (self.shindyDatabase.documentState == UIDocumentStateClosed) { [self.shindyDatabase openWithCompletionHandler:^(BOOL success) { [self setupFetchedResultsController]; }]; } else if (self.shindyDatabase.documentState == UIDocumentStateNormal) { [self setupFetchedResultsController]; } } - (void)setShindyDatabase:(UIManagedDocument *)shindyDatabase { [self useDocument]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self fetchShindyDataIntoDocument:self.shindyDatabase]; if (!self.shindyDatabase) { [self setShindyDatabase:self.shindyDatabase]; } } Shindy ShindyDB.m + (Shindy *)shindyWithShindyDBInfo:(NSDictionary *)shindyInfo inManagedObjectContext:(NSManagedObjectContext *)context { Shindy *shindy = nil; NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Shindy"]; NSSortDescriptor *dateAndTimeSort = [NSSortDescriptor sortDescriptorWithKey:@"dateAndTime" ascending:YES]; NSSortDescriptor *detailsSort = [NSSortDescriptor sortDescriptorWithKey:@"details" ascending:YES]; NSSortDescriptor *locationSort = [NSSortDescriptor sortDescriptorWithKey:@"location" ascending:YES]; NSSortDescriptor *nameSort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; NSSortDescriptor *photoSort = [NSSortDescriptor sortDescriptorWithKey:@"photo" ascending:YES]; NSSortDescriptor *timePostedSort = [NSSortDescriptor sortDescriptorWithKey:@"timePosted" ascending:YES]; // title request.sortDescriptors = [NSArray arrayWithObjects:dateAndTimeSort,detailsSort,locationSort,nameSort,photoSort,timePostedSort,nil]; NSError *error = nil; NSArray *matches = [context executeFetchRequest:request error:&error]; if (!matches || ([matches count] > 1)) { // handle error } else if ([matches count] == 0) { shindy = [NSEntityDescription insertNewObjectForEntityForName:@"Shindy" inManagedObjectContext:context]; shindy.dateAndTime = [shindyInfo objectForKey:@"dateAndTime"]; shindy.details = [shindyInfo objectForKey:@"details"]; shindy.location = [shindyInfo objectForKey:@"location"]; shindy.name = [shindyInfo objectForKey:@"name"]; shindy.photo = [shindyInfo objectForKey:@"photo"]; shindy.timePosted = [shindyInfo objectForKey:@"timePosted"]; // title // Guestlist? The rest? // Use below for reference shindy.whoseShindy = [User userWithName:[shindyInfo objectForKey:@"whoseShindy"] inManagedObjectContext:context]; } else { shindy = [matches lastObject]; } shindy = [NSEntityDescription insertNewObjectForEntityForName:@"Shindy" inManagedObjectContext:context]; shindy.dateAndTime = [shindyInfo objectForKey:@"dateAndTime"]; shindy.details = [shindyInfo objectForKey:@"details"]; shindy.location = [shindyInfo objectForKey:@"location"]; shindy.name = [shindyInfo objectForKey:@"name"]; shindy.photo = [shindyInfo objectForKey:@"photo"]; shindy.timePosted = [shindyInfo objectForKey:@"timePosted"]; return shindy; } AddShindyViewController.m - (void)saveShindyToDatabase { NSArray *shindys = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]; [self.shindyDatabase.managedObjectContext performBlock:^{ for (NSDictionary *shindyInfo in shindys) { [Shindy shindyWithShindyDBInfo:shindyInfo inManagedObjectContext:self.shindyDatabase.managedObjectContext]; NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; // url = [url URLByAppendingPathComponent:@"Default Shindy Database"]; self.shindyDatabase = [[UIManagedDocument alloc] initWithFileURL:url]; [self.shindyDatabase setValue:self.detailView.text forKey:@"details"]; if (FBSession.activeSession.isOpen) { [[FBRequest requestForMe] startWithCompletionHandler: ^(FBRequestConnection *connection,NSDictionary<FBGraphUser> *user,NSError *error) { if (!error) { self.name = user.name; self.photo.profileID = user.id; self.username = user.username; } }]; } [self.shindyDatabase setValue:self.name forKey:@"name"]; [self.shindyDatabase setValue:self.photo forKey:@"photo"]; [self.shindyDatabase setValue:self.username forKey:@"username"]; // [Guest guestWithName:self.name username:self.username photo:self.photo inManagedObjectContext:self.shindyDatabase.managedObjectContext]; [self.shindyDatabase setValue:self.locationManager.location forKey:@"location"]; [self.shindyDatabase setValue:self.dateAndTimePicker.date forKey:@"dateAndTime"]; } }]; } 我知道我要求的是一个很多的地狱,但我已经用尽了我掌握的所有资源.如果有人甚至可以指出我正确的方向,我会永远感激! 解决方法
如果您计划使用CoreData映射现有数据库,则不会成功.
事实上,你无法使用CoreData映射任何数据库. Core Data infact是一个图形对象管理,具有不同的存储选项,而sqllite只是其中一种可能性.在启动时,如果选择sqllite作为选项,则应用程序将创建具有特定表结构的数据库.如果您尝试连接到不是由CoreData框架创建的数据库,则会出现错误. 你可以做的就是摆脱CoreData,并构建你的NSObject来扮演类似实体的角色.但是,你必须实现所有逻辑来保存,更新,版本控制,并发ecc ……这是一种漫长的(和错误的)方式,特别是在多用户环境中. 否则,告诉我,我是否误解了你的问题.也许,您可以发布错误堆栈跟踪. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |