背景:昨天去面试的时候被面试官问了一个这样的问题。
面试官:你在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创建的数据库是这样的:
好了,现在两种数据库的配置都完成了,就是通过数据来验证他们效率了。
在这次测试中,都以1W条数据来测试(实际项目中我相信应该不会有这么多的,毕竟移动端),而且他们测试的bean对象里面的内容都是一样的。
这次对比的主界面是这样的:
现在我们先来插入数据:
litepal的插入数据:
public void litepalInsert(View view) {
List 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) { ListuserList = 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查询数据:
public void litepalQuery(View view) {
long startTime = System.currentTimeMillis();
List 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(); Listdatas = mUserDao.queryBuilder().list(); Log.e(TAG, "greenDaoQuery: ====>"+datas.size()); long endTime = System.currentTimeMillis(); long takeTime = endTime - startTime; tvGreenDaoQueryTime.setText(takeTime+"ms"); }
看看对比时间:
我们现在来看看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 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更新之后的数据:
发现都更新成功了,说明这些操作都是有效的,
最后我们来试试删除功能,将数据库中的数据全部清除掉:
此时再去查看数据库,数据全部清空,也就是说删除数据也是有效的。
现在,增删改查动作我们都做过了,我们对比下他们之前的差别,对于新增跟查询来说,greendao是完爆litepal的,但是修改动作,litepal又是完爆greendao的,他们之间的删除时间是差不多的。
我们再看看这两个库在打包完app之后所占用的size:
最后我们再看看对于100条数据的测试效果:
总结:
在数据比较多的情况下:
1.对于新增或者查询比较频繁的,但是修改不是那么频繁的,建议选择greendao。
2.对于修改频繁的,但是新增与查询不那么频繁的,建议选择litepal。
3.如果增删改查动作都频繁的话,看个人选择。
在数据比较小的话(测试中是100条):就是插入时间相差一点,其他都比较接近,但是总的来说,小量的数据,操作时间都不是很久,所以怎么选择,还是看项目中所涉及到的数据量。
如文章有误,请各位看官指正,谢谢!!