1. 程式人生 > >Sqlite的完美替代者,android資料庫新王者——Realm

Sqlite的完美替代者,android資料庫新王者——Realm

原文地址    http://www.cnblogs.com/liushilin/p/5752099.html;

自己記錄一下,有時間去看看。mark;

如果你比較關心android開發的最新動態的話,我想你一定知道android資料庫新王者,沒錯,就是這個東西——Realm。

在安卓開發中,我們有sharedPreference和檔案操作,當然還有一直為之自豪的輕量級資料庫sqlite。

SharedPreference其實是採用xml的方式,以鍵值對形式儲存基本資料型別的資料,對於複雜的資料篩選查詢操作,file和sharedpreference就顯得雞肋,這個時候sqlite便可以滿足有大量複雜查詢要求的快取資料操作,但是它的使用一直被人詬病,是的,因為程式碼量太多了!

作為一個要為全世界做貢獻的程式猿,怎麼可以忍受這樣多的程式碼實現一點小東西呢?No,No,我們絕對不能接受!!!

還好網上出現了很多優秀的ORM框架供我們參略,比如ORMite,greenDao等,而這些都是基於SQLite的。

額,還是不扯遠了,直接給大家帶來今天的主角,沒錯,就是它——realm!

對於初學Realm的小夥伴,肯定還是應該對比著我們熟悉不過的sqlite來說的。

相比sqlite,Realm具有別人不可比擬的神奇速度,哦,這不是重點,它還有強大先進的特性等著你,比如資料加密支援,對Json的支援,流暢的API,資料觀察者變化,所有的一切都是為了讓我們程式猿更加瀟灑!什麼?程式猿還可以瀟灑??有的小夥伴肯定怒火中燒了?樓主別裝逗比。

額,好吧,只要你心瀟灑,你人就瀟灑啦~怎麼跑題了呢?還是迴歸正題!!!

哦,對了,對於Realm,有一個非常強大的東西,就是它可以和當前最主流的網路框架Retrofit以及強大的非同步框架Rxjava聯用哦,對於Retrofit的介紹可以去直通車:

等等,怎麼總感覺少說了點什麼,額,對,如標題一樣,它還有一個很強大的特性,那就是它可以總能獲取到最新的資料,是的,它是一個live db~~ 

1)首先在你的project的gradle檔案中新增這樣一句,注意:是工程gradle,不是app的gradle,無法編譯別怪樓主沒提醒你哈!!

1 classpath 'io.realm:realm-gradle-plugin:1.1.0'

2)然後再去app下的gradle頭部新增:

1 apply plugin: 'realm-android'

3)隨便寫一個Java實體類,例如我寫了一個使用者類User,只需要繼承RealmObject即可,對於主鍵可以添加註解@PrimaryKey,對於@Required自然是必填項,@Ignore即是可忽略的。

複製程式碼
 1 package com.example.nanchen.realmdemo;
 2 
 3 import io.realm.RealmObject;
 4 import io.realm.annotations.Ignore;
 5 import io.realm.annotations.PrimaryKey;
 6 import io.realm.annotations.Required;
 7 
 8 /**
 9  *
10  * @author nanchen
11  * @date  2016-08-08  17:21:15
12  */
13 public class User extends RealmObject {
14     //主鍵必須添加註解
15     @PrimaryKey
16     private int id;//主鍵id
17     @Required    //註解設為Required代表必須項
18     private String name;//姓名
19 
20     private int age;//年齡
21 
22     @Ignore   //表示忽視項,資料庫不會儲存該欄位
23     private boolean hasGrilFriend;//是否有女朋友
24 
25     public User() {
26     }
27 
28     public User(int id, String name, int age) {
29         this.id = id;
30         this.name = name;
31         this.age = age;
32     }
33 
34     public User(String name, int id, int age, boolean hasGrilFriend) {
35         this.name = name;
36         this.id = id;
37         this.age = age;
38         this.hasGrilFriend = hasGrilFriend;
39     }
40 
41     public boolean isHasGrilFriend() {
42         return hasGrilFriend;
43     }
44 
45     public void setHasGrilFriend(boolean hasGrilFriend) {
46         this.hasGrilFriend = hasGrilFriend;
47     }
48 
49     public int getId() {
50         return id;
51     }
52 
53     public void setId(int id) {
54         this.id = id;
55     }
56 
57     public String getName() {
58         return name;
59     }
60 
61     public void setName(String name) {
62         this.name = name;
63     }
64 
65     public int getAge() {
66         return age;
67     }
68 
69     public void setAge(int age) {
70         this.age = age;
71     }
72 
73     @Override
74     public String toString() {
75         return "User{" +
76                 "id=" + id +
77                 ", name='" + name + '\'' +
78                 ", age=" + age +
79                 ", hasGrilFriend=" + hasGrilFriend +
80                 '}';
81     }
82 }
複製程式碼

4)額,這個東西肯定也是需要初始化的嘛。額,樓主這裡就單獨寫一個RealmUtils工具類了。

複製程式碼
 1 package com.example.nanchen.realmdemo;
 2 
 3 import android.content.Context;
 4 
 5 import io.realm.Realm;
 6 import io.realm.RealmConfiguration;
 7 
 8 /**
 9  * @author nanchen
10  * @date 16-8-8 下午5:51
11  */
12 public class RealmUtils {
13     private Context context;
14     private static RealmUtils mInstance;
15     private String realName = "myRealm.realm";
16 
17     private RealmUtils(Context context){
18         this.context = context;
19     }
20 
21     public static RealmUtils getInstance(Context context){
22         if (mInstance == null){
23             synchronized (RealmUtils.class){
24                 if (mInstance == null){
25                     mInstance = new RealmUtils(context);
26                 }
27             }
28         }
29         return mInstance;
30     }
31 
32     /**
33      * 獲得Realm物件
34      * @return
35      */
36     public Realm getRealm(){
37         return Realm.getInstance(new RealmConfiguration.Builder(context).name(realName).build());
38     }
39 }
複製程式碼

5)然後在看看基本操作,樓主這裡就使用比較流行的Dao模式吧

先寫一個Dao介面,註釋很清楚哈。

複製程式碼
 1 package com.example.nanchen.realmdemo;
 2 
 3 import java.sql.SQLException;
 4 import java.util.List;
 5 
 6 /**
 7  * 操作資料庫的介面Dao
 8  *
 9  * @author  nanchen
10  * @date   2016-08-08  17:23:18
11  *
12  */
13 public interface UserDao {
14 
15     /**
16      * 插入一個使用者
17      * @param user    需要插入的使用者物件
18      * @throws SQLException
19      */
20     void insert(User user) throws SQLException;
21 
22     /**
23      * 獲得所有的使用者列表
24      * @return 使用者列表
25      * @throws SQLException
26      */
27     List<User> getAllUser() throws SQLException;
28 
29     /**
30      * 更新一個使用者
31      * @param user 需要更新的使用者類
32      * @return      更新後的物件
33      * @throws SQLException
34      */
35     User updateUser(User user) throws SQLException;
36 
37     /**
38      * 根據姓名修改新姓名
39      * @param name1 老名字
40      * @param name2 新名字
41      * @throws SQLException
42      */
43     void updateUser(String name1,String name2) throws SQLException;
44 
45     /**
46      * 根據id刪除使用者
47      * @param id 使用者主鍵
48      * @throws SQLException
49      */
50     void deleteUser(int id) throws SQLException;
51 
52     /**
53      * 非同步新增使用者
54      * @param user 需要新增的使用者物件
55      * @throws SQLException
56      */
57     void insertUserAsync(User user) throws SQLException;
58 
59     /**
60      * 按名字或者年齡查詢第一個User
61      */
62     User findByNameOrAge(String name1,int age1) throws SQLException;
63 
64     /**
65      * 清楚所有
66      * @throws SQLException
67      */
68     void deleteAll() throws SQLException;
69 
70     /**
71      * 關閉事務
72      */
73     void closeRealm();
74 }
複製程式碼

然後是我們的Dao實現類,同樣是滿滿的註釋,看樓主對你們這麼用心,很感動有木有,想以身相許了有木有,額,樓主,不搞基!!!

不過你既然這麼心存感激,就在文章右下角給樓主點個贊吧~~嘿嘿。

複製程式碼
  1 package com.example.nanchen.realmdemo;
  2 
  3 import android.content.Context;
  4 
  5 import java.sql.SQLException;
  6 import java.util.List;
  7 
  8 import io.realm.Realm;
  9 import io.realm.Realm.Transaction;
 10 import io.realm.RealmResults;
 11 import io.realm.Sort;
 12 
 13 /**
 14  * @author nanchen
 15  * @date 16-8-8 下午5:49
 16  */
 17 public class UserDaoImpl implements UserDao {
 18 
 19     private Context context;
 20     private Realm mRealm;
 21 
 22     public UserDaoImpl(Context context) {
 23         mRealm = RealmUtils.getInstance(context).getRealm();
 24     }
 25 
 26     /**
 27      * 同步插入
 28      * @param user    需要插入的使用者物件
 29      * @throws SQLException
 30      */
 31     @Override
 32     public void insert(User user) throws SQLException {
 33         mRealm.beginTransaction();//必須先開啟事務
 34         User user1 = mRealm.copyToRealm(user);//把User物件複製到Realm
 35         mRealm.commitTransaction();//提交事務
 36 //        mRealm.close();//必須關閉,不然會造成記憶體洩漏
 37     }
 38 
 39     /**
 40      * 返回所有的User物件,並按照名字首字母排序
 41      * @return  User物件表
 42      * @throws SQLException
 43      */
 44     @Override
 45     public List<User> getAllUser() throws SQLException {
 46         List<User> list = null;
 47         RealmResults<User> results = mRealm.where(User.class).findAll();
 48         results.sort("name", Sort.DESCENDING);//針對字串的排序,但目前並不是支援所有字符集
 49         list = results;
 50 //        mRealm.close();
 51         return list;
 52     }
 53 
 54     /**
 55      * 更新一個User
 56      * @param user 需要更新的使用者類
 57      * @return 返回更新後的User
 58      * @throws SQLException
 59      */
 60     @Override
 61     public User updateUser(User user) throws SQLException {
 62         mRealm.beginTransaction();//開啟事務
 63         User user1 = mRealm.copyToRealmOrUpdate(user);
 64         mRealm.commitTransaction();//提交事務
 65 //        mRealm.close();//必須關閉事務
 66         return user1;
 67     }
 68 
 69     /**
 70      * @param name1 老名字
 71      * @param name2 新名字
 72      * @throws SQLException
 73      */
 74     @Override
 75     public void updateUser(String name1, String name2) throws SQLException {
 76         mRealm.beginTransaction();//開啟事務
 77         mRealm.where(User.class)
 78                 .equalTo("name",name1)//查詢出name為name1的User物件
 79                 .findFirst()
 80                 .setName(name2);//修改查詢出的第一個物件的名字
 81         mRealm.commitTransaction();
 82 //        mRealm.close();
 83     }
 84 
 85     /**
 86      * 根據id刪除一個User
 87 
            
           

相關推薦

Sqlite完美替代android資料庫王者——Realm

原文地址    http://www.cnblogs.com/liushilin/p/5752099.html; 自己記錄一下,有時間去看看。mark; 如果你比較關心android開發的最新動態的話,我想你一定知道android資料庫新王者,沒錯,就是這個東西——

Android資料庫框架GreenDao&Realm實戰分析

Android開發的童鞋應該都知道,使用官方的SQLite資料庫,可以滿足我們大部分增刪改查的需求,然而隨著Android技術的逐步成長,你會慢慢發現SQLite越來越不能滿足我們的需求。總結為以下主要幾點: 1、創表,增刪改查需要些大量程式碼,開發效率極低

Android SQLite資料庫:增、刪、改、查以及資料庫版本管理

建立資料庫版本v.1 /** * 作者:created by meixi * 郵箱:[email protected] * 日期:2018/10/9 11 */ public class DBHelper extends SQLiteOpenHelper

Android-資料庫Sqlite的建立查詢及在ListView顯示

之前一直沒用到資料庫,也就沒看。突然有一天要用到才想去看,無奈得不到精髓,在這一塊也是消沉了好幾天都沒有進展,而且也看了蠻多的部落格,看完之後居然像沒看過一樣,好囧。。。。我也不知道是不是新手都這樣,如果是,那我一定很理解,如果不是,那隻能說我自己太懶了,沒有動手的能力。

Android--資料庫升級插入欄位

請考慮如下情況: 在資料庫升級時,不同版本的資料庫,他們定義的表結構完全可能是不一樣的,比如V1.0的表A有10個column,而在V1.1的表A有12個colum,在升級時,表A增加了兩列,此時我們應該怎麼做呢。 總體思路 1,將表A重新命名,改了A_tem

kotlin 一種android平臺一級開發語言

程序 16px 語法 jvm ava lin 使用 ide 擁有 最近看到一則科技新聞, 大致內容是google將kotlin語言作為android應用開發的一級語言, 與java並駕齊驅, 這是一個開發界的大事件大新聞, 連google的親兒子go語言也沒有這

【使用教程】CMDerWindow下CMD的替代

command window下 stat git gis cut 管理員權限 view 而且 cmder是什麽 Windows發展了這麽年,UI啊、性能啊做了若幹的變化,無奈命令行還是一如既往的差。 這個超級醜陋的界面,我是不能忍的。 而且還不支持Ctrl + c這樣的快

如何用源資料庫.sql檔案初始化建立的資料庫

需求:新建立一個數據庫,需要用資料檔案tank.sql初始化資料。 1.執行命令:show databases;檢視現有資料庫。 2.執行create database tank;建立資料庫tank。再檢視資料庫,執行show databases; 新建立的資料庫tank成功了。 3.選

android 資料庫 SQLite

public class SqliteHelper extends SQLiteOpenHelper{ private static String db_name="mydb.db"; private static int db_version=1; public Sql

Android資料庫sqlite儲存

一、修改佈局檔案 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layo

Android編寫一個登入介面利用資料庫實現記住密碼註冊賬號強制下線以及類似QQ的下拉列表登入功能

        首先呢,看到這麼長的標題,是不是感覺這些功能有點難以實現呢,哈哈,其實並沒有想象中的那麼複雜,下面就跟著筆者來一起學習一下這些功能是怎麼實現的吧!         1.建立一個所有活動的父類,繼承自A

2018首屆傳神大會:“語言+技術”將推動語言產業生態化發展 2018首屆傳神大會圓滿落幕

前景 研究員 行為 呼籲 建行 國際化 對稱加密 中國企業 糖果 2018首屆傳神者大會:“語言+新技術”將推動語言產業生態化發展 2018首屆傳神者大會圓滿落幕,“語言+新技術”或開啟全球深度互聯時代智聯未來,跨界賦能 1211首屆傳神者大會圓滿落幕 2018年12月11

完美的HTML移動端UI框架Framework7 v3元件特性一覽

Toast 吐司 我在2016年開始使用Framework7,在Framework7較早的版本中,沒有吐司,只有alert,Toast需要自己實現,而吐司又是非常常用的元件,這是Framework7為數不多的欠缺的地方,不過現在這個問題久不存在了,最新版的F7裡面已經增

酷客多郝憲瑋:零售+社交電商的完美結合將助力零售品牌快速傳播

近日,酷客多小程式CEO郝憲瑋先生應邀在華師大給MBA同學分享時下火熱的小程式。郝憲瑋先生以《小程式在新零售行業中的應用及發展趨勢》為主題闡述了觀點給MBA的同學帶來了不一樣的小程式感觀。 首先,郝憲瑋先生提出“新零售通過移動技術、人工智慧AI、大資料為使用者提供更好的使用者體驗,同時賦能企業提升運營效

【乾貨】分散式記憶體資料庫架構極速OLTP應用利器

TimesTen Scaleout,它實際上是一款關係型資料庫,不過是在執行的期間,把資料全量載入到記憶體當中來進行實現。 Oracle TimesTen 先簡單的說一下TimesTen Scaleout的歷史,它實際上是一款關係型資料庫,不過是在執行的期間,把資料全量載入到記憶體當中來進行實現。Ti

android sqlite 不存在插入存在更新語句

1.表不存在則建立 create table  if not exists student( _id Integer primary key autoincrement , name Text , age Integer) 2.當表中的資料不存在時插入資料 insert

拆解Google Play Services 4.4猜想Google I/O 2014的動向Android Wear支援等

(原文作者:Cody Toombs,  連結:http://www.androidpolice.com/2014/05/08/apk-teardown-google-play-services-4-4-explodes-with-android-wear-support-f

Android資料庫一:sqlite語句增刪改查

SQLite資料型別 一般資料採用的固定的靜態資料型別,而SQLite採用的是動態資料型別,會根據存入值自動判斷。SQLite具有以下五種常用的資料型別: NULL: 這個值為空值; VARCHAR(n):長度不固定且其最大長度為 n 的字串,n不能超過

Android資料庫兩種操作方式介紹: SQLite與ORMLite

本文主要介紹關係型資料庫 SQLite 和物件關係對映工具 ORMLite ,兩種方式都可以滿足Android多資料持久化儲存的需求。 1. SQLite 簡介: SQLite是一款Android內建的輕量級的關係型資料庫,它的運算速度非常快,佔用資源少,通常只需要幾

Android -- 固定在ScrollView頂部的View類似於浪微博的評論列表的頂部

現在很多App都實現了這個功能,例如新浪微博評論頁面的評論、轉發、讚的數字可以固定在螢幕上方。我個人很喜歡這種設計,所以利用一點空餘時間簡單實現了一個類似的功能。 先來看一下上面這張圖的效果。 這個是新浪微博的一個頁面,整體佈局大致分了三塊:正文內容、轉發評論贊的