菜鸟教程小白 发表于 2022-12-13 00:42:01

ios - 将 SQLite 导入 CoreData


                                            <p><p>我在 CoreData 中完全是菜鸟,我遇到了麻烦。我的测试数据库包含 1 个名为 ZDOCTOR 的表</p>

<pre><code>CREATE TABLE &#34;ZDOCTOR&#34; (
&#34;id&#34; integer NOT NULL ON CONFLICT REPLACE DEFAULT 0,
&#34;doctorName&#34; text,
&#34;doctorSpec&#34; text,
PRIMARY KEY(&#34;id&#34;)
)
</code></pre>

<p>App .xcdatamodel 有 1 个对应的实体,名为“Doctor”<img src="/image/Yo0cm.png" alt="enter image description here"/> </p>

<p>我的设置管理上下文方法:</p>

<pre><code>- (void)setupManagedObjectContext
{
    _objectContext = [ initWithConcurrencyType:NSMainQueueConcurrencyType];
    _objectModel = ;
    NSError *error = nil;
    NSURL *appDocumentDir = [[ URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    NSString *documentsStorePath = [ stringByAppendingPathComponent:@&#34;MyApp.sqlite&#34;];
    if (![ fileExistsAtPath:documentsStorePath]) {
      NSString *defaultStorePath = [ pathForResource:@&#34;MyApp&#34; ofType:@&#34;sqlite&#34;];
      if (defaultStorePath) {
            [ copyItemAtPath:defaultStorePath toPath:documentsStorePath error:NULL];
      }
    }
    NSPersistentStoreCoordinator *coordinator = [ initWithManagedObjectModel:_objectModel];
    NSURL *defaultStoreURL = ;
    ;
    if (error) {
      NSLog(@&#34;%@&#34;, error);
      abort();
    }
    ;
}
</code></pre>

<p>在 <code>;</code> 我得到错误 <code>SQLite error code:1, 'table already exists'</code></code>.</p>

<p>但如果我将表重命名为其他任何名称,一切正常,除了 <code></code> 在 <code>-performFetch:</code></p> 之后为空</p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这是因为您尝试手动创建 SQLite 表,而不是让 Core Data 这样做,而您做错了。在两个意义上是错误的:(1)您的方案对于 Core Data 不正确(表名可能是正确的,其他所有内容都是错误的),以及(2)实际上没有正确的方法,因为 Core Data 模式是使用未记录的规则创建的。</p>

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

<p>至于你描述的症状,错误<code>table already exists</code>很清楚。您创建了一个与 Core Data 想要使用的名称相同但架构冲突的表。 Core Data 对此 react 不佳。 </p>

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

<p>如果您尝试创建一个预先填充的数据存储,那么还有其他 SO 问题涵盖了这一点。通常,它们涉及在 Core Data 中创建预先填充的存储,然后保存该文件以供以后重复使用。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 将 SQLite 导入 CoreData,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/25283625/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/25283625/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 将 SQLite 导入 CoreData