2017-01-27 3 views
1

Я хотел бы сделать резервную копию файл базы данных в области действия на диск ICloud, как WhatsApp, у меня есть несколько вопросов:резервного копирования Realm в ICloud Drive

  1. Что является лучшей практикой, чтобы сделать это?

  2. У меня есть база данных, находящаяся в общей папке группы, для доступа к ней из расширений, как я могу ее создать? Как я могу показать индикатор выполнения загрузки? Например, WhatsApp?

  3. Если я поместил файл царства в папку документа, он будет синхронизирован для каждого изменения.

  4. Есть ли образцы кода, которые мы можем видеть?

Спасибо за помощь, у вас есть идеи? ссылки?

ответ

2

Вы можете посмотреть this Github project на mikemac8888.

В основном вы делаете ваши объекты модели соответствуют RealmCloudObject:

class Note: Object, RealmCloudObject { 
    ... 
} 

Вы должны реализовать функцию отображения:

func toRecord() -> CKRecord { 
    ... 
    record["text"] = self.text 
    record["dateModified"] = self.dateModified 
} 

... и обратную функцию, используемую для создания Realm записей из CloudKit:

public func changeLocalRecord(...) throws { 
    ... 
    realm.create(objectClass as! Object.Type, 
     value: ["id": id, 
      "text": text, 
      "dateModified": NSDate(), 
      "ckSystemFields": recordToLocalData(record)], 
     update: true) 

    ... 
} 

Полная документация может читайте по ссылке, которую я предоставил, очевидно.

2

Чтобы уточнить, это вопрос о резервном копировании отдельного файла Realm непосредственно на iCloud Drive, чтобы он отображался в приложении iCloud Drive. Не синхронизировать содержимое файла с хранилищем CloudKit.

Если вы оставите файл Realm в каталоге Documents, то если пользователь выполнит резервное копирование iCloud или iTunes, файл будет скопирован. Все это означает, что если пользователь решает перейти на новое устройство и выполнить восстановление с использованием резервного образа старого устройства, тогда будет восстановлен файл Realm. Если пользователь удалит приложение с вашего старого устройства до этого, резервная копия iCloud также будет удалена.

Если вы хотите экспортировать свой файл Realm, чтобы его можно было сохранить и получить в iCloud Drive, вы можете экспортировать копию файла Realm в iCloud ubiquity container вашего приложения. Это в основном просто другая папка, такая как папка разделяемой группы, но она управляется iCloud. Эта папка ведет себя как Dropbox в том, что все, что вы вставляете, автоматически синхронизируется.

Код будет выглядеть примерно так:

let containerURL = FileManager.default.url(forUbiquityContainerIdentifier: nil) 
let realmArchiveURL = containerURL.appendPathComponent("MyArchivedRealm.realm") 

let realm = try! Realm() 
try! realm.writeCopy(toFile: realmArchiveURL) 

Это действительно простой пример. Документация Apple рекомендует делать это в фоновом потоке, так как настройка папки iCloud в первый раз может создать некоторое время.

Обновление не произойдет автоматически. Вам нужно будет экспортировать новую копию Королевства каждый раз, когда пользователь хочет выполнить резервное копирование.

+0

Хорошо, я делаю копию в контейнере ubiquity, но если пользователь удалит мое приложение и переустановит его ... Могу ли я показать список резервных копий, сохраненных на его iCloud Drive, и решить восстановить, или iCloud автоматически повторит синхронизацию эта папка не спрашивает пользователя никому? –

+0

Я лично сам не пробовал, поэтому не могу сказать точно, но да, я бы ожидал, что данные будут сохраняться в контейнере ubiquity, даже если приложение будет удалено на исходном устройстве. – TiM

Смежные вопросы