官方Api: http://greenrobot.org/greendao/
介绍:
greenDAO是一个开源的Android ORM,使SQLite数据库的开发再次变得有趣。它减轻了开发人员处理低级数据库需求的同时节省了开发时间。SQLite是一个很棒的嵌入式关系数据库。尽管如此,编写SQL和解析查询结果仍然是一项非常繁琐且耗时的任务。greenDAO通过将Java对象映射到数据库表(称为ORM,“对象/关系映射”)将您从这些中解放出来。这样,您可以使用简单的面向对象的API来存储,更新,删除和查询Java对象。
为什么使用GreenDao:
最高性能(可能是Android上最快的ORM); 我们的基准也是开源的
易于使用的强大API,涵盖关系和连接
最小的内存消耗
小库大小(<100KB)以保持较低的构建时间并避免65k方法限制
数据库加密:greenDAO支持SQLCipher,以确保用户的数据安全
强大的社区:超过5000个GitHub明星表明有一个强大而活跃的社区
开始配置:
1.在根build.gradle中进行配置
repositories {
...
mavenCentral()//添加存储库
}
dependencies {
...
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
...
}
2.在module的build.gradle中进行配置
//2.1放到最外层
apply plugin: 'org.greenrobot.greendao'
//2.2
greendao {
schemaVersion 1//数据库版本号
daoPackage 'com.wjh.greendao.gd'//设置DaoMaster、DaoSession、Dao包名
targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录
//targetGenDirTest:设置生成单元测试目录
//generateTests:设置自动生成单元测试用例
}
//2.3添加依赖
dependencies {
...
//2.1添加依赖
implementation 'org.greenrobot:greendao:3.2.2'
}
创建bean
@Entity
public class Student {
@Id(autoincrement = true)//id自增
private Long id;//学院id
@Index(unique = true)//唯一性
private String no; //学生编号
private String name;//学生姓名
private String sex ;//学生性别
private String score; //学生成绩
写到这一步需要点击
会自动生成下面的数据
@Entity
public class Student {
@Id(autoincrement = true)//id自增
private Long id;//学院id
@Index(unique = true)//唯一性
private String no; //学生编号
private String name;//学生姓名
private String sex ;//学生性别
private String score; //学生成绩
@Generated(hash = 1292949398)
public Student(Long id, String no, String name, String sex, String score) {
this.id = id;
this.no = no;
this.name = name;
this.sex = sex;
this.score = score;
}
@Generated(hash = 1556870573)
public Student() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getNo() {
return this.no;
}
public void setNo(String no) {
this.no = no;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return this.sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getScore() {
return this.score;
}
public void setScore(String score) {
this.score = score;
}
}
这个目录是刚才配置的时候写的目录要是不写路径的话会默认到gradle中
相关的注解说明:
实体@Entity注解
schema:告知GreenDao当前实体属于哪个schema
active:标记一个实体处于活跃状态,活动实体有更新、删除和刷新方法
nameInDb:在数据库中使用的别名,默认使用的是实体的类名
indexes:定义索引,可以跨越多个列
createInDb:标记创建数据库表
基础属性注解
@Id:主键 Long 型,可以通过@Id(autoincrement = true)设置自增长
@Property:设置一个非默认关系映射所对应的列名,默认是使用字段名,例如:@Property(nameInDb = "name")
@NotNull:设置数据库表当前列不能为空
@Transient:添加此标记后不会生成数据库表的列
索引注解
@Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
@Unique:向数据库添加了一个唯一的约束
关系注解
@ToOne:定义与另一个实体(一个实体对象)的关系
@ToMany:定义与多个实体对象的关系
ok在我们配置好环境以及Bean类的话,下面就开始进入主代码:增、删、改、查
首先就是初始化,最好在Application中配置,一次配置全局调用
/**
* date:2018/11/29
* author:辉(家辉辉辉)
* function:初始化数据库
*/
public class MyApplication extends Application {
//数据库名
private static final String DATA_NAME = "stu.db";
private static DaoSession mDaoSession;
@Override
public void onCreate() {
super.onCreate();
setupDataBase(this);
}
//初始化GreenDao
private void setupDataBase(Context context){
//创建数据表
DaoMaster.DevOpenHelper openHelper = new DaoMaster.DevOpenHelper(context, DATA_NAME, null);
Database db = openHelper.getWritableDb();
DaoMaster daoMaster = new DaoMaster(db);
//获取数据库dao
mDaoSession = daoMaster.newSession();
}
//返回操作数据库的对象
public static DaoSession getDataSession(){
return mDaoSession;
}
}
重要的一步就是去清单文件上面注册
MainActivity代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView title;
private Button add;
private Button remove;
private Button update;
private Button query;
private DaoSession mDaoSession;
private Student mStudent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
initView();
//获取数据库操作对象
mDaoSession = MyApplication.getDataSession();
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.add://添加
//通过有参向student赋值
mStudent = new Student(null, "灰灰", "男", "87.5");
try {
//添加
mDaoSession.getStudentDao().insert(mStudent);
} catch (Exception e) {
title.setText("插入失败");
}
Toast.makeText(this, "增加成功", Toast.LENGTH_SHORT).show();
break;
case R.id.remove://删除
/*deleteBykey(Long key) :根据主键删除一条记录。
delete(User entity) :根据实体类删除一条记录,一般结合查询方法,查询出一条记录之后删除。
deleteAll(): 删除所有记录。*/
try {
mDaoSession.getStudentDao().deleteAll();
} catch (Exception e) {
title.setText("删除失败");
}
Toast.makeText(this, "删除成功", Toast.LENGTH_SHORT).show();
break;
case R.id.update://修改
try {
//重新设置name的值
mStudent.setName("小辉辉");
mDaoSession.getStudentDao().update(mStudent);
} catch (Exception e) {
title.setText("更新数据失败");
}
Toast.makeText(this, "修改成功", Toast.LENGTH_SHORT).show();
break;
case R.id.query://查询
/*loadAll():查询所有记录
load(Long key):根据主键查询一条记录
queryBuilder().list():返回:List
queryBuilder().where(UserDao.Properties.Name.eq("")).list():返回:List
queryRaw(String where,String selectionArg):返回:List*/
//查询全部
List<Student> students = mDaoSession.getStudentDao().loadAll();
//获取name可以加for循环
String name = students.get(0).getName();
Toast.makeText(this, ""+name, Toast.LENGTH_SHORT).show();
break;
}
}
//初始化控件
private void initView() {
title = findViewById(R.id.title);
add = findViewById(R.id.add);
remove = findViewById(R.id.remove);
update = findViewById(R.id.update);
query = findViewById(R.id.query);
add.setOnClickListener(this);
remove.setOnClickListener(this);
update.setOnClickListener(this);
query.setOnClickListener(this);
}
}