LitePal与GreenDao你会选择哪一个

背景:昨天去面试的时候被面试官问了一个这样的问题。

        面试官:你在app中使用了什么数据库?

        我:我用的是LitePal

        面试官:你为什么选择用他,而不用其他的数据库,为什么不用GreenDao?

        我:对litepal比较熟,对greendao不是很熟,也不是那么了解,怕出问题不好解决。

在回答完之后我就知道这个会给负印象分了。所以今天赶紧进来试试这两者的区别,也算是一个笔记吧。

       首先是准备两个数据库的环境,对于litepal环境就不进行介绍了,比较方便。来看看greenDao的配置:

在project的build中配置如下:

repositories {
        google()
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.3'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

这里主要就是这个mavenCentral()以及classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2',然后是module的build中的配置:

apply plugin: 'org.greenrobot.greendao'

以及

android {
    compileSdkVersion 28

    greendao {
        schemaVersion 1//数据库版本号
        daoPackage 'com.molin.sqlitetest.greendao'//设置DaoMaster、DaoSession、Dao包名
        targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录
        //targetGenDirTest:设置生成单元测试目录
        //generateTests:设置自动生成单元测试用例
    }

    defaultConfig {
        applicationId "com.molin.sqlitetest"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

}

在第二部分中主要注意添加greendao这一部分,然后在dependencies中添加

implementation 'org.greenrobot:greendao:3.2.2'

接着就是创建要保存到数据库的bean对象,在这里我用user来做例子:

@Entity
public class User {
    //@Id:主键,通过这个注解标记的字段必须是Long类型的,这个字段在数据库中表示它就是主键,并且它默认就是自增的
    @Id(autoincrement = true)
    private Long id;

    @NotNull    // @NotNull 设置数据库表当前列不能为空
    @Unique  //唯一
    private String name;

    //@Property:设置一个非默认关系映射所对应的列名,默认是使用字段名,例如:@Property(nameInDb = "name")
    @Property(nameInDb = "userage")
    private int age;
}

然后build该module,最后就是在appliction中的设置了:

public class App extends Application {
    private static final String DB_NAME = "app.db";
    private static DaoSession mDaoSession;
    @Override
    public void onCreate() {
        super.onCreate();
        LitePal.initialize(this);
        initGreenDao();
    }

    private void initGreenDao() {
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, DB_NAME);
        SQLiteDatabase db = helper.getWritableDatabase();
        DaoMaster daoMaster = new DaoMaster(db);
        mDaoSession = daoMaster.newSession();
    }

    public static DaoSession getmDaoSession() {
        return mDaoSession;
    }
}

在这里忽略掉litepal的配置,其他的就是greendao的配置了。总的来说配置起来不是很麻烦,但是相比litepal来说还是比较复杂一点点。另外提一点,在该项目中litepal创建的数据库是这样的:

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value="litepal" />
    <version value="1" />
    <list>
        <mapping class="com.molin.sqlitetest.bean.User1"/>
    </list>
</litepal>

好了,现在两种数据库的配置都完成了,就是通过数据来验证他们效率了。

在这次测试中,都以1W条数据来测试(实际项目中我相信应该不会有这么多的,毕竟移动端),而且他们测试的bean对象里面的内容都是一样的。

这次对比的主界面是这样的:

LitePal与GreenDao你会选择哪一个

现在我们先来插入数据:

litepal的插入数据:

public void litepalInsert(View view) {
        List<User1> userList = new ArrayList<>();
        for (int i = 0; i < 10000; i++) {
            User1 user = new User1();
            user.setAge(i+1);
            user.setId((long)(1000000000+i));
            user.setName("lml"+i);
            userList.add(user);
        }
        long startTime = System.currentTimeMillis();
        LitePal.saveAll(userList);
        long endTime = System.currentTimeMillis();
        long takeTime = endTime - startTime;
        tvLitepalInsertTime.setText(takeTime+"");
    }

greendao插入数据:

public void greenDaoInsert(View view) {
    List<User> userList = new ArrayList<>();
    for (int i = 0; i < 10000; i++) {
        User user = new User();
        user.setAge(i+1);
        user.setId((long)(1000000000+i));
        user.setName("lml"+i);
        userList.add(user);
    }
    long startTime = System.currentTimeMillis();
    mUserDao.insertInTx(userList);
    long endTime = System.currentTimeMillis();
    long takeTime = endTime - startTime;
    tvGreenDaoInsertTime.setText(takeTime+"");
}

看看对比的时间:

LitePal与GreenDao你会选择哪一个

litepal查询数据:

public void litepalQuery(View view) {
        long startTime = System.currentTimeMillis();
        List<User1> datas = LitePal.findAll(User1.class);
        Log.e(TAG, "litepalQuery: ====>"+datas.size());
        long endTime = System.currentTimeMillis();
        long takeTime = endTime - startTime;
        tvLitepalQueryTime.setText(takeTime+"ms");
    }

greendao查询数据:

public void greenDaoQuery(View view) {
    long startTime = System.currentTimeMillis();
    List<User> datas = mUserDao.queryBuilder().list();
    Log.e(TAG, "greenDaoQuery: ====>"+datas.size());
    long endTime = System.currentTimeMillis();
    long takeTime = endTime - startTime;
    tvGreenDaoQueryTime.setText(takeTime+"ms");
}

看看对比时间:

LitePal与GreenDao你会选择哪一个

我们现在来看看litepal插入到数据库中的数据:

LitePal与GreenDao你会选择哪一个

greendao插入到数据库中的数据:

LitePal与GreenDao你会选择哪一个

现在我们来更新数据:

litePal更新:

public void litepalUpdate(View view) {
        ContentValues contentValues = new ContentValues();
        contentValues.put("name","xx");
        long startTime = System.currentTimeMillis();
        LitePal.updateAll(User1.class,contentValues);
        long endTime = System.currentTimeMillis();
        long takeTime = endTime - startTime;
        tvLitepalUpdateTime.setText(takeTime+"ms");
    }

greendao更新:

public void greenDaoUpdate(View view) {
        List<User> datas = mUserDao.queryBuilder().list();
        for (User data : datas) {
            data.setAge(18);
        }
        long startTime = System.currentTimeMillis();
        mUserDao.updateInTx(datas);
        long endTime = System.currentTimeMillis();
        long takeTime = endTime - startTime;
        tvGreenDaoUpdateTime.setText(takeTime+"ms");
    }

看看对比时间:

LitePal与GreenDao你会选择哪一个

我们再去看看数据库中的数据,看看有没有更新成功:

litepal更新之后的数据:

LitePal与GreenDao你会选择哪一个

greendao更新之后的数据:

LitePal与GreenDao你会选择哪一个

发现都更新成功了,说明这些操作都是有效的,

最后我们来试试删除功能,将数据库中的数据全部清除掉:

LitePal与GreenDao你会选择哪一个

此时再去查看数据库,数据全部清空,也就是说删除数据也是有效的。

现在,增删改查动作我们都做过了,我们对比下他们之前的差别,对于新增跟查询来说,greendao是完爆litepal的,但是修改动作,litepal又是完爆greendao的,他们之间的删除时间是差不多的。

我们再看看这两个库在打包完app之后所占用的size:

LitePal与GreenDao你会选择哪一个

最后我们再看看对于100条数据的测试效果:

LitePal与GreenDao你会选择哪一个

总结:

在数据比较多的情况下:

1.对于新增或者查询比较频繁的,但是修改不是那么频繁的,建议选择greendao。

2.对于修改频繁的,但是新增与查询不那么频繁的,建议选择litepal。

3.如果增删改查动作都频繁的话,看个人选择。

在数据比较小的话(测试中是100条):就是插入时间相差一点,其他都比较接近,但是总的来说,小量的数据,操作时间都不是很久,所以怎么选择,还是看项目中所涉及到的数据量。

如文章有误,请各位看官指正,谢谢!!