需要从SQLite数据库填充核心数据

时间:2011-08-08 06:22:20

标签: iphone objective-c xcode sqlite core-data

我有一个包含4个表的SQLite数据库,我想将其加载到我的Core Data数据库中,以便实现核心数据。任何人都可以帮我这个吗?

我已准备好核心数据应用程序,并且已准备好SQLite数据库。我需要将数据从SQLite表中复制到他们在App委托中的核心数据中的4个相应实体。

我目前正在使用此代码,如何编辑它,以便不是添加到数组,而是在MOC中创建一个新对象?

-(NSMutableArray *) getCPTCodes
{
    sqlite3 *database = CodesDatabase();

    NSMutableArray *cptCodes = [[[NSMutableArray alloc] init] autorelease];

    NSString *nsquery = [[NSString alloc] initWithFormat:@"SELECT code, short_description, medium_description FROM cpt_codes"];
    const char *query = [nsquery UTF8String];
    [nsquery release];

    sqlite3_stmt *statement;
    int prepareCode = (sqlite3_prepare_v2( database, query, -1, &statement, NULL));
    if(prepareCode == SQLITE_OK) {
        while (sqlite3_step(statement) == SQLITE_ROW)
        {
            CPTCodes *code = [[CPTCodes alloc] init];
            code.code = [NSString stringWithCString:(char *)sqlite3_column_text(statement, 0) encoding:NSUTF8StringEncoding];
            code.name = [NSString stringWithCString:(char *)sqlite3_column_text(statement, 1) encoding:NSUTF8StringEncoding];
            code.description = [NSString stringWithCString:(char *)sqlite3_column_text(statement, 2) encoding:NSUTF8StringEncoding];
            [cptCodes addObject:code];
            //            NSLog(@"Code: %@ Short Description: %@ Long Description: %@", hcpcsCode.code, hcpcsCode.name, hcpcsCode.description);
            [code release];
        }
        sqlite3_finalize(statement);
    }
    return cptCodes;
}

不是将其加载到数组中,而是使用它将它作为核心数据中的对象添加?

insertNewObjectForEntityForName:inManagedObjectContext:

1 个答案:

答案 0 :(得分:1)

看起来您可以创建一个实体和NSManagedObject子类来代替现有代码中的Code类。

您的实体看起来像:

CPTCode{
  code:string
  name:string
  desc:string // "description" is a method of NSObject so you can't use it as a property name
}

...然后你可以让Xcode生成一个自定义子类,为了清楚起见,我们称之为CPTCodeMO

然后您调整现有代码:

CPTCodeMO *code;
while (sqlite3_step(statement) == SQLITE_ROW){
  code=[NSEntityDescription insertNewObjectForEntityForName:@"CPTCode" inManagedObjectContext:self.managedObjectContext];
  code.code = [NSString stringWithCString:(char *)sqlite3_column_text(statement, 0) encoding:NSUTF8StringEncoding];
  code.name = [NSString stringWithCString:(char *)sqlite3_column_text(statement, 1) encoding:NSUTF8StringEncoding];
  code.description = [NSString stringWithCString:(char *)sqlite3_column_text(statement, 2) encoding:NSUTF8StringEncoding];
}

每次遍历循环都会创建一个新的CPTCodeMO实例并将其插入到托管对象上下文中。创建所有新实例后,您只需保存上下文:

[self.managedObjectContext save:&saveError];

......你做完了。

当然有细微差别,但这是基本的想法。

执行一次,您将拥有包含现有数据的Core Data SQLite存储文件。然后,您可以将其包含在应用程序包中以随应用程序一起提供,或者使用它执行其他操作。

我通常在Xcode中创建一个小实用程序app项目,只是为了进行这种导入。