菜鸟教程小白 发表于 2022-12-12 23:03:36

ios - 核心数据 - 轻量级迁移不起作用


                                            <p><p>我是 Core Data 的新手,我目前正在使用 Core Data 维护一个应用程序。</p>

<p>由于需要尽快发布应用程序的新版本,我必须将 en Entity 添加到数据模型中。</p>

<p>我已按照本教程 <a href="https://www.raywenderlich.com/27657/how-to-perform-a-lightweight-core-data-migration" rel="noreferrer noopener nofollow">Lightweight tutorial</a>这非常有用,但我也阅读了所有 Apple 文档,还阅读了这篇精彩的文章 <a href="https://www.objc.io/issues/4-core-data/core-data-migration/" rel="noreferrer noopener nofollow">Core Data Migration</a>以便在全局范围内了解其工作原理。</p>

<p>虽然我只需要向数据模型添加一个实体,但我听说在这种情况下可以进行轻量级迁移。</p>

<p>只有 1 个新实体(没有属性)我必须链接到已经存在的父实体。 </p>

<p>到目前为止我做了什么:</p>

<ul>
<li>应用程序当前使用的是数据模型的第 3 版</li>
<li>我从第 3 版创建了一个新的数据模型(第 4 版)</li>
<li>我已选择数据模型版本 4 作为当前数据模型</li>
<li>我创建了我的新实体(没有属性),并将其链接到父实体。</li>
<li>我已经创建了生成的类对象</li>
<li>然后我修改了我的用户界面</li>
</ul>

<p>构建并运行,它可以工作,很酷。但是当我从 AppStore 下载当前版本,并且当我从 TestFlight 安装新的最近制作的存档/IPA 时,(安装在旧版本上 -> 迁移场景)应用程序在没有我的新实体/数据模型的情况下运行。</p>

<p>从 Apple 文档中可以清楚地看出,Core Dara 支持添加实体进行轻量级迁移。</p>

<p>我知道这不是一个简单的过程,但我觉得我已经完美地遵循了一切。</p>

<p>如何在没有每次存档、在 TestFlight 上发布等情况下测试迁移...</p>

<p>如果您需要任何其他信息以便清楚地理解我的问题和/或写出更详细的答案,请随时在评论中提问,我将编辑我的问题。</p>

<p>提前谢谢你。</p>

<p><strong>编辑:</strong></p>

<p>这是来自 AppDelegate 的关于 NSPersistentStoreCoordinator 的代码。</p>

<pre><code>- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    // The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it.
    if (_persistentStoreCoordinator != nil) {
      return _persistentStoreCoordinator;
    }

    // Create the coordinator and store
    _persistentStoreCoordinator = [ initWithManagedObjectModel:];
    NSURL *storeURL = ;
    NSError *error = nil;
    NSString *failureReason = @&#34;There was an error creating or loading the application&#39;s saved data.&#34;;
    if (!) {
      // Report any error we got.
      NSMutableDictionary *dict = ;
      dict = @&#34;Failed to initialize the application&#39;s saved data&#34;;
      dict = failureReason;
      dict = error;
      error = ;
      // Replace this with code to handle the error appropriately.
      // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
      DDLogError(@&#34;Unresolved error %@, %@&#34;, error, );
      abort();
    }

    return _persistentStoreCoordinator;
}
</code></pre>

<p>我不知道如何通过测试或日志有效地知道 CoreData 使用了新的数据模型(版本 4)并已成功执行迁移。 </p>

<p>我知道当我从 xCode 构建时它可以工作,但它与来自 AppStore 的更新不同。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>要为轻量级迁移设置应用程序,您需要将以下行插入到声明 Persistent Store 的 CoreData 框架中。这些设置启用了支持轻量级迁移的选项(这些来自 Swift 3.0 应用,因此如果您使用的是 2.3,它们可能会有所不同):</p>

<pre><code>NSMigratePersistentStoresAutomaticallyOption as NSObject: true               
NSInferMappingModelAutomaticallyOption as NSObject: true
</code></pre>

<p>一旦这些行到位,CoreData 将在需要时正确执行轻量级迁移,包括添加新实体、属性和关系,因此只要您不执行任何需要更多操作的操作就可以了你的部分 - 比如更改实体或属性的名称。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 核心数据 - 轻量级迁移不起作用,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/41063213/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/41063213/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 核心数据 - 轻量级迁移不起作用