GreenDao
介绍
配置
1.在项目目录下build.gradle下添加插件
- 文件位置
- 添加插件代码
dependencies {
...
classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
2.在app目录下的build.gradle下添加插件依赖
- 文件位置
- 添加插件依赖代码
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao'
老版本是以上方式,新版本是下面这种方式
plugins {
id 'com.android.application'
id 'org.greenrobot.greendao'
}
- 再继续添加依赖库
dependencies {
...
implementation 'org.greenrobot:greendao:3.3.0' // add library
}
- 继续初始化GreenDao版本配置
...
}
greendao{
schemaVersion 1 // 数据库版本号 每次升级数据库都需要改变版本,只能增加
daoPackage 'com.fhy.greendao' // 设置DaoMaster、DaoSession、xxxDao包名
targetGenDir 'src/main/java' // 设置DaoMaster、DaoSession、xxxDao目录
}
dependencies {
...
创建实例类
@Entity(nameInDb = "Person")
// Entity是GreenDao的实体注解(用于标识当前实体需要GreenDao生成代码)
// 表格名默认是实体类名,如果加上@Entity(nameInDb = "Person")
// generateConstructors 和 generateGettersSetters 默认为true,标识自动生成构造器和getter and setter方法。
public class Person {
@Id(autoincrement = true)//设置自增长
//@Id表示主键id,对应数据表中的Id字段,括号中表示自增长,注意是Long,不是long类型。
private Long id;
@Property(nameInDb = "Name")
// 作为表的列名,nameInDbnameInDb可以指定特定字段名,不写默认为变量名。
@Index(unique = true)
// 设置唯一性,即不能出现相同的名字
private String name;
private int age;
}
自动生成实体类代码
- 写完上述代码,直接 Make Project
- 自动生成Person类的 构造器 和 getter and setter 方法。
- 然后在 src/main/java目录下可以看到包名为com.fhy.greendao的三个文件,分为为:DaoMaster、DaoSession、xxxDao。
- 自动生成的代码如下:
@Entity(nameInDb = "Person")
// Entity是GreenDao的实体注解(用于标识当前实体需要GreenDao生成代码)
// 表格名默认是实体类名,如果加上@Entity(nameInDb = "Person")
// generateConstructors 和 generateGettersSetters 默认为true,标识自动生成构造器和getter and setter方法。
public class Person {
@Id(autoincrement = true)//设置自增长
//@Id表示主键id,对应数据表中的Id字段,括号中表示自增长,注意是Long,不是long类型。
private Long id;
@Property(nameInDb = "Name")
// 作为表的列名,nameInDbnameInDb可以指定特定字段名,不写默认为变量名。
@Index(unique = true)
// 设置唯一性,即不能出现相同的名字
private String name;
private int age;
@Generated(hash = 1145075130)
public Person(Long id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Generated(hash = 1024547259)
public Person() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
}
操作数据库
创建数据库并获得三个核心对象
public class MainActivity extends AppCompatActivity {
private DaoMaster.DevOpenHelper helper;
private SQLiteDatabase db;
private DaoMaster master;
private DaoSession session;
private PersonDao personDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建数据库
helper = new DaoMaster.DevOpenHelper(MainActivity.this,"FhyDatabase.db",null);
db = helper.getWritableDatabase();
// 获得DaoMaster对象mastere
master = new DaoMaster(db);
// 获得DaoSession对象session
session = master.newSession();
// 获得PersonDao对象personDao
personDao = session.getPersonDao();
}
}
- 利用adb命令查询数据库FhyDatabase,结果如下所示,说明创建成功,数据库中有Person表,并获得建表命令。
1|root@generic_x86:/data/data/com.example.greendaotest/databases # ls
ls
FhyDatabase
FhyDatabase.db
FhyDatabase.db-journal
root@generic_x86:/data/data/com.example.greendaotest/databases # sqlite3 FhyDatabase.db
qlite3 FhyDatabase.db <
SQLite version 3.8.6 2014-08-15 11:46:33
Enter ".help" for usage hints.
sqlite> .table
.table
Person android_metadata
sqlite> .schema
.schema
CREATE TABLE android_metadata (locale TEXT);
CREATE TABLE "Person" ("_id" INTEGER PRIMARY KEY AUTOINCREMENT ,"Name" TEXT,"AGE" INTEGER NOT NULL );
CREATE UNIQUE INDEX IDX_Person_Name ON "Person" ("Name" ASC);
sqlite>
添加数据
- 代码:
// 添加数据
private void insertData(){
// 创建Person对象
Person person1 = new Person(1L,"fhy",22);
Person person2 = new Person(2L,"xiaoming",23);
personDao.insert(person1);
personDao.insert(person2);
}
- adb查询
sqlite> select * from Person;
select * from Person;
1|fhy|22
2|xiaoming|23
sqlite>
查询数据
- 代码
// 查询数据
private void queryData(){
List<Person> list = personDao.queryBuilder().list();
for(Person person : list){
Log.d("person",person.toString());
}
}
- 日志表
更新数据
- 代码
// 更新数据
private void updateData(){
// 先获取Person表的第二条数据
List<Person> list = personDao.queryBuilder().list();
Person originPerson = list.get(1);
// 更新数据
originPerson.setName("xiaowang");
personDao.insertOrReplace(originPerson);
// 继续打印出来
List<Person> list2 = personDao.queryBuilder().list();
for(Person person : list2){
Log.d("person",person.toString());
}
}
- 日志表,看出来替换成功
删除数据
- 代码
private void deleteData(){
// 先获取Person表的第一条数据
List<Person> list = personDao.queryBuilder().list();
Person originPerson = list.get(0);
// 删除数据
personDao.delete(originPerson);
// 继续打印出来
List<Person> list2 = personDao.queryBuilder().list();
for(Person person : list2){
Log.d("person",person.toString());
}
}
- 日志表,删除成功,只剩下第二条数据。