iOS開發swift -- Realm入門

weixin_33936401發表於2017-05-31

一 關於Realm

1、Realm 是一個跨平臺的移動資料庫引擎,為移動應用的資料持久化而生。其目的是要取代 Core Data 和 SQLite。
2、特點:
(1)使用簡單,大部分常用的功能(比如插入、查詢等)都可以用一行簡單的程式碼輕鬆完成,易學習。
(2)Realm 不是基於 Core Data,也不是基於 SQLite 封裝構建的。它有自己的資料庫儲存引擎。
(3)Realm 具有良好的跨平臺特性,可以在 iOS 和 Android 平臺上共同使用。程式碼可以使用 Swift 、 Objective-C 以及 Java 語言來編寫。
(4)Realm 還提供了一個輕量級的資料庫檢視工具(Realm Browser)。你也可以用它進行一些簡單的編輯操作(比如插入和刪除操作)

中文文件
英文文件

二 sdk整合 CocoaPods

$ cd/你的專案地址
$ open -e Podfile

target '你的app' do
    pod 'RealmSwift'
end

$ pod install

三 資料型別

(1)Realm支援以下的屬性型別:Bool、Int8、Int16、Int32、Int64、Double、Float、String、NSDate 、以及NSData.CGFloat 屬性被取消了,因為它的型別不依賴於平臺。
String、NSDate以及 NSData型別的屬性都可以新增可選值。Object
型別的屬性必須設定為可選。儲存可空數字可以通過 Realm 可選值來實現。
(2)關係
Object 能夠藉助 Object以及 List屬性來和另一個 Object建立聯絡。 List 的介面和 Array非常類似,在 List中的物件能夠通過索引下標(indexed subscripting)進行訪問。 與 Array所不同的是,List其中只能存放簡單的 Object子類型別。

//Realm資料模型是基於標準 Swift 類來進行定義的,使用屬性來完成模型的具體定義。通過簡單的繼承 Object 或者一個已經存在的模型類,您就可以建立一個新的 Realm 資料模型物件。
//由於 Realm 中定義的所有模型在程式啟動時就會被解析,所以即使程式碼中沒有呼叫,它們都需要被初始化。在 Swift 中使用 Realm 的時候,Swift.reflect(_:)函式可用於確定您模型中的資訊,這需要確保 init()已被成功呼叫。這意味著所有非可選的屬性必須新增一個預設值。

import RealmSwift

//型別
class ConsumeType:Object {
    //型別名
    dynamic var name = ""
}

//詳情
class ConsumeItem:Object {
    //條目名
    dynamic var name = ""
    //金額
    dynamic var cost = 0.00
    //時間
    dynamic var date = Date()
    //所屬消費類別
    dynamic var type:ConsumeType?
}

四 建立資料庫

        //使用預設資料庫
        let realm = try! Realm()
    
        //使用其他資料庫
        let config = Realm.Configuration(
            // 獲取需要打包檔案的 URL 路徑
            fileURL: Bundle.main.url(forResource: "MyBundledData", withExtension: "realm"),
            // 以只讀模式開啟檔案,因為應用資料包並不可寫
            readOnly: true)
        let realm = try! Realm(configuration: config)
        //記憶體資料庫 通常情況下,Realm 資料庫是儲存在硬碟中的,但是您能夠通過設定 inMemoryIdentifier 而不是設定Realm.Configuration 中的 fileURL 屬性,以建立一個完全在記憶體中執行的資料庫。記憶體資料庫在每次程式執行期間都不會儲存資料。但是,這不會妨礙到 Realm 的其他功能,包括查詢、關係以及執行緒安全
        let realm = try! Realm(configuration: Realm.Configuration(inMemoryIdentifier: "MyInMemoryRealm"))

五 資料增刪改查

    func addCilck(){
        let type1 = ConsumeType()
        type1.name = "衣服"
        let type2 = ConsumeType()
        type2.name = "飲食"
        
        //建立資料記錄 可使用陣列建立
        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
       
        // * 三次處理事物 會傳送三次通知
        
        //增加
        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 現在已經填充完畢,可以不需要阻塞 UI 就可以被訪問
                debugPrint("initial initial")
                break
            case .update(_, deletions: _, insertions: _, modifications: _):
                //資料庫發生更改(增刪改)呼叫
                debugPrint("update update")
                break
            default:
                break  
            } 
        })
        
        //列印出資料庫地址
        print(Realm.Configuration.defaultConfiguration.fileURL ?? "nil")        
    }

    deinit {
        token?.stop()
    }

如有不妥,請多多指教:)

相關文章