Android數(shù)據(jù)庫(kù)選型

一、GreenDao和其他數(shù)據(jù)庫(kù)對(duì)比

1、GreenDao官方提供的和GreenDao ,OrmLite,ActiveAndroid三者的 性能對(duì)比

GreenDao和其他數(shù)據(jù)庫(kù)單位時(shí)間操作數(shù)據(jù)效率對(duì)比.png

通過(guò)對(duì)比,可以看到GreenDao無(wú)論在insert、update、query操作中效率都是最高的。

2、GreenDao和Realm性能對(duì)比(數(shù)據(jù)來(lái)源

分別操作1、10、100、1000、10000、100000條數(shù)據(jù)用時(shí).png

二、各個(gè)數(shù)據(jù)庫(kù)的優(yōu)缺點(diǎn)。

1、 Ormlite

優(yōu)點(diǎn):

1.輕量級(jí);
2.使用簡(jiǎn)單,易上手;
3.封裝完善;
4文檔完善,使用的項(xiàng)目比較多遇到問(wèn)題查找比較方便.

缺點(diǎn):

 基于注解和反射,方面效率會(huì)受到一些影響(不過(guò)要比直接使用SQL效率高)

2、GreenDao

優(yōu)點(diǎn):

  1、輕量(GreenDao核心類(lèi)庫(kù)只有100k左右)

  2、效率高、穩(wěn)定(github上一直在維護(hù)更新,現(xiàn)在GreenDao版本已經(jīng)更新到3.2.2)

  3、使用非常簡(jiǎn)單,上手快,可以自動(dòng)生成代碼

  4、支持?jǐn)?shù)據(jù)庫(kù)加密

  5、支持緩存(能夠?qū)⑹褂玫倪^(guò)的實(shí)體存在緩存中,下次使用時(shí)可以直接從緩存中取,這樣可以使性能提高N個(gè)數(shù)量級(jí))
 6、支持與rxjava結(jié)合使用

缺點(diǎn):

 文檔大部分是英文的

官方對(duì)GreenDao性能的描述: Of all ORMs we know, greenDAO is the fastest. greenDAO does not make any compromises regarding performance. Databases are great for storing lots of data, and thus speed matters. Using greenDAO, most entities can be inserted, updated and loaded at rates of several thousand entities per second.

集成過(guò)程:

【1】 在項(xiàng)目(project)的gradle中
// In your project build.gradle file:
buildscript {
   repositories {
      jcenter()
      mavenCentral() // add repository
   }
   dependencies {
        classpath 'com.android.tools.build:gradle:2.3.0'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
   }
}
【2】在應(yīng)用(Moudle)的gradle中
// In your app projects build.gradle file:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin

dependencies {
    compile 'org.greenrobot:greendao:3.2.2' // add library
}

配置數(shù)據(jù)庫(kù)的信息
 greendao {
      schemaVersion 1   // 版本號(hào) 升級(jí)數(shù)據(jù)庫(kù)可以配置
      daoPackage 'com.zgl.greentest.gen'  // 自動(dòng)生成的代碼的存放包名(可忽略)
      targetGenDir 'src/main/java'  // 自動(dòng)生成代碼的存放位置(可忽略)
}

使用:

  • 1.創(chuàng)建一個(gè)bean對(duì)象
    @Entity
    public class Shop{
        //表示為購(gòu)物車(chē)列表
        public static final int TYPE_CART = 0x01;
        //表示為收藏列表
        public static final int TYPE_LOVE = 0x02;
        //不能用int
        @Id(autoincrement = true)
        private Long id;
        //商品名稱(chēng)
        @Unique
        private String name;
        //商品價(jià)格
        @Property(nameInDb = "price")
        private String price;
        //已售數(shù)量
        private int sell_num;
        //圖標(biāo)url
        private String image_url;
        //商家地址
        private String address;
        //商品列表類(lèi)型
        private int type;
    }

注解含義: @Entity:告訴GreenDao該對(duì)象為實(shí)體,只有被@Entity注釋的Bean類(lèi)才能被dao類(lèi)操作 @Id:對(duì)象的Id,使用Long類(lèi)型作為EntityId,否則會(huì)報(bào)錯(cuò)。(autoincrement = true)表示主鍵會(huì)自增,如果false就會(huì)使用舊值 @Property:可以自定義字段名,注意外鍵不能使用該屬性 @NotNull:屬性不能為空 @Transient:使用該注釋的屬性不會(huì)被存入數(shù)據(jù)庫(kù)的字段中 @Unique:該屬性值必須在數(shù)據(jù)庫(kù)中是唯一值 @Generated:編譯后自動(dòng)生成的構(gòu)造函數(shù)、方法等的注釋?zhuān)崾緲?gòu)造函數(shù)、方法等不能被修改


  • 2.初始化greenDao
public class BaseApplication extends Application {
private static BaseApplication mBaseApplication;
private DaoSession mDaoSession;

@Override
public void onCreate() {
    super.onCreate();

    mBaseApplication = this;

    initDataBase();
}

public static BaseApplication instance(){
    return mBaseApplication;
}

// 初始化數(shù)據(jù)庫(kù)
private void initDataBase() {
    //創(chuàng)建數(shù)據(jù)庫(kù)shop.db"
    DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "shop.db", null);
    //獲取可寫(xiě)數(shù)據(jù)庫(kù)
    SQLiteDatabase db = helper.getWritableDatabase();
    //獲取數(shù)據(jù)庫(kù)對(duì)象
    DaoMaster daoMaster = new DaoMaster(db);
    //獲取Dao對(duì)象管理者
    daoSession = daoMaster.newSession();
}

public DaoSession getDaoSession() {
    return mDaoSession;
}
}
  • 3.數(shù)據(jù)庫(kù)增刪改查
private ShopDao mShopDao = GreenDaoManager.getInstance().getDaoSession().getBookEntityDao();
private Shop dogEntity = new Shop();

private void greenDaoQuery() {
    mShopDao.loadAll();
    mShopDao.queryBuilder().where(ShopEntityDao.Properties.Price.eq("10"));
}

private void greenDaoUpdate() {
    mShopDao.update(dogEntity);
}

private void greenDaoDelete() {
    mShopDao.deleteAll();
}

private void greenDaoInsert() {
    mShopDao.insert(dogEntity);
 }

GreenDao官網(wǎng)

3、Realm

Ream 不是在SQLite基礎(chǔ)上的ORM,它有自己的數(shù)據(jù)查詢(xún)引擎。所以支持跨平臺(tái),也更加高效

優(yōu)點(diǎn):

 1、支持跨平臺(tái)(Android,ios,swift)
 2、可視化比較好,realm提供了數(shù)據(jù)庫(kù)可視化工具
 3、效率高(插入和刪除數(shù)據(jù)比GreenDao還要快,但是刪除數(shù)據(jù)會(huì)比GreenDao稍慢一些)
 4、支持rxjava異步操作
 5、支持加密操作

集成過(guò)程:

 buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "io.realm:realm-gradle-plugin:3.1.3"
    }
 }
apply plugin: 'realm-android'

使用:

  • 1.創(chuàng)建一個(gè)bean

所有realm的bean都需要集成 RealmObject

eg:
public class User extends RealmObject {
    private String          name;  // realm的修飾符支持private public protect
    private int             age;

    @Ignore
    private int             sessionId;

    // Standard getters & setters generated by your IDE…
    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; }
    public int    getSessionId() { return sessionId; }
    public void   setSessionId(int sessionId) { this.sessionId = sessionId; }
}

注解: @PrimaryKey——表示該字段是主鍵 @Required——表示該字段非空 @Ignore——表示忽略該字段 被添加@Ignore標(biāo)簽后,存儲(chǔ)數(shù)據(jù)時(shí)會(huì)忽略該字段。 @Index——添加搜索索引 為字段添加搜索索引,這樣會(huì)使得插入的速度變慢,數(shù)據(jù)量也變得更大。不過(guò)在查詢(xún)速度將變得更快,建議只在優(yōu)化讀取性能的特定情況時(shí)添加索引

  • 2.初始化realm
    Realm.init(this);
    Realm mRealm = Realm.getDefaultInstance();

也可以配置realm的參數(shù)

  RealmConfiguration config = new RealmConfiguration.Builder() 
        .name("myrealm.realm") //文件名
        .schemaVersion(0) //版本號(hào)
        .build();
  Realm realm = Realm.getInstance(config);

當(dāng)使用完畢需要在ondestory()中關(guān)閉realm

@Override 
protected void onDestroy() { 
    super.onDestroy();
    // Close the Realm instance. 
    realm.close(); 
}
  • 3.增刪改查

插入數(shù)據(jù)

  realm.executeTransaction(new Realm.Transaction() {
     @Overrride
      public void execute(Realm realm) {
      Dog dog = realm.createObject(Dog.class);
      dog.name = "Fido";
      dog.age  = 5;
      }
  };

    也可以通過(guò)這種方式插入數(shù)據(jù):
    // Obtain a Realm instance
    realm.beginTransaction();
    User user = realm.createObject(User.class); // Create a new object
    user.setName("John");
    user.setEmail("john@corporation.com");
    realm.commitTransaction();

realm操作的速度比較快,所以對(duì)于少量數(shù)據(jù)在主線(xiàn)程中操作沒(méi)有太大影響,但是如果數(shù)據(jù)量大的話(huà)就需要在子線(xiàn)程中進(jìn)行了

  realm異步插入數(shù)據(jù):
    realm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm bgRealm) {
            User user = bgRealm.createObject(User.class);
            user.setName("John");
            user.setEmail("john@corporation.com");
        }
    }, new Realm.Transaction.OnSuccess() {
        @Override
        public void onSuccess() {
            // Transaction was a success.
        }
    }, new Realm.Transaction.OnError() {
        @Override
        public void onError(Throwable error) {
            // Transaction failed and was automatically canceled.
        }
    });

查詢(xún)

    RealmResults<User> userList = mRealm.where(User.class).findAll();

    異步查詢(xún)
    RealmResults<User> userList = mRealm.where(User.class)
          .equalTo("name", "Gavin")
          .findAllAsync();

    按條件查詢(xún)
    RealmResults<User> userList = mRealm.where(User.class)
     .equalTo("name", "Gavin").findAll();

    多條件查詢(xún)
    RealmResult<User> r = realm.where(User.class)
                       .not()
                       .in("name", new String[]{"Peter", "Jo"})
                       finalAll();

其他查詢(xún)條件 sum():對(duì)指定字段求和。 average():對(duì)指定字段求平均值。 min(): 對(duì)指定字段求最小值。 max() : 對(duì)指定字段求最大值。count : 求結(jié)果集的記錄數(shù)量。 findAll(): 返回結(jié)果集所有字段,返回值為RealmResults隊(duì)列 findAllSorted() : 排序返回結(jié)果集所有字段,返回值為RealmResults隊(duì)列 between(), greaterThan(),lessThan(), greaterThanOrEqualTo() & lessThanOrEqualTo() equalTo() & notEqualTo() contains(), beginsWith() & endsWith() isNull() & isNotNull() isEmpty()& isNotEmpty()

排序

    RealmResults<User> result = realm.where(User.class).findAll();
    result = result.sort("age"); // Sort ascending
    result = result.sort("age", Sort.DESCENDING);

刪除

 // obtain the results of a query
final RealmResults<Dog> results = realm.where(Dog.class).findAll();

// All changes to data must happen in a transaction
realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        // remove single match
        results.deleteFirstFromRealm();
        results.deleteLastFromRealm();

        // remove a single object
        Dog dog = results.get(5);
        dog.deleteFromRealm();

        // Delete all matches
        results.deleteAllFromRealm();
    }
});

有關(guān)realm的更多操作可以參見(jiàn)這里

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容