如何解决设备的 Realm 问题

How can I fix my Realm problem for device

我正在尝试将我的数据保存在真实设备中,并使用了以下领域管理器。我的问题很有趣,我什至不知道在我的真实设备上保存数据有什么问题。 每个模拟器都可以正常工作,我可以保存。但它不适用于真实设备。

其次,当我转到 fileURL 路径时找不到领域数据库文件,它是空的。 (文档文件)

(lldb) po Realm.Configuration.defaultConfiguration.fileURL

有人可以帮我吗?完整项目是here,如果你愿意,你可以自己尝试。非常感谢。

import Foundation
import RealmSwift

protocol RealmFactoryProtocol {
    func makeRealm() throws -> Realm
}

final class RealmFactory: RealmFactoryProtocol {
    private let fileManager: FileManagerProtocol
    private let currentSchemaVersion: UInt64 = 1
    private let appID = "com.karinyfreitas.SimpleMarket"

    init(fileManager: FileManagerProtocol = FileManager.default) {
        self.fileManager = fileManager
    }

    private var sharedRealmConfiguration: Realm.Configuration? {
        guard let containerURL = fileManager.containerURL(forSecurityApplicationGroupIdentifier: appID) else {
            return nil
        }

        let configurationURL = containerURL.appendingPathComponent("db.realm", isDirectory: true)

        return Realm.Configuration(
            fileURL: configurationURL,
            schemaVersion: currentSchemaVersion,
            migrationBlock: { _, _ in },
            shouldCompactOnLaunch: { totalBytes, usedBytes in
                // Realm compacting approach from https://realm.io/docs/swift/latest/#compacting-realms
                let oneHundredMB = 100 * 1024 * 1024
                return (totalBytes > oneHundredMB) && (Double(usedBytes) / Double(totalBytes)) < 0.5
            }
        )
    }

    func makeRealm() throws -> Realm {
        guard let configuration = sharedRealmConfiguration else {
            throw RealmFactoryError.unableToMakeConfiguration
        }
        return try Realm(configuration: configuration)
    }
}

enum RealmFactoryError: Error {
    case unableToMakeConfiguration
}

所有 Realm 代码都是正确的,所以我认为您创建新 Realm 对象的方式没有任何问题。

但是,我认为您对 containerURL(forSecurityApplicationGroupIdentifier:) 的工作原理有点困惑。

在此示例中,您向 API 提供应用程序的捆绑包标识符,但这实际上不是它所期望的。它需要一个“组标识符”,它指定应用程序及其扩展之间的共享目录的名称,您在应用程序的功能设置中的“应用程序组”下定义(更多信息在 Apple's developer site 上)。

查看源代码,您似乎已经设置了一个名为 group.simplemarket.

的应用组

所以如果你改变

private let appID = "com.karinyfreitas.SimpleMarket"

private let appID = "group.simplemarket"

应该 解决您所有的问题。欢迎来到 Stack Overflow!