首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在iPhone上恢复应用程序数据库时如何备份应用程序数据库

在iPhone上恢复应用程序数据库时如何备份应用程序数据库
EN

Stack Overflow用户
提问于 2011-08-13 01:08:11
回答 1查看 890关注 0票数 2

app数据库备份怎么做?

在其他有SD卡的手机上,备份app数据库不是问题,因为我可以将app数据库备份到SD卡。我也可以将备份以zip的形式发送到电子邮件。恢复也不是一个问题,因为电子邮件可以保存压缩到SD卡使用我仍然在SD卡上的文件。

iPhone似乎是另一回事。我可以复制数据库的用户部分,并将其存储在应用程序所在的同一个documents文件夹中。我也可以把这个文件的压缩文件发邮件给你,以防手机没电。

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

对于应用程序中的数据库备份,你们都做些什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-13 02:40:09

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

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

代码语言:javascript
运行
复制
<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类型。

代码语言:javascript
运行
复制
<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。在你的应用代理中,你可以实现-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url方法。

代码语言:javascript
运行
复制
- (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库,那么它会让事情变得简单得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7043746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档