我有一个带有本地/离线Realm文件/数据库的应用程序。我想添加登录以跨设备同步数据的选项,我认为Realm Object Server对此非常有用。我知道当用户登录时,我需要编写从本地域迁移到同步域的迁移。如果用户决定退出,我该怎么办?如果用户从未首先登录,我该怎么办?我是否需要在我的代码中(两个地方)有两个路径来选择它是应该使用本地还是同步域?
答案 0 :(得分:0)
我使用RealmProvider
类来获取领域实例。
class RealmProvider {
class func realm() -> Realm {
if let _ = NSClassFromString("XCTest") {
return try! Realm(configuration: Realm.Configuration(fileURL: nil, inMemoryIdentifier: "test", syncConfiguration: nil, encryptionKey: nil, readOnly: false, schemaVersion: 0, migrationBlock: nil, deleteRealmIfMigrationNeeded: true, objectTypes: nil))
} else {
let user = getUser()
guard let loggedInUser = user else {
do {
return try Realm()
} catch {
print(error)
}
return try! Realm()
}
// open up synced url to the username.
if let user = SyncUser.current {
let syncServerURL = URL(string: "realm://realm.myapp.com/~/\(loggedInUser.username.md5())")!
let config = Realm.Configuration(syncConfiguration: SyncConfiguration(user: user, realmURL: syncServerURL))
// Open the remote Realm
return try! Realm(configuration: config)
} else {
// login first.
let serverURL = URL(string: "http://realm.myapp.com")!
let token = getToken()
let customCredentials = SyncCredentials(customToken: token, provider: Provider("custom/myAuth"))
//
SyncUser.logIn(with: customCredentials,
server: serverURL) { user, _ in
if let user = user {
// can now open a synchronized Realm with this user
// Open Realm
let configuration = Realm.Configuration(
syncConfiguration: SyncConfiguration(user: user, realmURL: URL(string: "realm://realm.myapp.com/~/\(loggedInUser.username.md5())")!)
)
_ = try! Realm(configuration: configuration)
}
}
}
return try! Realm()
}
}
}
要回答你的问题,
如果用户决定退出,该怎么办?
RealmProvider将为您提供本地领域文件。
如果用户从未首先登录,该怎么办? 数据仍将存储在本地域文件中,一旦用户登录,您就可以打开同步域并运行迁移。
PS:有一个问题,如果第一次打开同步域,它仍将返回本地域文件。 :/