菜鸟教程小白 发表于 2022-12-12 23:46:58

ios - +metadataForPersistentStoreOfType 失败,NSSQLiteErrorDomain 14


                                            <p><p>我需要找到现有持久性存储中使用的模型版本,以便在自动轻量级迁移后进行一些后期处理。</p>

<p>我们的一些设备处于无法获取其持久性存储的元数据的状态。</p>

<p>当我们初始化 CoreData 堆栈时,我们使用 NSPersistentStoreCoordinator 的 +metadataForPersistentStoreOfType:URL:error: 方法来获取现有持久存储的元数据。然后我们检查它的元数据是否与当前对象模型中的元数据兼容,以决定是否需要进行迁移。我们还从这两组元数据中拉取模型版本——所以在自动轻量级迁移之后,我们可以根据模型版本做一些简单的后处理。</p>

<p>问题是 +metadataForPersistentStoreOfType:URL:error: 在某些设备上失败并返回 nil。该错误指示 NSSQLiteErrorDomain 14 和“数据库的 I/O 错误”。如果我打开 SQLite 调试(“-com.apple.CoreData.SQLDebug 1”),它不会产生太多有用的信息:</p>

<pre><code>CoreData: annotation: Connecting to sqlite database file at &#34;/var/mobile/Applications/65838AB8-2DE4-4B1E-9837-FD252104448B/Library/slide_deck_database_1/StoreContent/persistentStore&#34;
CoreData: sql: SELECT Z_VERSION, Z_UUID, Z_PLIST FROM Z_METADATA
CoreData: annotation: Disconnecting from sqlite database due to an error.
CoreData: error: (14) I/O error for database at /var/mobile/Applications/65838AB8-2DE4-4B1E-9837-FD252104448B/Library/slide_deck_database_1/StoreContent/persistentStore.SQLite error code:14, &#39;unable to open database file&#39;
CoreData: annotation: Disconnecting from sqlite database.
metadataForPersistentStoreOfType failed with error: The operation couldn’t be completed. (Cocoa error 256.) (userInfo: {
    NSSQLiteErrorDomain = 14;
    NSUnderlyingException = &#34;I/O error for database at /var/mobile/Applications/65838AB8-2DE4-4B1E-9837-FD252104448B/Library/slide_deck_database_1/StoreContent/persistentStore.SQLite error code:14, &#39;unable to open database file&#39;&#34;;
})
</code></pre>

<p>我确实在 Apple 的网站上找到了这篇文章,它暗示了问题的潜在<em>来源</em>:<a href="https://developer.apple.com/library/ios/qa/qa1809/_index.html" rel="noreferrer noopener nofollow">https://developer.apple.com/library/ios/qa/qa1809/_index.html</a>但这似乎对我的问题没有帮助。 (它描述了一种迁移持久存储和更改日志选项的方法......但它假设我已经有一个 NSPersistentStore 实例,但我没有。我可以通过 PSC 添加它......但这需要迁移它,这违背了整个目的 - 再次,因为我试图在迁移之前找到现有商店的版本。)</p>

<p>这里的一个潜在复杂情况是,我正试图从 UIManagedDocument 存储切换到传统的 CoreData 堆栈(我们正在放弃 UIManagedDocument,因为一连串的问题永无止境,我们更了解标准 CoreData 堆栈) .在实践中,这似乎不是问题(直到现在?),但我认为这可能值得一提。</p>

<p>编辑:这是在运行 iOS 7.1.1 的 iPad(第三代)上。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>如果您认为 WAL 与回滚是您的问题,请执行以下操作:</p>

<ol>
<li>使用技术问答 1809 中概述的回滚选项将商店添加到 NSPersistentStoreCoordinator。如果由于其他原因无法这样做,您将得到 NO 作为 <code>addPersistentStoreWithType:configuration:URL:options 的结果</code> 和一个填充错误。</li>
<li>要读取元数据,请使用 <code>persistentStoreForURL:</code> 从持久存储协调器中获取刚刚实例化的持久存储。</li>
<li>此时您可以读取商店的元数据。</li>
</ol>

<p>例子:</p>

<pre><code>NSPersistentStore *store   = nil;
NSError         *error   = nil;
NSDictionary      *options = @{NSSQLitePragmasOption:@{@&#34;journal_mode&#34;:@&#34;DELETE&#34;}};
if (! [persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                        configuration:nil
                                        URL:
                                        options:options
                                        error:&amp;error]) {
    ;
}

store = ];
// read something out of the metadata.
id metaDataValue = [ valueForKey: NSStoreUUIDKey];
</code></pre>

<p>您不需要迁移它。您甚至不需要保留那个持久存储协调器。您可以在读取完元数据值后立即将其丢弃。</p>

<p>再次,这有点假设您的问题是 QA1809 中描述的 WAL 与回滚 SQLite 存储。鉴于您看到的错误可能是原因。例如,存储可能先前已被错误的写入操作损坏。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - &#43;metadataForPersistentStoreOfType 失败,NSSQLiteErrorDomain 14,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/24688010/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/24688010/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - &#43;metadataForPersistentStoreOfType 失败,NSSQLiteErrorDomain 14