• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 将 SQLite 导入 CoreData

[复制链接]
菜鸟教程小白 发表于 2022-12-13 00:42:01 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我在 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:

之后为空



Best Answer-推荐答案


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

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap