阅读this教程后,我需要一些帮助来了解最有效的方法。
当我的应用程序打开时,它需要加载Profile
对象。由于在应用程序的生命周期中应该只有其中一个,我将其设置为单身。
Realm似乎是保存和检索数据的好方法。进一步查看后,似乎我需要有一个数据模型才能使用Realms。在尝试将Object
集成到下面显示的Profile.swift失败后,我需要一些帮助来解决这个问题。我应该创建可以由ProfileDataModel
调用以检索和保存更改的第二个类Profile
,还是可以将域Object
包含到Singleton类中?
Profile.swift
class Profile {
//MARK: Singleton
static let sharedInstance = Profile()
//MARK: Properties
var characterName: String
var level: Int
//MARK: Init
private init() {
//TODO: Load from realms
self.characterName = "John Appleseed"
self.level = 50
}
//MARK: Helper Methods
static func save(){
//TODO: Save to Realm
}
}
答案 0 :(得分:9)
我建议您创建一个db manager类来处理它上面的所有数据库操作,然后您可以单独创建数据模型并使用您的manager类来获取/存储数据库上的数据。
class DBManager {
//MARK: Singleton
static let sharedInstance = DBManager()
//MARK: Init
private override init(){
let config = Realm.Configuration(
fileURL: dbPath,
readOnly: false)
do{
myDB = try Realm(configuration: config)
print(dbPath)
}
catch{
print("boooom")
}
}
//retrive data from db
func getDataFromDB() -> Results<DataModel>{
let results: Results<NewsModel> = myDB.objects(DataModel)
return results
}
//write an object in db
func addDataModelEntry(object: DataModel){
try! myDB.write{
myDB.add(object, update: true)
}
}
}
//your controller you want to use your db manager class
class main(){
func viewDidLoad(){
DBManager.sharedInstance.getDataFromDB() ///here you have realm results
DBManager.sharedInstance.addDataModelEntry(customDataModel) //to store your object on db
}
}
我只是为了说明这样做而设置了一些示例,您可以使用这些函数扩展到任何类型的数据库操作,以满足您的特定需求。
答案 1 :(得分:3)
正如您已经建议的那样,在Realm托管对象上实现Singleton模式不是一个好主意。它们绑定到一个线程,只能从写入事务中修改。
相反,如果您需要共享可变全局状态并希望在Realm中保留它,我建议您使用一个允许您检索对象的类,这些对象仅用于描述持久化数据。例如。一个DatabaseManager
作为单例,它实例化一个新的Realm并返回单个现有的Profile
对象,继承自Object
但没有自定义static
属性或方法。