app数据库备份怎么做?
在其他有SD卡的手机上,备份app数据库不是问题,因为我可以将app数据库备份到SD卡。我也可以将备份以zip的形式发送到电子邮件。恢复也不是一个问题,因为电子邮件可以保存压缩到SD卡使用我仍然在SD卡上的文件。
iPhone似乎是另一回事。我可以复制数据库的用户部分,并将其存储在应用程序所在的同一个documents文件夹中。我也可以把这个文件的压缩文件发邮件给你,以防手机没电。
但是,如何将电子邮件附件中的下载内容保存到app文档文件夹?所以,如果用户将他们的数据库上传到他们的电子邮件,然后想要恢复它,你会怎么做呢?
对于应用程序中的数据库备份,你们都做些什么?
发布于 2011-08-13 02:40:09
如果要保存电子邮件中的文档,可以执行以下操作:
首先,通过将备份文件添加到名为CFBundleDocumentTypes的新密钥中,修改Info.plist文件以注册以处理备份文件的特定扩展名。
<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。在你的应用代理中,你可以实现-(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库,那么它会让事情变得简单得多。
https://stackoverflow.com/questions/7043746
复制相似问题