iOS RealmSwift не будет обновлять модели после изменения пути базы данных по умолчанию к пути группы - PullRequest
0 голосов
/ 31 августа 2018

Я давно использую область в своем приложении. Теперь я добавил Share Extension в приложение и заметил, что мне нужно определить путь к файлу по умолчанию для области в подкаталоге группы, чтобы я мог получить доступ к одной и той же базе данных как из App, так и из Extension. Я искал несколько раз и нашел лучшее решение в здесь и с помощью здесь .

Вот мой файл AppDelegate

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    // migrateRealm()
    // configRealm()

    return true
}

private func configRealm() {

    let fileURL = FileManager.default
        .containerURL(forSecurityApplicationGroupIdentifier: "group.com.hjri.khandehland")!
        .appendingPathComponent("Library/Caches/default.realm")

    let config = Realm.Configuration(fileURL: fileURL)

    Realm.Configuration.defaultConfiguration = config
}

private func migrateRealm() {
    let fileManager = FileManager.default

    let originalDefaultRealmURL = Realm.Configuration.defaultConfiguration.fileURL
    //Cache original realm path (documents directory)
    let originalDefaultRealmPath = originalDefaultRealmURL?.path

    //Generate new realm path based on app group
    let realmURL = FileManager.default
        .containerURL(forSecurityApplicationGroupIdentifier: "group.com.hjri.khandehland")!
        .appendingPathComponent("Library/Caches/default.realm")

    let realmPath = realmURL.path

    if originalDefaultRealmPath != nil {
        //Moves the realm to the new location if it hasn't been done previously
        if (fileManager.fileExists(atPath: originalDefaultRealmPath!) && !fileManager.fileExists(atPath: realmPath)) {

            print("***** FILE EXISTS AND MOVING")
            do {
                try fileManager.moveItem(atPath: originalDefaultRealmPath!, toPath: realmPath)
            } catch {
                print("***** REALM FILE PATH MIGRATION ERROR *****")
            }
        } else {
            print ("***** FILE DOES NOT EXIST *****")
        }
    }

    //Set the realm path to the new directory

    Realm.Configuration.defaultConfiguration.fileURL = realmURL
}

Кроме того, мои классы моделей

class User: Object {
    @objc dynamic var username: String = ""
    @objc dynamic var email: String = ""
    @objc dynamic var password: String = ""
    @objc dynamic var accessToken: String = ""
    @objc dynamic var refreshToken: String = ""
}
class Message: Object {
    @objc dynamic var id: Int = 0
    @objc dynamic var content: String = ""
    @objc dynamic var submitDate: String = ""
    @objc dynamic var submitDateEpoch: Double = 0
    @objc dynamic var favoriteCount:Int = 0
    @objc dynamic var isFavorite: Bool = false
    @objc dynamic var needsSync: Bool = false
    @objc dynamic var syncDetails: String = ""
    @objc dynamic var isNew: Bool = true
}

Для тестирования моего приложения сначала я работаю с моделями, использующими путь к файлу области по умолчанию, а затем раскомментирую один из методов migrateRealm() или configRealm(), который ни один из них не будет работать правильно, после раскомментирования первого я может войти в систему (создать пользовательский экземпляр), и после перезапуска приложения оно правильно считывает данные пользователя, но сообщения вообще не отображаются в приложении, что означает, что при чтении / записи их возникает проблема при комментировании configRealm, который следует просто изменить путь к области и не переносить старые данные, приложение по-прежнему показывает мне старые сообщения, но не загружает пользователя, что означает, что мое состояние входа в систему исчезло после перезапуска, а также если я обновлю сообщение свойство, которое заставляет область изменять свойство модели сообщения, оно выдает эту ошибку, и приложение вылетает:

* Завершение работы приложения из-за необработанного исключения «RLMException», причина: 'Попытка изменить объект вне транзакции записи - вызов Сначала beginWriteTransaction для экземпляра RLMRealm. ' * Первый вызов стека вызовов

Эта ошибка говорит о том, что я выполняю операцию обновления за пределами закрытия записи области, но мой код отлично работал до изменения пути, а также я пишу команды обновления внутри блока записи, как вы можете видеть здесь, это мой метод обновления сообщений

func update(content: String? = nil, isFavorite: Bool? = nil, needsSync: Bool? = nil, syncDetails: String? = nil, favoriteCount: Int? = nil) {
    let realm = try! Realm()
    try! realm.write {
        self.content = content ?? self.content
        self.isFavorite = isFavorite ?? self.isFavorite
        self.needsSync = needsSync ?? self.needsSync
        self.syncDetails = syncDetails ?? self.syncDetails
        self.favoriteCount = favoriteCount ?? self.favoriteCount
    }
}

Я не знаю, сделал ли я ошибку или это проблема с областью или проблема с XCode (я использую бета-версию) Очень запутался в этот момент

Я использую Realm 3.7.5 XCode 10 Beta

1 Ответ

0 голосов
/ 02 сентября 2018

Я заставил его работать, устанавливая свою пользовательскую конфигурацию для экземпляра Realm при каждом вызове, я упростил создание этого вычисляемого свойства и вызывал его всякий раз, когда мне хотелось использовать Realm

static var realmInstance: Realm {

    let fileURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: groupIdentifier)!.appendingPathComponent(databaseFileName)

    var config = Realm.Configuration(fileURL: fileURL)

    return try! Realm(configuration: config)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...