将SQLite导入CoreData

时间:2014-08-13 10:19:18

标签: ios objective-c sqlite core-data

我在CoreData中非常棒,我遇到了麻烦。我的测试数据库包含1个名为ZDOCTOR的表

CREATE TABLE "ZDOCTOR" (
 "id" integer NOT NULL ON CONFLICT REPLACE DEFAULT 0,
 "doctorName" text,
 "doctorSpec" text,
PRIMARY KEY("id")
)

App .xcdatamodel有1个对应的实体,名为" Doctor" enter image description here

我的设置托管上下文方法:

- (void)setupManagedObjectContext
{
    _objectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    _objectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
    NSError *error = nil;
    NSURL *appDocumentDir = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    NSString *documentsStorePath = [[appDocumentDir path] stringByAppendingPathComponent:@"MyApp.sqlite"];
    if (![[NSFileManager defaultManager] fileExistsAtPath:documentsStorePath]) {
        NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"MyApp" ofType:@"sqlite"];
        if (defaultStorePath) {
            [[NSFileManager defaultManager] copyItemAtPath:defaultStorePath toPath:documentsStorePath error:NULL];
        }
    }
    NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:_objectModel];
    NSURL *defaultStoreURL = [NSURL fileURLWithPath:documentsStorePath];
    [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:defaultStoreURL options:nil error:&error];
    if (error) {
        NSLog(@"%@", error);
        abort();
    }
    [_objectContext setPersistentStoreCoordinator:coordinator];
}

[coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:defaultStoreURL options:nil error:&error];行中,我收到了错误SQLite error code:1, 'table already exists'

但是,如果我将表重命名为其他任何内容,一切正常,除了[_fetchedResultContoller fetchedObjects]

之后-performFetch:为空

1 个答案:

答案 0 :(得分:1)

这是因为您尝试手动创建SQLite表而不是让Core Data这样做,而且您做错了。错误的两个方面:(1)你的方案对于核心数据是不正确的(表名可能是正确的,其他一切都是错的),以及(2)实际上没有正确的方法,因为核心数据模式是使用未记录的规则创建的。 / p>

我不确定你的目标是什么。这不是Core Data的设计方式。它使用SQLite的事实是一个实现细节,没有反映在Core Data的API中(它也可以使用非SQLite存储)。如果您关注实际架构,那么您已经在做错了核心数据。当然,您可以使用与其设计的方式不同的方式使用Core Data,但如果您这样做,那么您将承担所有麻烦和风险。

至于您描述的症状,错误table already exists非常清楚。您创建了一个与Core Data想要使用的名称相同但具有冲突架构的表。核心数据对此没有很好的反应。

重命名表后的空提取请求是有意义的。 Core Data创建了自己的表,并且(可能)忽略了您创建的表。

如果您要尝试创建的是预先填充的数据存储,那么还有其他SO问题可以解决此问题。通常,它们涉及在Core Data中创建预先填充的存储,然后保存该文件以便以后重用。