如何将预先存在的sqlite文件导入Core Data?

时间:2011-07-05 00:12:19

标签: iphone ios sqlite core-data

我需要将.sqlite文件导入Core Data,我在互联网上搜索并找到:

Core Data Tutorial: How To Preload/Import Existing Data

通过读入旧数据库的内容并在新数据库中创建适当的行,创建一个Python脚本来填充此数据库。但是我的sqlite数据库在表和列的数量上太大了,这可能花费我相当长的时间。

我也发现了这个:

Using a Pre-Populated SQLite Database with Core Data on iPhone OS 3.0

但是我不太明白它,看起来它正在将旧数据库复制到新数据库,那么它如何将Z_后缀添加到所有表和列名称?另外,它要求我创建实体和属性,无论如何这可以自动完成(来自sqlite dabase文件)?

谢谢!

2 个答案:

答案 0 :(得分:2)

这里的答案可能有用(我的就是其中之一)

Pre-populate Core Data

 /**
 Returns the path to the application's Documents directory.
*/
      - (NSString *)applicationDocumentsDirectory {
          return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, YES) lastObject];
      }

sample code

答案 1 :(得分:0)

// Returns the persistent store coordinator for the application.
// If the coordinator doesn't already exist, it is created and the application's store added to it.
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil)
    {
        return _persistentStoreCoordinator;
    }

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"yourSqlite.sqlite"];

    NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"yourSqlite.sqlite" ofType:nil];

    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSError *error = nil;

    if  (![[NSFileManager defaultManager] fileExistsAtPath:[documentsDirectory stringByAppendingPathComponent:@"yourSqlite.sqlite"] ]) {

        if([[NSFileManager defaultManager] copyItemAtPath:sourcePath toPath:[documentsDirectory stringByAppendingPathComponent:@"yourSqlite.sqlite"] error:&error]){
            NSLog(@"Default file successfully copied over.");
        } else {
            NSLog(@"Error description-%@ \n", [error localizedDescription]);
            NSLog(@"Error reason-%@", [error localizedFailureReason]);
        }
    }

    _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;
}