如何 - 备份应用程序数据库以在iPhone上恢复它

时间:2011-08-12 17:08:11

标签: iphone database

您如何处理应用数据库备份?

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

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

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

您对应用中的数据库备份做了什么?

1 个答案:

答案 0 :(得分:1)

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

首先,修改Info.plist文件以注册以处理备份文件的特定扩展,方法是将其添加到名为CFBundleDocumentTypes的新密钥中。

<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。在你的app委托中,你可以实现 - (BOOL)应用程序:(UIApplication *)应用程序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文件,否则您最终可能无法打开数据库。

我所做的是将SQLite数据存储用于CoreData,或者单独使用SQLite。短暂锁定文件,创建数据库文件的副本,并通过PUT / POST将其上传到我的服务器。然后,服务器使用时间戳将文件存储在CouchDB中。这可能是一个穷人的版本控制系统,你可以随时回滚,因为数据库被用户的id或用户的UDID标记,或者两者都用时间戳标记。

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

不幸的是,我认为没有一种简单的机制,你描述的电子邮件机制可能是最简单的,但是使用CoreData,它甚至会变得复杂。如果您使用的是原始SQLite3和FMDB库,那么事情会变得更加容易。