Luc*_*tti 6 objective-c realm ios swift
我想将一个领域数据库文件备份到一个iCloud驱动器,比如WhatsApp,我有一些问题:
这样做的最佳做法是什么?
我有一个位于共享组文件夹中的数据库,可以从扩展程序访问它,我该如何备份它?如何显示上传的进度条?像WhatsApp一样?
如果我将一个领域文件放在一个文档文件夹中,它将为每个修改同步.
我们可以看到一些示例代码吗?
谢谢你的帮助,有什么想法吗?链接?
只是为了澄清,这是一个关于将离散Realm文件本身备份到iCloud Drive的问题,以便它可以在iCloud Drive应用程序中看到.不将文件内容同步到CloudKit存储.
如果将Realm文件保留在Documents目录中,则如果用户执行iCloud或iTunes备份,则将备份该文件.所有这些意味着,如果用户决定升级到新设备并使用旧设备的备份映像执行还原,则将恢复Realm文件.如果用户在此之前从旧设备中删除了应用程序,则iCloud备份也将被删除.
如果要导出Realm文件以便可以在iCloud Drive中永久保存和访问,您可以将Realm文件的副本导出到应用程序的iCloud ubiquity容器中.这基本上只是另一个文件夹,如共享组的文件夹,但它由iCloud管理.此文件夹的行为类似于Dropbox,因为您放入的任何内容都会自动同步.
代码看起来像这样:
let containerURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)
let realmArchiveURL = containerURL.appendPathComponent("MyArchivedRealm.realm")
let realm = try! Realm()
try! realm.writeCopy(toFile: realmArchiveURL)
Run Code Online (Sandbox Code Playgroud)
这是一个非常基本的例子.Apple文档建议您在后台线程上执行此操作,因为首次设置iCloud文件夹可能会创建一些时间.
更新此操作不会自动进行.每次用户想要执行备份时,您都需要导出Realm的新副本.
我最近有相同的要求,我能够从以下步骤实现
斯威夫特:4+
第1步
1.Setup Your cloudKit for your app with a Developer account
2. You can take reference: https://www.raywenderlich.com/1000-cloudkit-tutorial-getting-started
Run Code Online (Sandbox Code Playgroud)
第2步
- Add CloudKit Capabilities in your App
- Please check out the screenshot: https://prnt.sc/pdpda5
Run Code Online (Sandbox Code Playgroud)
第 3 步 - 检查您 iphone 的启用云选项
// Return true if iCloud is enabled
func isCloudEnabled() -> Bool {
if DocumentsDirectory.iCloudDocumentsURL != nil { return true }
else { return false }
}
Run Code Online (Sandbox Code Playgroud)
第 4 步 - 为本地或 iCloud 文档目录设置以下变量
struct DocumentsDirectory {
static let localDocumentsURL = FileManager.default.urls(for: FileManager.SearchPathDirectory.documentDirectory, in: .userDomainMask).last!
static let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")
}
Run Code Online (Sandbox Code Playgroud)
步骤:5 下面的函数用于 copyRealmFileToIcloudContainer
func uploadDatabaseToCloudDrive()
{
if(isCloudEnabled() == false)
{
self.iCloudSetupNotAvailable()
return
}
let fileManager = FileManager.default
self.checkForExistingDir()
let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents", isDirectory: true)
let iCloudDocumentToCheckURL = iCloudDocumentsURL?.appendingPathComponent("\(memberId)_default.realm", isDirectory: false)
let realmArchiveURL = iCloudDocumentToCheckURL//containerURL?.appendingPathComponent("MyArchivedRealm.realm")
if(fileManager.fileExists(atPath: realmArchiveURL?.path ?? ""))
{
do
{
try fileManager.removeItem(at: realmArchiveURL!)
print("REPLACE")
let realm = try! Realm()
try! realm.writeCopy(toFile: realmArchiveURL!)
}catch
{
print("ERR")
}
}
else
{
print("Need to store ")
let realm = try! Realm()
try! realm.writeCopy(toFile: realmArchiveURL!)
}
}
Run Code Online (Sandbox Code Playgroud)
步骤:6
- Once your realm file uploaded on the server , you can check this in your iPhone
- Steps
- 1.Go To Setting
- 2.Go To iCloud
- 3.Go To ManageStorage
- 4.You will see your application there
- 5.Tap on Application, you will able to see your realm file over there
Run Code Online (Sandbox Code Playgroud)
步骤:7 - 确保您在 info.plist 中添加了以下几行
<key>NSUbiquitousContainers</key>
<dict>
<key>iCloud.com.example.app</key>
<dict>
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
<true/>
<key>NSUbiquitousContainerName</key>
<string>iCloudDemoApp</string>
<key>NSUbiquitousContainerSupportedFolderLevels</key>
<string>Any</string>
</dict>
</dict>
Run Code Online (Sandbox Code Playgroud)
你可以看看这个Github 项目。mikemac8888
基本上,您使模型对象符合RealmCloudObject:
class Note: Object, RealmCloudObject {
...
}
Run Code Online (Sandbox Code Playgroud)
你必须实现一个映射函数:
func toRecord() -> CKRecord {
...
record["text"] = self.text
record["dateModified"] = self.dateModified
}
Run Code Online (Sandbox Code Playgroud)
...以及用于从 CloudKit 记录创建 Realm 记录的反向函数:
public func changeLocalRecord(...) throws {
...
realm.create(objectClass as! Object.Type,
value: ["id": id,
"text": text,
"dateModified": NSDate(),
"ckSystemFields": recordToLocalData(record)],
update: true)
...
}
Run Code Online (Sandbox Code Playgroud)
显然,可以在我提供的链接中阅读完整的文档。
| 归档时间: |
|
| 查看次数: |
4001 次 |
| 最近记录: |