iPhone Core Data 不会从 Sqlite3 获取任何数据

Posted

技术标签:

【中文标题】iPhone Core Data 不会从 Sqlite3 获取任何数据【英文标题】:iPhone Core Data does not fetch any data from Sqlite3 【发布时间】:2010-01-11 16:49:53 【问题描述】:

我将一个已填充的现有 sqlite3 文件复制到我的项目中;找到了(我检查了

- (void)createEditableCopyOfDatabaseIfNeeded 
    NSLog(@"Checking if we have to create editable copy of database");

    // First, test for existence.
    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"hvw.sqlite"];
    success = [fileManager fileExistsAtPath:writableDBPath];
    if (success) return;
    NSLog(@"Creating editable copy of database");
    // The writable database does not exist, so copy the default to the appropriate location.
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"hvw.sqlite"];
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
    if (!success) 
        NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    

我没有来到“创建数据库的可编辑副本”部分,所以文件在那里并找到了。

但是我的 fetch 没有返回任何结果:

NSFetchRequest *request = [[NSFetchRequest alloc] init];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Game" inManagedObjectContext:managedObjectContext];

[request setEntity:entity];

NSError *error;

NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

没有抛出错误,但结果数组为空...

编辑

我换了行

NSString *documentsDirectory = [paths objectAtIndex:0];

通过

NSString *documentsDirectory = [self applicationDocumentsDirectory];

在日志文件中我在尝试保存或读取对象时看到错误:

Operation could not be completed. (Cocoa error 256.)

【问题讨论】:

【参考方案1】:

这个 SQLite 数据库是使用 Core Data 创建的吗?你不能只使用你想要的任何 SQLite 数据库作为持久存储,它必须具有 Core Data 使用的确切内部格式。

如果这是一个标准 SQLite 数据库,您希望将其引入 Core Data,我的建议是编写一个迁移方法,该方法接受 SQLite 并从中创建 Core Data 托管对象,设置所有适当的关系。迁移操作完成后,您可以将生成的持久性存储写入磁盘,然后将其用于应用程序中的 Core Data。如果您更喜欢冒险,您可以在后台线程上进行此迁移,在从 SQLite 解析托管对象时传递通知以将托管对象添加到主线程的托管对象上下文中。

【讨论】:

我假设我的 sqlite 文件具有它需要的结构......我是根据 ablogontech.wordpress.com/2009/07/13/… 如果我正确理解那篇文章,他从 Core Data 创建了一个空白 SQLite 数据库,然后手动填充其中的数据?这并不能保证您的元素的关系和其他数据将采用 Core Data 期望的格式。 嗯...但是我该如何使用预填充的数据库呢? 我创建了一个也使用 Core Data 的 Mac 应用程序。我使用 Mac 应用程序填充数据库,然后移动文件。 Core Data 在平台之间是兼容的。更多:***.com/questions/928177/… 这是可能的,但您需要完全遵循内部 Core Data SQLite 格式,这需要您进行一些逆向工程。如果这可以通过使用 Core Data 的 Mac 应用程序以某种方式在后端生成,或者数据可以以另一种格式发送并由您的应用程序输入到 Core Data 数据库中,事情会容易得多。

以上是关于iPhone Core Data 不会从 Sqlite3 获取任何数据的主要内容,如果未能解决你的问题,请参考以下文章

从现有 XSD 创建托管对象模型 - iPhone Core Data

在 Iphone 中使用 Core Data 从 SQLite 数据库中获取主键值

难以调试 iPhone Core Data 错误

如何在 Mac 和 iPhone 之间同步 Core-Data 应用程序?

Core Data iphone调试指针

RestKit / Core Data:远程删除的实体不会从 Core Data 中删除