iPhone Core Data无法从Sqlite3获取任何数据

时间:2010-01-11 16:49:54

标签: iphone core-data sqlite

我将已填充的现有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]);
    }
}

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

但我的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 个答案:

答案 0 :(得分:1)

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

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