iphone - 如何 - 在 iPhone 上恢复应用程序数据库的位置

标签 iphone database

您如何备份应用程序数据库?

在其他有 SD 卡的手机上,应用程序数据库的备份不是问题,因为我可以将应用程序数据库备份到 SD 卡。我还可以将该备份以 zip 格式发送到电子邮件。恢复也不是问题,因为电子邮件可以使用我仍在 SD 卡上的文件将 zip 保存到 SD 卡。

iPhone 似乎是另一个故事。我可以复制数据库的用户部分,并将其存储在应用程序所在的同一文档文件夹中。我还可以通过电子邮件发送该文件的压缩包,以防手机死机。

但是我如何将电子邮件附件中的下载内容保存到应用程序文档文件夹中?因此,如果用户将他们的数据库上传到他们的电子邮件,然后想要恢复它,您会怎么做?

你们都为应用程序的数据库备份做些什么?

最佳答案

如果您想从电子邮件中保存文档,您可以执行以下操作:

首先,修改您的 Info.plist 文件以通过将其添加到名为 CFBundleDocumentTypes 的新 key 来注册以处理备份文件的特定扩展名。

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>MyApplication</string>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>LSHandlerRank</key>
        <string>Owner</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>com.myapplication.myapplicationsuffix.fileextension</string>
        </array>
    </dict>
</array>

接下来要设置的是应用程序的捆绑 URL 类型。

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>com.myapplication.myapplicationsuffix.myoperationkey</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>packageforlaunch</string>
        </array>
    </dict>
</array>

这样,当用户启动文件(在电子邮件中点击它)时,它将启动您的应用程序并为其提供文件系统 URI。在您的应用委托(delegate)中,您可以实现 -(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 方法。

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
     if(url != nil && [url isFileURL])
    {
        NSData *d = [NSData dataWithContentsOfURL:url];
        [[NSFileManager defaultManager] createFileAtPath:[[self applicationDocumentsDirectory] stringByAppendingPathComponent:[url lastPathComponent]] contents:d attributes:nil];
}

这将为您提供文件,您可以将其保存到您的应用程序中。这里的关键是不要将数据库存储在应用程序包中,而是存储在应用程序的用户文件夹中的某个地方。这样你就可以很容易地从应用程序启动中替换它(只要你有适当的锁定)。使用 CoreData,您必须注意您没有更改架构,或者您正在为数据库版本加载正确的 .xcdatamodeld 文件,否则您最终可能会得到一个无法打开的数据库。

我所做的是对 CoreData 使用 SQLite 数据存储,或者单独使用 SQLite。暂时锁定文件,创建数据库文件的副本,然后通过 API 通过 PUT/POST 将其上传到我的服务器。然后服务器将文件与时间戳一起存储在 CouchDB 中。这具有成为穷人的版本控制系统的效果,您始终可以回滚,因为数据库标记有用户 ID 或用户的 UDID,或两者都带有时间戳。

更简单的方法可能是结合使用 Apple 的数据库新文档存储和带有指向表示备份的文档 ID 的指针的键/值存储。

不幸的是,我不认为有一个简单的机制,您描述的电子邮件机制可能是最简单的,但是对于 CoreData,它甚至变得如此复杂。如果您使用的是原始 SQLite3 和 FMDB 库,它会让事情变得容易得多。

关于iphone - 如何 - 在 iPhone 上恢复应用程序数据库的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7043746/

相关文章:

ios - 反射(reflect)绘制后UIView的变化

iphone - 在 iOS Simulator 4 和 3.5 英寸中加载新闻

iPhone UIImageView 数组

mysql - 从表中检索二级友谊并排除一级 friend

iphone - 发布到iTunes的iOS存档与项目不同

ios - Swift:我无法将 Firebase FIRAuth 函数中的变量传回父函数中声明的变量

sql - 选择哪个数据库来记录用户事件

sql - 约束一对多关系或使用预定义的关系约束创建表

android - 如何在 Android 应用程序升级后更新表架构?

php - Codeigniter 无法连接到外部 SQL Server