通过 Realm Swift 进行本地存储对象,但对象没有ID且我们又需要记录一个唯一值,那么就需要让Model来实现一个自增的ID。
Model类代码
import RealmSwift
class PenInfoModel: Object {
///主键为内容id
@objc dynamic var wId = 1
///内容时间
@objc dynamic var time = ""
///内容标题
@objc dynamic var title = ""
///内容详情
@objc dynamic var details = ""
override static func primaryKey() -> String? {
return "wId"
}
func creatID() -> Int {
let realm = try! Realm()
return (realm.objects(IHJPenInfoModel.self).max(ofProperty: "wId") as Int? ?? 0) + 1
}
}
存储代码
let model = PenInfoModel()
model.title = "Hello world"
model.details = "学习特效的基本要求1.要好好学习 2.要看ppt"
model.time = infoTimeStr
model.wId = model.creatID()
RealmManager.shared.addModel(model: model)
RealmManager代码
import UIKit
import RealmSwift
class RealmManager: NSObject {
static let shared = RealmManager()
fileprivate override init() {}
//线程可能会变,此处使用计算属性可以随时更改realm所处线程
var realm: Realm{
return try! Realm()
}
func addModel <T> (model: T){
do {
try realm.write {
realm.add(model as! Object)
}
} catch {}
}
func queryModel <T> (model: T.Type, filter: String? = nil) -> [T]{
var results : Results<Object>
if filter != nil {
results = realm.objects((model as! Object.Type).self).filter(filter!)
}
else {
results = realm.objects((model as! Object.Type).self)
}
guard !results.isEmpty else { return [] }
var modelArray = [T]()
for model in results{
modelArray.append(model as! T)
}
return modelArray
}
func deleteModel <T> (model: T){
do {
try realm.write {
realm.delete(model as! Object)
}
} catch {}
}
///删除某张表
func deleteModelList <T> (model: T){
do {
try realm.write {
realm.delete(realm.objects((model as! Object.Type).self))
}
}catch {}
}
///调用此方法的模型必须具有主键
func updateModel <T> (model: T){
do {
try realm.write {
realm.add(model as! Object, update: Realm.UpdatePolicy.all)
}
}catch{}
}
//数据库迁移,schemaVersion+1
func configRealmDB(){
let schemaVersion: UInt64 = 19
let config = Realm.Configuration(
schemaVersion: schemaVersion,
migrationBlock: { migration, oldSchemaVersion in
if (oldSchemaVersion < schemaVersion) {}
})
Realm.Configuration.defaultConfiguration = config
}
//数据库对象属性修改错误:invocation function for block in objc_object* (anonymous namespace)::makeSetter<NSString* __strong, NSString* __strong>(RLMProperty*)
//参考:https://stackoverflow.com/questions/54778441/realm-reason-attempting-to-modify-object-outside-of-a-write-transaction-call
func trySetValue(_ setCallBack: (() -> Void)?) {
do {
try realm.write {
setCallBack?()
}
} catch {
setCallBack?()
}
}
}