GreenDao 介绍:
GreenDao是ORM框架(Object Relation Mapping对象关系映射),能够提供一个接口通过操作对象的方式去操作关系型数据库,它能够让你操作数据库时更简单、更方便,表现形式就是通过GreenDao将数据库和Bean对象关联起来
比较主流的几个ORM框架分别是GreenDao,OrmLite,ActiveAndroid,又兴趣可以了解下,因为据我了解GreenDao对数据库操作的速度是最快的,所以其他两个我只是知道,并没有去了解
GreenDao优点:存取速度快.支持数据库加密.轻量级.激活实体.支持缓存.代码自动生成
想看看源码什么的,可以参考:
官网地址:http://greenrobot.org/greendao/
github:https://github.com/greenrobot/greenDAO
GreenDao3.2的配置:
<1>需要在工程根目录的build.gradle中添加依赖
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
}
}
<2>在项目app的build.gradle中添加依赖
apply plugin: 'com.android.application'
//使用greendao
apply plugin: 'org.greenrobot.greendao'
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.project.gubipproject"
minSdkVersion 22
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
greendao {
//版本号,升级时可配置
schemaVersion 1
//这里可以指定编译成功后(DaoMaster、DaoSession、DAOS类)的文件目录,可以不指定
//daoPackage '你的包名.你的文件目录'
//targetGenDir 'src/main/java'
}
}
dependencies {
api fileTree(include: ['*.jar'], dir: 'libs')
testImplementation 'junit:junit:4.12'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
api 'com.android.support:appcompat-v7:27.1.1'
api 'com.android.support.constraint:constraint-layout:1.1.0'
api 'com.android.support:support-v4:27.1.1'ign:27.1.1'
//greendao依赖
api 'org.greenrobot:greendao:3.2.2'
}
然后就是GreenDao的使用了:
我感觉比较常用的可能保存历史记录之类的,这里就弄个数据列表吧
<1>创建Bean对象(表名和字段名)
GreenDao需要创建Bean对象之后,该Bean对象就是表名,而它的属性值就是字段名,其实现是通过注释的方式来实现的,下面是购物车的Bean对象(每个Bean对象对应一张表)
这里对Bean对象的注释进行解释
@Entity:告诉GreenDao该对象为实体,只有被@Entity注释的Bean类才能被dao类操作
@Id:对象的Id,使用Long类型作为EntityId,否则会报错。(autoincrement = true)表示主键会自增,如果false就会使用旧值
@Property:可以自定义字段名,注意外键不能使用该属性
@NotNull:属性不能为空
@Transient:使用该注释的属性不会被存入数据库的字段中
@Unique:该属性值必须在数据库中是唯一值
@Generated:编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改
@Entity
public class DataList{
//不能用int(@Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长)
@Id(autoincrement = true)
private Long id;
@Property
private String title; //标题
private String content; //内容
private String image_url; //缩略图
}
创建完成之后,我们只需要Rebulid Project 来完成我们的代码自动生成,自动生成的代码有:
Bean实体的构造方法和get、set方法
DaoMaster、DaoSession、DAOS类
<2>GreenDao数据库创建以及初始化:
/**
* 在Application中进行创建和配置
*/
public class BaseApplication extends Application {
private static DaoSession daoSession;
@Override
public void onCreate() {
super.onCreate();
//配置数据库
setupDatabase();
}
/**
* 配置数据库
*/
private void setupDatabase() {
//创建数据库 ,"datalist.db"为表名
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "datalist.db", null);
//获取可写数据库
SQLiteDatabase db = helper.getWritableDatabase();
//获取数据库对象
DaoMaster daoMaster = new DaoMaster(db);
//获取Dao对象管理者
daoSession = daoMaster.newSession();
}
public static DaoSession getDaoInstant() {
return daoSession;
}
}
记住BaseApplication必须要在清单配置文件中声明哦!
<application
android:name=".base.BaseApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
GreenDao的创建非常的简洁,编译后会自动将Bean对象创建成表,不再需要手写SQL语句,这里的数据库创建只需要在Application中执行一次即可,这里对几个类进行解释:
DevOpenHelper:创建SQLite数据库的SQLiteOpenHelper的具体实现
DaoMaster:GreenDao的顶级对象,作为数据库对象、用于创建表和删除表
DaoSession:管理所有的Dao对象,Dao对象中存在着增删改查等API
我们已经创建好了DaoSession和DataList的Bean对象,编译后会自动生成我们的DataListDao对象,可通过DaoSession获得
DataListDao data = daoSession.getDataListDao();
这里的Dao(Data Access Object)指数据访问接口,即提供了数据库操作一些API接口,可通过dao进行增删改查操作
<3>数据库的增删改查基本操作
public class DataListDao {
/**
* 添加数据,如果有重复则覆盖
* @param datalist
*/
public static void insertData(DataList datalist) {
BaseApplication.getDaoInstant().getDataListDao().insertOrReplace(datalist);
}
/**
* 删除数据 根据id删除
* @param id
*/
public static void deleteData(long id) {
BaseApplication.getDaoInstant().getDataListDao().deleteByKey(id);
}
/**
* 删除所有数据
* @param id
*/
public static void deleteTokenAll() {
MyAppliaction.getDaoInstant().getDataListDao().deleteAll();
}
/**
* 更新数据
* @param datalist
*/
public static void updateData(DataList datalist) {
BaseApplication.getDaoInstant().getDataListDao().update(datalist);
}
/**
* 查询全部数据
*/
public static List<DataList> queryAll() {
return BaseApplication.getDaoInstant().getDataListDao().loadAll();
}
/**
* 查询表中是否含某条数据(比如我们现在要看看有没存在一个条件为title的数据)
*/
public static boolean queryTokenid(String title) {
List<DataList> list =BaseApplication.getDaoInstant().getDataListDao().queryBuilder()
.where(DataListDao.Properties.Title.eq(title)).list();
if (list != null && list.size() != 0) {
return true;
}
return false;
}
}
这里先做个记录,有空补上demo,见谅