一 關(guān)于Realm
1、Realm 是一個跨平臺的移動數(shù)據(jù)庫引擎谴返,為移動應(yīng)用的數(shù)據(jù)持久化而生煞肾。其目的是要取代 Core Data 和 SQLite。
2嗓袱、特點(diǎn):
(1)使用簡單籍救,大部分常用的功能(比如插入、查詢等)都可以用一行簡單的代碼輕松完成渠抹,易學(xué)習(xí)蝙昙。
(2)Realm 不是基于 Core Data,也不是基于 SQLite 封裝構(gòu)建的梧却。它有自己的數(shù)據(jù)庫存儲引擎奇颠。
(3)Realm 具有良好的跨平臺特性,可以在 iOS 和 Android 平臺上共同使用放航。代碼可以使用 Swift 烈拒、 Objective-C 以及 Java 語言來編寫。
(4)Realm 還提供了一個輕量級的數(shù)據(jù)庫查看工具(Realm Browser)广鳍。你也可以用它進(jìn)行一些簡單的編輯操作(比如插入和刪除操作)
二 sdk集成 CocoaPods
$ cd/你的項目地址
$ open -e Podfile
target '你的app' do
pod 'RealmSwift'
end
$ pod install
三 數(shù)據(jù)類型
(1)Realm支持以下的屬性類型:Bool荆几、Int8、Int16赊时、Int32吨铸、Int64、Double祖秒、Float焊傅、String剂陡、NSDate 、以及NSData.CGFloat 屬性被取消了狐胎,因?yàn)樗念愋筒灰蕾囉谄脚_鸭栖。
String、NSDate以及 NSData類型的屬性都可以添加可選值握巢。Object
類型的屬性必須設(shè)置為可選晕鹊。存儲可空數(shù)字可以通過 Realm 可選值來實(shí)現(xiàn)。
(2)關(guān)系
Object 能夠借助 Object以及 List屬性來和另一個 Object建立聯(lián)系暴浦。 List 的接口和 Array非常類似溅话,在 List中的對象能夠通過索引下標(biāo)(indexed subscripting)進(jìn)行訪問。 與 Array所不同的是歌焦,List其中只能存放簡單的 Object子類類型飞几。
//Realm數(shù)據(jù)模型是基于標(biāo)準(zhǔn) Swift 類來進(jìn)行定義的,使用屬性來完成模型的具體定義独撇。通過簡單的繼承 Object 或者一個已經(jīng)存在的模型類屑墨,您就可以創(chuàng)建一個新的 Realm 數(shù)據(jù)模型對象。
//由于 Realm 中定義的所有模型在程序啟動時就會被解析纷铣,所以即使代碼中沒有調(diào)用卵史,它們都需要被初始化。在 Swift 中使用 Realm 的時候搜立,Swift.reflect(_:)函數(shù)可用于確定您模型中的信息以躯,這需要確保 init()已被成功調(diào)用。這意味著所有非可選的屬性必須添加一個默認(rèn)值啄踊。
import RealmSwift
//類型
class ConsumeType:Object {
//類型名
dynamic var name = ""
}
//詳情
class ConsumeItem:Object {
//條目名
dynamic var name = ""
//金額
dynamic var cost = 0.00
//時間
dynamic var date = Date()
//所屬消費(fèi)類別
dynamic var type:ConsumeType?
}
四 創(chuàng)建數(shù)據(jù)庫
//使用默認(rèn)數(shù)據(jù)庫
let realm = try! Realm()
//使用其他數(shù)據(jù)庫
let config = Realm.Configuration(
// 獲取需要打包文件的 URL 路徑
fileURL: Bundle.main.url(forResource: "MyBundledData", withExtension: "realm"),
// 以只讀模式打開文件忧设,因?yàn)閼?yīng)用數(shù)據(jù)包并不可寫
readOnly: true)
let realm = try! Realm(configuration: config)
//內(nèi)存數(shù)據(jù)庫 通常情況下,Realm 數(shù)據(jù)庫是存儲在硬盤中的颠通,但是您能夠通過設(shè)置 inMemoryIdentifier 而不是設(shè)置Realm.Configuration 中的 fileURL 屬性见转,以創(chuàng)建一個完全在內(nèi)存中運(yùn)行的數(shù)據(jù)庫。內(nèi)存數(shù)據(jù)庫在每次程序運(yùn)行期間都不會保存數(shù)據(jù)蒜哀。但是,這不會妨礙到 Realm 的其他功能吏砂,包括查詢撵儿、關(guān)系以及線程安全
let realm = try! Realm(configuration: Realm.Configuration(inMemoryIdentifier: "MyInMemoryRealm"))
五 數(shù)據(jù)增刪改查
func addCilck(){
let type1 = ConsumeType()
type1.name = "衣服"
let type2 = ConsumeType()
type2.name = "飲食"
//創(chuàng)建數(shù)據(jù)記錄 可使用數(shù)組創(chuàng)建
let item1 = ConsumeItem(value: ["水果",5999.00,Date(),type1])
let item2 = ConsumeItem()
item2.name = "電影"
item2.cost = 30.00
item2.date = Date(timeIntervalSinceNow: -36000)
item2.type = type2
// * 三次處理事物 會發(fā)送三次通知
//增加
try! realm?.write({
realm?.add(item1)
realm?.add(item2)
})
//更新
try! realm?.write({
item3.name = "dog"
})
//查詢
let item4 = realm?.objects(ConsumeItem.self).filter("cost = 5999")
//刪除
try!realm?.write({
realm?.delete(item4!)
})
}
六 通知
var token : NotificationToken? = nil
override func viewDidLoad() {
super.viewDidLoad()
//集合通知
let result = realm?.objects(ConsumeItem.self)
token = result?.addNotificationBlock({ (changes: RealmCollectionChange) in
switch changes {
case .initial:
//Results 現(xiàn)在已經(jīng)填充完畢,可以不需要阻塞 UI 就可以被訪問
debugPrint("initial initial")
break
case .update(_, deletions: _, insertions: _, modifications: _):
//數(shù)據(jù)庫發(fā)生更改(增刪改)調(diào)用
debugPrint("update update")
break
default:
break
}
})
//打印出數(shù)據(jù)庫地址
print(Realm.Configuration.defaultConfiguration.fileURL ?? "nil")
}
deinit {
token?.stop()
}
如有不妥狐血,請多多指教:)