Realm 簡介

FG Developer
AppMaster Developers
5 min readNov 21, 2017

Realm 為專門為移動應用所設計,Realm 並不是基於 Core Data ,

也不是基於 SQLite 所構建的。它擁有自己的資料庫存儲引擎,

可以高效且快速地完成資料庫的構建操作。

Realm 使用的是自己的引擎,

因此, Realm 就可以在 iOS 和 Android 平台上共同使用(完全無縫),

並且支持 Swift 、 Objective-C 、 C# 、 Java 及 Javascript語言來編寫

( Android 平台和 iOS 平台使用不同的 SDK )。

特點和優點:

a.跨平台:

現在絕大多數的應用開發並不僅僅只在 iOS 平台上進行開發,

還要兼顧到 Android 平台的開發。為兩個平台設計不同的資料庫是愚蠢的,

而使用 Realm 資料庫, iOS 和 Android 無需考慮內部數據的架構,

調用 Realm 提供的 API 就可以完成數據的交換,實現 「 一個資料庫,兩個平台無縫銜接 」 。

b.簡單易用:

比起 Core Data 和 SQLite 程式複雜入門難,

換用 Realm 可以極大地減少學習代價和學習時間,讓應用及早用上數據存儲功能。

c.可視化:

Realm 還提供了一個輕量級的資料庫查看工具,

藉助這個工具,開發者可以查看資料庫當中的內容,執行簡單的插入和刪除數據的操作。

d.是關連式資料庫,是一種MVCC資料庫架構

(連接到數據庫的每個用戶在特定的時刻看到資料庫的快照。在完成更改之前,作者所做的任何更改才會被數據庫的其他用戶看到。)

所以讀取資料並不會因為寫入資料而被拖慢。

e.Server和client端資料庫自動同步,client端會有一份拷貝,所以離線時功能依舊正常。

f.zero-copy和延遲加載 :

因為硬碟和RAM資料排序不同,所以當需要讀寫資料時需要先把資料複製一份到RAM裡面,

再去做資料對應取得資料,此方法耗費資源,對此zero-copy提供了改進方法,

zero-copy設計成硬碟和RAM資料是可以映射直接讀取,

就不用再複製一份到RAM裡面再去做資料對應,節省資源,直接去讀取就可以了。

由於RAM有限,一次把所有資料讀進來耗時且浪費,延遲加載提供了解決方法,

延遲加載則為當資料需要用到時再去載入。

=================================

Realm 並不是一個 SQL 資料庫(沒有SQL語法),也不是一個 ORM

ORM (Object Relational Mapping),是一種程式設計技術,用於實現物件導向編程語言裡不同類型系統的資料之間的轉換。

ORM 相關背景:

當使用SQL搜尋某欄位資料,使用SQL語法GetString、GetInt32等函式,

假設某欄位 A 的值型別為String,使用GetString取值,

但也許更動過資料架構使得A 的值型別不是String,

那使用GetString將會產生錯誤,且在程式真正執行後才會發現錯誤。

Typed DataSet 提供了方法避免在執行後才發現錯誤,

Typed DataSet會有個資料集(.xsd),可對應原始的data table,

好處是讓資料以物件方式取得表示,免去以上的資料型別困擾,

但當沒有很勤勞的更新資料集時,取用某些未更新部分資料時依舊要使用SQL,

Typed DataSet還是比較偏向資料概念,

而 ORM 則是完全以物件概念為出發點,避免讓使用者直接接觸SQL語法,

把資料表和 SQL 語法另外封裝成物件導向的方式,

所以使用者並不會直接接觸到SQL語法,也簡化了程式語言的複雜度。

網路擷取解釋(No, Datasets are not ORM’s. They may look like orms because datasets map tables to objects just like ORM’s the main difference lies in what objects they map to.

Datasets have their own table and row object types that closely resemble the structure of the database. You’re rebuilding part of the database’s relational model in objects. Restricting these objects into something resembling a relational database gets around some of the problems inherent in mapping a database to an object model.

An ORM maps the tables and rows from the database into your own object model. The structure of your object model can be optimized for your application instead of resembling a relational database. The ORM takes care of the difficulties in transforming a relational model into an object model.)

但以上方法需要做背景的語法和物件資料轉換,無形中耗費了資源,而Realm就是為了解決以上問題而產生。

Author : Eric Hong (eric@appmaster.cc)

--

--