菜鸟教程小白 发表于 2022-12-13 06:01:58

ios - 如果 sqlite DB 未关闭,是否有可能丢失数据?


                                            <p><p>如果 SQLite DB 在 iOS/iPhone 中未正确关闭,是否会丢失数据?</p>

<p>我正在考虑在 <code>applicationWillTerminate</code> 中关闭数据库,但首先要确保这不会产生任何令人讨厌的副作用。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>在大多数情况下,没有; sqlite3 在返回之前将所有内容写入“磁盘”(并酌情调用 fflush/fsync/etc)。</p>

<p>有一个很大的异常(exception):如果关闭数据库时有未提交的事务,下次打开时会回滚。</p>

<p>究竟会发生什么取决于<a href="http://www.sqlite.org/pragma.html#pragma_journal_mode" rel="noreferrer noopener nofollow">PRAGMA journal_mode</a> :如果它是“内存”或“关闭”,如果您的应用程序在写入期间崩溃,则数据库可能已损坏。我<em>认为</em> <a href="http://www.sqlite.org/pragma.html#pragma_locking_mode" rel="noreferrer noopener nofollow">PRAGMA locking_mode</a>只影响释放锁时发生的情况,而不影响事务完整性。</p>

<p><strong>请注意,-applicationWillTerminate: 无论如何是不够的!</strong> 如果您没有设置 UIApplicationExitsOnSuspend,则在 iOS 4 和足够新的设备(即比 iPhone 3G/iPod 2g 更新)上的默认行为是发送 -applicationWillEnterBackground: 然后挂起您的应用程序(显然使用 SIGSTOP)。如果操作系统稍后决定您的应用程序需要退出,它会发送 SIGKILL 而不给您的应用程序更多的 CPU 时间。您需要在 <em>both</em> <code>-applicationWillTerminate:</code> 和 <code>-applicationWillEnterBackground:</code> 中保存状态;主要区别在于后者可以启动后台任务。</p>

<p>(另一个区别是您可能会在 -applicationWillTerminate 中进行一些“清理”:当您刚刚移动到后台时不应该发生这种情况,即使在您的应用程序即将退出时释放内存在很大程度上是一种浪费CPU 时间。)</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如果 sqlite DB 未关闭,是否有可能丢失数据?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/4238866/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/4238866/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如果 sqlite DB 未关闭,是否有可能丢失数据?