我在 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”
我的设置管理上下文方法:
- (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: 之后为空
Best Answer-推荐答案 strong>
这是因为您尝试手动创建 SQLite 表,而不是让 Core Data 这样做,而您做错了。在两个意义上是错误的1)您的方案对于 Core Data 不正确(表名可能是正确的,其他所有内容都是错误的),以及(2)实际上没有正确的方法,因为 Core Data 模式是使用未记录的规则创建的。
我不确定您的目标是什么。这不是 Core Data 的设计用途。它使用 SQLite 的事实是一个没有反射(reflect)在 Core Data 的 API 中的实现细节(它也可以使用非 SQLite 存储)。如果您担心实际的架构,那么您已经在做 Core Data 错误了。您当然可以以不同于其设计用途的方式使用 Core Data,但如果您这样做了,那么您将承担这样做的所有麻烦和风险。
至于你描述的症状,错误table already exists 很清楚。您创建了一个与 Core Data 想要使用的名称相同但架构冲突的表。 Core Data 对此 react 不佳。
重命名表后的空提取请求是有意义的。 Core Data 正在创建自己的表,并且(可能)忽略了您创建的表。
如果您尝试创建一个预先填充的数据存储,那么还有其他 SO 问题涵盖了这一点。通常,它们涉及在 Core Data 中创建预先填充的存储,然后保存该文件以供以后重复使用。
关于ios - 将 SQLite 导入 CoreData,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/25283625/
|