第一步導(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")
}