如何在RealmSwift中为对象生成id?

399 阅读1分钟

通过 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?()

        }

    }
 }