오늘 확장을 위해 기존 Realm 데이터베이스 파일을 앱 그룹 위치에 복사

May 06 2020

내 iOS 앱이 Realm 데이터베이스를 사용하고 있습니다. Today Extension 위젯과 공유 할 수 있도록 현재 default.realm 데이터베이스 파일을 새 디렉토리 (앱 그룹 위치)로 복사하거나 이동하고 싶습니다.

이 게시물이 말한대로 시도했습니다 ( Realm 데이터베이스를 앱 그룹으로 전송하는 방법 )

핵심 코드는

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)")
                }
            }
    }
    )
}


이 작업을 시도하면 콘솔에 파일을 저장할 수 없다는 메시지가 표시됩니다.

오류 도메인 = NSCocoaErrorDomain Code = 512 ""default.realm "파일을"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 데이터베이스 파일을 복사 / 이동해야한다고 들었는데,이 오류와 관련이 있습니까?

도와 주셔서 감사합니다. 좋은 하루 되세요

답변

2 JM_Developer May 16 2020 at 01:53

방법을 찾는 데 도움이 된 댓글에 대해 @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()