Iphone SQL的核心数据不工作

Iphone SQL的核心数据不工作,iphone,ios,xcode,core-data,Iphone,Ios,Xcode,Core Data,我一直在想方设法找出如何在我的核心数据和SQL数据库之间建立连接。该数据库没有预先填充,但在启动时将在许多不同的用户之间使用 我已经三次阅读了斯坦福大学提供的核心数据和iCloud课程,但都没有用。我还仔细研究了iOS中的SQLite/SQL关系数据库,但没有结果。我唯一的另一个选择就是来到这里,发布我能发布的所有代码,并祈祷有人能为我找到答案。就这样 AppDelegate.m - (void)saveContext { NSError *error = nil; NSMana

我一直在想方设法找出如何在我的核心数据和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, [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, NSUserDomainMask, 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];
    }
}
- (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"];
        }
    }];
}
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)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, NSUserDomainMask, 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];
    }
}
- (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"];
        }
    }];
}
-(void)saveShindyToDatabase
{
NSArray*shindys=[[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory-inDomains:NSUserDomainMask];
[self.shindyDatabase.managedObjectContext性能块:^{
适用于(NSDictionary*shindyInfo在shindys中){
[Shindy ShindyWithHindyBinfo:shindyInfo-inManagedObjectContext:self.shindyDatabase.managedObjectContext];
NSURL*url=[[NSFileManager默认管理器]URLsForDirectory:NSDocumentDirectory:NSUserDomainMask]lastObject];
//url=[url URLByAppendingPathComponent:@“默认Shindy数据库”];
self.shindyDatabase=[[UIManagedDocument alloc]initWithFileURL:url];
[self.shindyDatabase setValue:self.detailView.text forKey:@“details”];
if(FBSession.activeSession.isOpen){
[[FBRequest requestForMe]startWithCompletionHandler:
^(FBRequestConnection*连接,NSDictionary*用户,NSError*错误){
如果(!错误){
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用户名:self.username照片:self.photo inManagedObjectContext:self.shindyDatabase.managedObjectContext];
[self.shindy数据库设置值:self.locationManager.location-forKey:@“location”];
[self.shindy数据库设置值:self.dateAndTimePicker.date forKey:@“dateAndTime”];
}
}];
}

我知道我要求的是很多,但我已经用尽了我所有的资源。如果有人能给我指出正确的方向,我将永远感激

如果您计划用CoreData映射现有数据库,则将不成功。 事实上,您无法用CoreData映射任何数据库

核心数据实际上是一种图形对象管理,具有不同的存储选项,sqllite只是其中之一。在启动时,如果选择sqllite作为选项,则应用程序将创建具有特定表结构的数据库。如果您尝试连接到不是由CoreData framework创建的数据库,则会出现错误

您可以做的是去掉CoreData,并将NSObject构建为实体。但是,您必须实现所有的逻辑来保存、更新、版本控制、并发ecc。。。而且这是一个很长(而且有缺陷)的方法,特别是在多用户环境中


否则,如果我误解了你的问题,请告诉我。也许,您可以发布一个错误堆栈跟踪。

要提供准确的引用,请按:“重要提示:尽管核心数据支持SQLite作为存储类型,但与其他原生核心数据存储一样,存储格式是私有的。您不能使用原生SQLite API创建SQLite数据库并直接与核心数据一起使用(您也不应使用本机SQLite API操作现有的核心数据SQLite存储)。如果您有现有的SQLite数据库,则需要将其导入核心数据存储(请参阅“高效导入数据”)此外,我想知道为什么这个问题得到了这么多的赞成票!在这样一个众所周知的问题上。我理解你已经说过的话。我发布了我的代码,因为据我所知,我所有的东西都写得很好,但是,我没有得到错误堆栈。事实上,我根本没有通过数据库/核心数据获得反馈。我已经非常仔细地查看了t他是我发布的代码,我不明白为什么它不起作用。我的问题是:为什么它不起作用?首先,如果你的问题是映射一个现有的数据库,忘记它,你就不能这样做。否则,尝试实现一些错误日志记录,例如在你写了“//handle error”的地方尝试添加[error localizedDescription],并放置一些断点,查看是否调用了该方法,然后逐步查看它在何处中断。