標籤:
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實踐