如何解决设备的 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!
我正在尝试将我的数据保存在真实设备中,并使用了以下领域管理器。我的问题很有趣,我什至不知道在我的真实设备上保存数据有什么问题。 每个模拟器都可以正常工作,我可以保存。但它不适用于真实设备。
其次,当我转到 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!