Android資料庫Realm實踐

來源:互聯網
上載者:User

標籤:

Android開發中常用的資料庫有5個:

1. OrmLiteOrmLite 不是 Android 平台專用的ORM架構,它是Java ORM。支援JDBC串連,Spring以及Android平台。文法中廣泛使用了註解(Annotation)。

2. SugarORMSugarORM 是 Android 平台專用ORM。提供簡單易學的APIs。可以很容易的處理1對1和1對多的關係型資料,並通過3個函數save(), delete() 和 find() (或者 findById()) 來簡化CRUD基本操作。

3. GreenDAO當效能很重要時(資料訪問頻繁),GreenDao是一個很快的解決方案,它能夠支援數千條記錄的CRUD每秒,和OrmLite相比,GreenDAO要快幾乎4.5倍。(準確資料請自行benchmark)。

GreenDAO小於100KB,所以對於應用程式APK的大小影響很小。

4. Active AndroidActive Record(活動目錄)是Yii、Rails等架構中對ORM實現的典型命名方式。Active Android 協助你以物件導向的方式來操作SQLite。
在你的項目中包含Active Android,你需要在項目的 /libs 目錄下添加一個jar檔案。可以從Github中擷取原始碼並使用Maven進行編輯。

5. RealmRealm 是一個將可以使用的Android ORM,基於C++編寫,直接運行在你的裝置硬體上(不需要被解釋),因此運行很快。它同時是開源跨平台的,iOS的代碼可以在GitHub找到,你還可以找到Objective C以及Swift編寫的Realm使用執行個體。


相比SQLite,Realm更快並且具有很多現代資料庫的特性,比如支援JSON,流式api,資料變更通知,以及加密支援,這些都為安卓開發人員帶來了方便。

Ream提供了五種編程方式的實現。分別是Java,Objective C,Swift,React-Native,tamarin。在這裡我著重介紹在Android中的使用。

大家可以直接看官方的文檔,我也是在這基礎的上講解:realm使用


快速入門

運行環境
  • 目前我們還不支援 Android 以外的 Java 環境;
  • Android Studio >= 1.5.1 ;
  • 較新的 Android SDK 版本;
  • JDK 版本 >=7;
  • 我們支援 Android API 9 以上的所有版本(Android 2.3 Gingerbread 及以上)。
構建依賴關係

第一步: 在項目的 build.gradle 檔案中添加如下 class path 依賴。

buildscript {    repositories {        jcenter()    }    dependencies {        classpath "io.realm:realm-gradle-plugin:1.0.0"    }}

項目的 build.gradle 檔案在如下位置:

第二步: 在 app 的 build.gradle 檔案中應用 realm-android 外掛程式。

apply plugin: ‘realm-android‘

app的 build.gradle 檔案在如下位置:

如果讀者使用的是maven構建項目,官方也有說明,這裡我就不列出來了。

說到這裡,我們已經迫不及待的想嘗試下了。

1,application裡面初始化

public class RealmApplication extends Application {    @Override    public void onCreate() {        super.onCreate();        init();    }    private void init() {        RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this).build();        Realm.setDefaultConfiguration(realmConfiguration);    }}

2,建立工具管理類,擷取Realm執行個體

public class RealmUtils {    private static  RealmUtils instance;    public final Context mContext;    private String realmName = "realm_demo.realm";    public RealmUtils(Context mContext) {        this.mContext = mContext;    }    public  static  RealmUtils getInstance(Context context){        if (instance == null) {            synchronized (RealmUtils.class) {                if (instance == null) {                    instance = new RealmUtils(context);                }            }        }        return  instance;    }    public  Realm getRealm(){        Realm realm =Realm.getInstance(new RealmConfiguration.Builder(mContext).name(realmName).build());        return  realm;    }}
3,建立一個realmObject對象,儲存object

例如,我們現在需要儲存一個人(Person)對象,注意,這裡的成員屬性為了realm的序列化,都寫成私人的


public class Person extends RealmObject {    @PrimaryKey    private String code;//編號    private String name;//姓名    private int age;//年齡    public Person() {    }    public Person(int age, String code, String name) {        this.age = age;        this.code = code;        this.name = name;    }    public String getCode() {        return code;    }    public void setCode(String code) {        this.code = code;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public String toString() {        return "Person{" +                "code='" + code + '\'' +                ", name='" + name + '\'' +                ", age=" + age +                '}';    }}

4,定義幾個CRUD的方法,供其它類實現

public interface PersonDao {    //插入    void insert(Person person) throws Exception;    //查詢    List<Person> getAllPerson() throws Exception;    //更新    Person updatePerson(Person person) throws Exception;    //刪除    void deletePerson(String code) throws Exception;    //    非同步插入    void insertPersonAsync(Person person) throws Exception;}
5,對象的具體實現

public class PersonDaoImpl implements PersonDao {    private Context context;    private Realm mRealm;    public PersonDaoImpl(Context context){        mRealm = RealmUtils.getInstance(context).getRealm();    }    @Override    public void insert(Person person) throws Exception {        mRealm.beginTransaction();        Person person1 = mRealm.copyToRealm(person);        mRealm.commitTransaction();        mRealm.close();    }    @Override    public List<Person> getAllPerson() throws Exception {        List<Person> mlist = null;        mlist =  mRealm.where(Person.class).findAll();        mRealm.close();        return mlist;    }    @Override    public Person updatePerson(Person person) throws Exception {        mRealm.beginTransaction();        Person person1 = mRealm.copyToRealmOrUpdate(person);        mRealm.commitTransaction();        mRealm.close();        return  person1;    }    @Override    public void deletePerson(String code) throws Exception {        Person person = mRealm.where(Person.class).equalTo("code",code).findFirst();        mRealm.beginTransaction();        person.deleteFromRealm();        mRealm.commitTransaction();    }    @Override    public void insertPersonAsync(final Person person) throws Exception {        //一個Realm只能在同一個線程中訪問,在子線程中進行資料庫操作必須重新擷取Realm對象:        mRealm.executeTransaction(new Realm.Transaction() {            @Override            public void execute(Realm realm) {                realm.beginTransaction();                Person person1 = realm.copyToRealm(person);                realm.commitTransaction();                realm.close();//並且要記得在離開線程時要關閉 realm.close();            }        });        //關閉Realm對象        mRealm.close();    }}

6,測試

public class MainActivity extends AppCompatActivity {    private Realm mRealm;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }    private void init() {        Person person = new Person();        person.setName("測試");        person.setAge(28);        person.setCode("xxxx");        PersonDao dao = new PersonDaoImpl(this);        try {            //增加            dao.insert(person);             //查詢全部            dao.getAllPerson();            //指定code刪除            dao.deletePerson("xxxx");            //更新            dao.updatePerson(person);        } catch (Exception e) {            e.printStackTrace();        }    }}

其實這和以前的用法差不多的,有點在於,realm去幫我們管理這個資料庫,並且在安全上我這還沒有講到,這裡只講了基本用法,大家可以去看看官方的文檔說明:

官方文檔


Android資料庫Realm實踐

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.