版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/u010046908/article/details/51629262
好長時間沒有寫關于Android方面的學習文章了,今天給大家帶來的是堪稱是一個可以替代SQLite以及ORMlibraries的輕量級資料庫—Realm移動端資料庫。
相比SQLite,Realm更快并且具有很多現代資料庫的特性,比如支援JSON,流式api,資料變更通知,以及加密支援,這些都為安卓開發者帶來了友善。
Ream提供了五種程式設計方式的實作。分别是Java,Objective C,Swift,React-Native,tamarin。在這裡我着重介紹在Android中的使用。後面也會介紹在Swift中得使用。
1.先介紹一下打開資料Realm資料庫的工具:Realm Browser可視化工具
Realm資源包中包含了一個很有用的實用工具,可以幫助我們更好地管理Realm資料庫,那就是Realm Browser。Realm Browser可以讓您輕松地讀寫Realm資料庫(以.realm結尾),是以我們無需頭疼如何去檢視Realm專有資料庫的邏輯結構以及其中的資料,可視化的操作就如同SQLite的其他資料庫檢視工具一樣,十分簡單、易用(雖然Realm Browser的功能還十分簡陋,真的隻能讀寫而已)。
2.Realm支援的資料類型
- 支援基本資料結構:boolean, byte, short, ìnt, long, float, double, String, Dateand byte[]
- 支援JSON等複雜的資料類型
3.Realm的官方名詞
- Realm:Realm是架構的核心所在,是我們建構資料庫的通路點,使用建造者模式建構對象。
- RealmObject:這是我們自定義的realm資料模型。建立資料模型的行為将會影響到資料庫的結構。要建立一個資料模型,我們隻需要繼承RealmObject,然後設計我們想要存儲的屬性即可。
- RealmQuery(查詢):要在資料庫中檢索資訊,我們需要用到“檢索”操作。如果需要檢索更複雜的資料,那麼還可以使用複合查詢以及結果排序等等操作。
- RealmResults:這個類是執行任何查詢請求後所傳回的類,其中包含了一系列的Object對象。和List類似,我們可以用下智語法來對其進行通路,并且還可以決定它們之間的關系。不僅如此,它還擁有許多更強大的功能,包括排序、查找等等操作。
4、Realm在Android中的使用
4.1在項目的build.grade中配置下載下傳庫檔案
在本案例中我使用的最新版本的1.0.0版本。
apply plugin: 'realm-android'
buildscript {
repositories {
jcenter()
maven { url 'https://jitpack.io' }
}
dependencies {
classpath "io.realm:realm-gradle-plugin:1.0.0"
}
}
4.2建立資料庫,擷取去Realm
package com.lidong.demo.realm;
import android.content.Context;
import io.realm.Realm;
import io.realm.RealmConfiguration;
/**
*
*@className:RealmUtil
*@desc:RealmUtil工具類
*@author:lidong
*@datetime:16/6/10 下午9:55
*/
public class RealmUtil {
private static RealmUtil sIntance;
public final Context mContext;
private String realmName = "realm_demo.realm";
public RealmUtil(Context mContext) {
this.mContext = mContext;
}
/**
* 雙檢索單例
* @param context
* @return
*/
public static RealmUtil getIntance(Context context){
if (sIntance == null) {
synchronized (RealmUtil.class) {
if (sIntance == null) {
sIntance = new RealmUtil(context);
}
}
}
return sIntance;
}
/**
* 擷取realm對象
* @return
*/
public Realm getRealm(){
Realm realm =Realm.getInstancenew RealmConfiguration.Builder(mContext) .name(realmName) .build());
return realm;
}
}
4.3建立一個RealmObject
隻要繼承了RealmObject類,任意JavaBean都能存儲在Realm中。必須有一個預設構造器,成員變量有相應的getter/setter方法
package com.lidong.demo.realm;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
/**
* Person
*/
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.4對資料Person進行增删改查操作
PersonDao.java
package com.lidong.demo.realm;
import java.util.List;
/**
* Created by lidong on 16/6/9.
*/
public interface PersonDao {
/**
* 插入Person
* @param person
* @throws Exception
*/
void insert(Person person)throws Exception;
/**
* 擷取所有的使用者
* @return
* @throws Exception
*/
List<Person> getAllPerson()throws Exception;
/**
* 更新使用者
* @throws Exception
*/
Person updatePerson(Person person)throws Exception;
/**
* 删除使用者
* @param code
* @throws Exception
*/
void deletePerson(String code)throws Exception;
/**
* 異步插入Person
* @param person
* @throws Exception
*/
void insertPersonAsync(Person person)throws Exception;
}
PersonDaoImp.java
package com.lidong.demo.realm;
import android.content.Context;
import java.util.List;
import io.realm.Realm;
/**
*
*@className:PersonDaoImpl
*@desc:
*@author:lidong
*@datetime:16/6/10 下午10:01
*/
public class PersonDaoImpl implements PersonDao {
private Context context;
private Realm mRealm;
public PersonDaoImpl(Context context){
mRealm = RealmUtil.getIntance(context).getRealm();
}
/**
* @同步插入使用者
* @param person
* @throws Exception
*/
@Override
public void insert(Person person) throws Exception {
mRealm.beginTransaction();
Person person1 = mRealm.copyToRealm(person);
mRealm.commitTransaction();
mRealm.close();
}
/**
* 擷取所有的使用者
*
* @return
* @throws Exception
*/
@Override
public List<Person> getAllPerson() throws Exception {
List<Person> mlist = null;
mlist = mRealm.where(Person.class).findAll();
mRealm.close();
return mlist;
}
/**
* @param person
* @throws Exception
*/
@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();
}
/**
* 異步插入Person
*
* @param person
* @throws Exception
*/
@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();
}
});
mRealm.close();//關閉Realm對象
}
}
4.5在Activity中簡單調用
package com.lidong.demo.realm;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.lidong.demo.R;
import java.util.List;
import io.realm.Realm;
public class DemoRealmActivity extends AppCompatActivity {
static final String TAG = DemoRealmActivity.class.getSimpleName();
Realm mRealm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo_realm);
// mRealm= RealmUtil.getIntance(this).getRealm();
//
//
// mRealm.executeTransaction(new Realm.Transaction() {
// @Override
// public void execute(Realm realm) {
// Person person = realm.createObject(Person.class);
// person.setName("李東");
// person.setAge(24);
// person.setCode(UUID.randomUUID().toString());
// }
// });
Person person = new Person();
person.setName("李東1");
person.setAge(28);
person.setCode("6e56d3aa-7119-429e-8c59-7ad8241e838d");
PersonDao dao = new PersonDaoImpl(this);
// try {
// dao.insert(person);
// } catch (Exception e) {
// e.printStackTrace();
// }
try {
dao.deletePerson("6e56d3aa-7119-429e-8c59-7ad8241e838d");
} catch (Exception e) {
e.printStackTrace();
}
try {
List<Person> persons = dao.getAllPerson();
Log.d(TAG, "onCreate: "+persons);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
總結:Android中使用Realm資料庫基本上就這幾點步驟,這是個入門,更加複雜的操作,我在後面會慢慢的深入。
代碼位址