Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将SQLite导入CoreData_Ios_Objective C_Sqlite_Core Data - Fatal编程技术网

Ios 将SQLite导入CoreData

Ios 将SQLite导入CoreData,ios,objective-c,sqlite,core-data,Ios,Objective C,Sqlite,Core Data,我对CoreData一无所知,我有麻烦了。我的测试数据库包含一个名为ZDOCTOR的表 CREATE TABLE "ZDOCTOR" ( "id" integer NOT NULL ON CONFLICT REPLACE DEFAULT 0, "doctorName" text, "doctorSpec" text, PRIMARY KEY("id") ) App.xcdatamodel有一个名为“Doctor”的对应实体 这是我的安装托管上下文方法: - (void)setupMana

我对CoreData一无所知,我有麻烦了。我的测试数据库包含一个名为ZDOCTOR的表

CREATE TABLE "ZDOCTOR" (
 "id" integer NOT NULL ON CONFLICT REPLACE DEFAULT 0,
 "doctorName" text,
 "doctorSpec" text,
PRIMARY KEY("id")
)
App.xcdatamodel有一个名为“Doctor”的对应实体

这是我的安装托管上下文方法:

- (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配置:nil URL:defaultStoreURL选项:nil错误:&error]我得到错误
SQLite错误代码:1,“表已经存在”


但如果我将表重命名为其他名称,则一切正常,除了
[\u fetchedResultContoller fetchedObjects]
-performFetch:

之后是空的,这是因为您试图手动创建SQLite表,而不是让核心数据这样做,而且您做错了。在两种意义上是错误的:(1)您的方案对于核心数据是不正确的(表名可能是正确的,其他一切都是错误的),以及(2)实际上没有正确的方法,因为核心数据模式是使用未记录的规则创建的

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

至于您描述的症状,错误
表已经存在
非常清楚。您创建了一个表,该表的名称与核心数据想要使用的名称相同,但架构冲突。核心数据对此反应不佳

重命名表后的空获取请求是有意义的。核心数据正在创建自己的表,并且(可能)忽略了您创建的表


如果您正试图创建一个预填充的数据存储,那么还有其他一些问题涉及到这一点。一般来说,它们包括在核心数据中创建预填充的存储,然后保存该文件以供以后重用。

sqlite文件实际上是用核心数据(和相同的模型)创建的吗?您知道核心数据不是sqlite包装器,对吗?比Objective-C更适合作为汇编语言包装器。您不能只打开包含核心数据的任意SQLite文件,核心数据也不能保证它将如何将其模式呈现为表或语句。