Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android數據庫Realm實踐

Android數據庫Realm實踐

編輯:關於Android編程

Android開發中常用的數據庫有5個:

1.OrmLite
OrmLite 不是 Android 平台專用的ORM框架,它是Java ORM。支持JDBC連接,Spring以及Android平台。語法中廣泛使用了注解(Annotation)。
2.SugarORM
SugarORM 是 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 Android
Active Record(活動目錄)是Yii、Rails等框架中對ORM實現的典型命名方式。Active Android 幫助你以面向對象的方式來操作SQLite。
在你的項目中包含Active Android,你需要在項目的 /libs 目錄下添加一個jar文件。可以從Github中獲取源代碼並使用Maven進行編輯。
5.Realm
Realm 是一個將可以使用的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文件在如下位置:Project level build.gradle file

第二步:在 app 的 build.gradle 文件中應用realm-android插件。

apply plugin: 'realm-android'

app的build.gradle文件在如下位置:Application level build.gradle file

如果讀者使用的是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 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 getAllPerson() throws Exception {
        List 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去幫我們管理這個數據庫,並且在安全上我這還沒有講到,這裡只講了基本用法,大家可以去看看官方的文檔說明:

官方文檔
 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved