将现有的 Realm 数据库文件复制到 App Group 位置以进行今天的扩展
Copy existing Realm database file to App Group location for today extension
我的 iOS 应用正在使用 Realm 数据库
我想将当前 default.realm 数据库文件复制或移动到新目录(应用程序组位置),以便我可以与 Today Extension 小部件共享它。
我试过了 post 说 (How to transfer Realm database to appgroups)
核心代码是
let fileManager = FileManager.default
let originalPath = Realm.Configuration.defaultConfiguration.fileURL!
let appGroupURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.myApp")!.appendingPathComponent("default.realm")
do{
try fileManager.replaceItemAt(appGroupURL, withItemAt: originalPath)
}
catch{
print("Error information: \(error)")
}
然后我将此代码放在 didFinishLaunchingWithOptions 内的 Realm 迁移范围内,如下所示
为了让您更清楚地了解我在哪里使用此代码。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
var config = Realm.Configuration(
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
if (oldSchemaVersion < 1) {
let fileManager = FileManager.default
let originalPath = Realm.Configuration.defaultConfiguration.fileURL!
let appGroupURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.myApp")!.appendingPathComponent("default.realm")
do{
try fileManager.replaceItemAt(appGroupURL, withItemAt: originalPath)
}
catch{
print("Error information: \(error)")
}
}
}
)
}
当我尝试此操作时,我的控制台显示无法保存文件。
Error Domain=NSCocoaErrorDomain Code=512 "The file “default.realm” couldn’t be saved in the folder “2EEADCEE-F9D9-44A8-BDED-B60A689656A2”." UserInfo={NSFileOriginalItemLocationKey=file:///Users/jm/Library/Developer/CoreSimulator/Devices/38334AE3-6648-402E-AC18-8252426002D6/data/Containers/Shared/AppGroup/2EEADCEE-F9D9-44A8-BDED-B60A689656A2/default.realm, ......
我听说复制/移动 Realm 数据库文件应该在打开文件之前完成,这个错误与此有关吗?
感谢您的帮助,祝您愉快
感谢@Jay 的评论,帮助我找到了方法。
正如他提到的,移动 Realm DB 文件应该在我们调用与 Realm 相关的任何内容之前完成。
最初我在 Realm 迁移中有一个代码,因此当模式版本较旧时它只会 运行 一次,
但是我把它移到了 didFinishLaunchingWithOptions 的顶部所以现在它可以将 Realm DB 文件移动到不同的目录。
希望这对正在苦苦挣扎的人有所帮助。
let fileManager = FileManager.default
let originalPath = Realm.Configuration.defaultConfiguration.fileURL!
let appGroupURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.myApp")!.appendingPathComponent("default.realm")
if fileManager.fileExists(atPath: originalPath.absoluteString) {
do{
try fileManager.replaceItemAt(appGroupURL, withItemAt: originalPath)
print("Successfully replaced DB file")
}
catch{
print("Error info: \(error)")
}
} else {
print("File is not exist on original path")
}
var config = Realm.Configuration(
)
config.fileURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.myApp")!.appendingPathComponent("default.realm")
// Tell Realm to use this new configuration object for the default Realm
Realm.Configuration.defaultConfiguration = config
// Now that we've told Realm how to handle the schema change, opening the file
// will automatically perform the migration
let realm = try! Realm()
我的 iOS 应用正在使用 Realm 数据库 我想将当前 default.realm 数据库文件复制或移动到新目录(应用程序组位置),以便我可以与 Today Extension 小部件共享它。
我试过了 post 说 (How to transfer Realm database to appgroups)
核心代码是
let fileManager = FileManager.default
let originalPath = Realm.Configuration.defaultConfiguration.fileURL!
let appGroupURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.myApp")!.appendingPathComponent("default.realm")
do{
try fileManager.replaceItemAt(appGroupURL, withItemAt: originalPath)
}
catch{
print("Error information: \(error)")
}
然后我将此代码放在 didFinishLaunchingWithOptions 内的 Realm 迁移范围内,如下所示 为了让您更清楚地了解我在哪里使用此代码。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
var config = Realm.Configuration(
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
if (oldSchemaVersion < 1) {
let fileManager = FileManager.default
let originalPath = Realm.Configuration.defaultConfiguration.fileURL!
let appGroupURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.myApp")!.appendingPathComponent("default.realm")
do{
try fileManager.replaceItemAt(appGroupURL, withItemAt: originalPath)
}
catch{
print("Error information: \(error)")
}
}
}
)
}
当我尝试此操作时,我的控制台显示无法保存文件。
Error Domain=NSCocoaErrorDomain Code=512 "The file “default.realm” couldn’t be saved in the folder “2EEADCEE-F9D9-44A8-BDED-B60A689656A2”." UserInfo={NSFileOriginalItemLocationKey=file:///Users/jm/Library/Developer/CoreSimulator/Devices/38334AE3-6648-402E-AC18-8252426002D6/data/Containers/Shared/AppGroup/2EEADCEE-F9D9-44A8-BDED-B60A689656A2/default.realm, ......
我听说复制/移动 Realm 数据库文件应该在打开文件之前完成,这个错误与此有关吗?
感谢您的帮助,祝您愉快
感谢@Jay 的评论,帮助我找到了方法。
正如他提到的,移动 Realm DB 文件应该在我们调用与 Realm 相关的任何内容之前完成。
最初我在 Realm 迁移中有一个代码,因此当模式版本较旧时它只会 运行 一次,
但是我把它移到了 didFinishLaunchingWithOptions 的顶部所以现在它可以将 Realm DB 文件移动到不同的目录。
希望这对正在苦苦挣扎的人有所帮助。
let fileManager = FileManager.default
let originalPath = Realm.Configuration.defaultConfiguration.fileURL!
let appGroupURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.myApp")!.appendingPathComponent("default.realm")
if fileManager.fileExists(atPath: originalPath.absoluteString) {
do{
try fileManager.replaceItemAt(appGroupURL, withItemAt: originalPath)
print("Successfully replaced DB file")
}
catch{
print("Error info: \(error)")
}
} else {
print("File is not exist on original path")
}
var config = Realm.Configuration(
)
config.fileURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.myApp")!.appendingPathComponent("default.realm")
// Tell Realm to use this new configuration object for the default Realm
Realm.Configuration.defaultConfiguration = config
// Now that we've told Realm how to handle the schema change, opening the file
// will automatically perform the migration
let realm = try! Realm()