最近接触了一些开源的项目,项目中数据存储大多选用GreenDao框架,因此这次就来学习GreenDao的使用。GreenDAO是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操作关系型数据库,让操作数据库时更简单、更方便。
GreenDao对外提供的核心类有:
- DaoMaster:DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的Dao类。它具有静态方法来创建表或将他们删除。其内部类OpenHelper和DevOpenHelper是在SQLite数据库中创建模式的SQLiteOpenHelper实现。
- DaoSession:管理特定模式的所有可用Dao对象,还为实体提供了一些通用的持久性方法,如插入,加载,更新,刷新和删除。
- Dao:数据访问对象(Dao)持续存在并查询实体。对于每个实体,GreenDao生成一个Dao,它比DaoSession有更多的持久化方法。
- 实体:持久对象,通常实体是使用标准Java属性(如POJO或JavaBean)来表示数据库的对象。
使用方法如下:
- 首先是相关的环境配置:
修改 project 的 build.gradle:
修改app的build.gradle:
其中schemaVersion表示数据库schema版本;daoPackage表示设置相关Dao类(DaoMaster 、DaoSession、Dao)的包名;targetGenDir表示设置要生成DAO文件的目标工程的项目路径。 - 新建实体类
@Entity
public class Person {
@Id(autoincrement = true)
private Long id;
private String name;
private String sex;
}
然后点击:
就会自动生成很多东西:
实体类也会变成:
@Entity
public class Person {
@Id(autoincrement = true)
private Long id;
private String name;
private String sex;
@Generated(hash = 1401504130)
public Person(Long id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
@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 String getSex() {
return this.sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
新建一个Dao帮助类封装数据库操作类:里面包含增删改查四个操作
public class DaoHelper {
private DaoMaster.DevOpenHelper mDevOpenHelper;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
private PersonDao mPersonDao;
private static DaoHelper mDaoHelper;
private DaoHelper(Context context) {
mDevOpenHelper = new DaoMaster.DevOpenHelper(context.getApplicationContext(), "person.db",null);
mDaoMaster = new DaoMaster(mDevOpenHelper.getWritableDb());
mDaoSession = mDaoMaster.newSession();
mPersonDao = mDaoSession.getPersonDao();
}
public static DaoHelper getInstance(Context context){
if (mDaoHelper == null){
synchronized (DaoHelper.class){
if (mDaoHelper == null) {
mDaoHelper = new DaoHelper(context);
}
}
}
return mDaoHelper;
}
/**
* add
*/
public long insert(Person person) {
return mPersonDao.insert(person);
}
public void insertOrReplace(Person person) {
mPersonDao.insertOrReplace(person);
}
/**
* delete
*/
public void delete(String name){
mPersonDao.queryBuilder().where(PersonDao.Properties.Name.eq(name)).buildDelete().executeDeleteWithoutDetachingEntities();
}
/**
* update
*/
public void update(Person person){
Person old = mPersonDao.queryBuilder().where(PersonDao.Properties.Id.eq(person.getId())).build().unique();
if(old!=null){
old.setName("iris");
mPersonDao.update(old);
}
}
/**
* query
*/
public List<Person> searchByWhere(String name){
List<Person> personInfors = (List<Person>) mPersonDao.queryBuilder().where(PersonDao.Properties.Name.eq(name)).build().unique();
return personInfors;
}
public List<Person> searchAll(){
List<Person> personInfors = mPersonDao.queryBuilder().list();
return personInfors;
}
}
最后MainActivity:
public class MainActivity extends AppCompatActivity {
private Button add,delete,update,query;
private DaoHelper daoHelper;
private TextView textView;
private Person person1,person2,person3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
daoHelper = DaoHelper.getInstance(MainActivity.this);
initviews();
initdata();
event();
}
private void initdata() {
person1 = new Person(1L,"张三","男");
person2 = new Person(2L,"李四","女");
person3 = new Person(3L,"王五","男");
}
private void initviews() {
add = findViewById(R.id.add);
delete = findViewById(R.id.delete);
update = findViewById(R.id.update);
query = findViewById(R.id.query);
textView = findViewById(R.id.textview);
}
private void event() {
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
daoHelper.insertOrReplace(person1);
daoHelper.insertOrReplace(person2);
daoHelper.insertOrReplace(person3);
showDataList();
}
});
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
daoHelper.delete("张三");
showDataList();
}
});
update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
daoHelper.update(person2);
showDataList();
}
});
query.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showDataList();
}
});
}
private void showDataList() {
StringBuilder sb = new StringBuilder();
List<Person> personInfors = daoHelper.searchAll();
for(Person person:personInfors){
sb.append("id:").append(person.getId()).append(" name:").append(person.getName()).append(" sex:").append(person.getSex()).append("\n");
}
textView.setText(sb.toString());
}
}
效果如下:
add:
delete:
update:
参考:
GreenDao使用总结
GreenDao 3.0使用