iOS swift realm 最新使用教程

第一步導(dǎo)入第三方庫

?不知道為什么導(dǎo)入最新的第三方庫,會存在找不到realm的情況,這里我們就直接導(dǎo)入特定版本的
pod 'RealmSwift', '3.13.1'

?一般如果不設(shè)置存儲的數(shù)據(jù)庫地址的話,會自動存儲到沙盒文件的document下,在這里我們自己創(chuàng)建并指定地址.

/// 配置數(shù)據(jù)庫

func configRealm() {

    /// 如果要存儲的數(shù)據(jù)模型屬性發(fā)生變化,需要配置當(dāng)前版本號比之前大
    let dbVersion : UInt64 = 2
    let docPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0] as String
    let dbPath = docPath.appending("/defaultDB.realm")
    let config = Realm.Configuration(fileURL: URL.init(string: dbPath), inMemoryIdentifier: nil, syncConfiguration: nil, encryptionKey: nil, readOnly: false, schemaVersion: dbVersion, migrationBlock: { (migration, oldSchemaVersion) in
        
    }, deleteRealmIfMigrationNeeded: false, shouldCompactOnLaunch: nil, objectTypes: nil)
    
    Realm.Configuration.defaultConfiguration = config
    Realm.asyncOpen { (realm, error) in
        if let _ = realm {
            print("Realm 服務(wù)器配置成功!")
       
        }else if let error = error {
            print("Realm 數(shù)據(jù)庫配置失敗:\(error.localizedDescription)")
        }
    }
}

初始化對象

class User: Object {

///可以存儲的類型有很多
@objc dynamic var phone = ""
@objc dynamic var name = ""
@objc dynamic var header: Data = Data()
@objc dynamic var password = ""
@objc dynamic var isLogin = false

///User里包含另外一個對象數(shù)組
let gameList = List<Game>()
///設(shè)置了關(guān)鍵字,那么就不能創(chuàng)建重復(fù)的User對象 phone 值相同
///如果相同會直接崩潰
override static func primaryKey() -> String? {
    return "phone"
}

///獲取realm地址
class func getDB() -> Realm {
    let docPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0] as String
    let dbPath = docPath.appending("/defaultDB.realm")
    print(docPath.appending("/defaultDB.realm"))
    /// 傳入路徑會自動創(chuàng)建數(shù)據(jù)庫
    let defaultRealm = try! Realm(fileURL: URL.init(string: dbPath)!)
    return defaultRealm
}

///存到本地realm,
public class func insertStudent(by student : User) -> Void {
    let defaultRealm = self.getDB()
    try! defaultRealm.write {
        ///這里一定要用update,如果User對象設(shè)置了關(guān)鍵字的話
        ///不然會因為關(guān)鍵字相同, 會直接崩潰
        ///這樣寫,直接調(diào)用這個User的方法,可以實現(xiàn)沒有創(chuàng)建,創(chuàng)建了就更新的效果
        defaultRealm.add(student, update: true)
    }
    print(defaultRealm.configuration.fileURL ?? "")
}

///給User里面添加Game
func insertGame(by game: Game){
    let defaultRealm = User.getDB()
    ///查詢語句,sql
    let some = defaultRealm.objects(Game.self).filter("gameId contains '\(game.gameId)' AND userId contains '\(self.phone)'")
    ///注意,realm的對象,你可以賦值, 使用
    ///但是你如果一旦要改變,那么 必須在write里面來改變
    try! defaultRealm.write {
        ///針對Game里面存在關(guān)鍵字的情況,因為realm如果一旦設(shè)置了關(guān)鍵字,就沒辦法重復(fù)添加
        ///如果存在了那么就只能修改,數(shù)組里面沒有找到可以更新game的方法,所以就自己寫了更新
        if some.count > 0 {
            let temp = some.first!
            temp.opponent = game.opponent
            temp.place = game.place
            temp.date = game.date
            temp.startTime = game.startTime
            temp.remark = game.remark
            temp.userId = game.userId
        }else{
            self.gameList.append(game)
        }
    }
    print(defaultRealm.configuration.fileURL ?? "")
}

}

class Game: Object {

@objc dynamic var gameId = ""
@objc dynamic var opponent = ""
@objc dynamic var place = ""
@objc dynamic var date = ""
@objc dynamic var startTime = ""
@objc dynamic var remark = ""
@objc dynamic var userId = ""
///沒有選,1 參加,2 請假
@objc dynamic var isUserJoin = "0"
///設(shè)置關(guān)鍵字
override static func primaryKey() -> String? {
    return "gameId"
}
///設(shè)置他的父類,和父類gameList 關(guān)聯(lián)
let owners = LinkingObjects(fromType: User.self, property: "gameList")

}

注意:如果后面改了User,或者Game的初始屬性名,不管是增添還是刪除,初期最好辦的做法是吧數(shù)據(jù)庫刪除, 不然會蹦,只要數(shù)據(jù)庫的結(jié)構(gòu)發(fā)生了變化,那么就謹(jǐn)慎處理。

本文講了realm的一些基本用法, 把其他網(wǎng)上資料的不足對象里面包含對象的這個給補(bǔ)足了,mmp被一直坑

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容