gpt4 book ai didi

ios - 将 SQLite 导入 CoreData

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:21:32 26 4
gpt4 key购买 nike

我完全不是 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:

之后为空

最佳答案

这是因为您试图手动创建 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com