版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shineflowers/article/details/53405644
我相信,在平时的开发过程中,大家一定会或多或少地接触到SQLite。然而在使用它时,我们往往需要做许多额外的工作,像编写SQL语句与解析查询结果等。所以,适用于Android ORM框架也就孕育而生了,现在市面上主流的框架有OrmLite、SugarORM、Active Android、Realm与GreenDAO。今天主要来讲一下GreenDAO 3.0G后的版本是怎么在Android Studio上配置的。
简单的讲,GreenDAO是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案。(greenDAO is a light & fast ORM solution that maps objects to SQLite databases.) 。
一、配置方法
1.直接开始配置,首先找到这个Library,如下图:
2. 找到相应Module的build.gradle文件,添加的下面的内容:
说明:第三步配置的是生成的数据库操作模板代码的路径。
3.找到Project的build.gradle文件,添加下面的内容:
至此 配置就完成了,下来就开始生成数据库并使用。
二、生成数据库操作DAO代码
1.在项目中新建一个表字段的实体类,不需要自己写get和set方法,在生成表的时候会自动生成。不要忘了在类名上标记@Entity注解如图:
2.选择build ——Make Project 一切顺利的话则会在包名下生成数据库的操作类,如下图:
三、使用方法
数据库的操作包括增删改改查,方法如下:
- package com.jackie.greendao;
- import android.os.Bundle;
- import android.support.v7.app.AppCompatActivity;
- import android.view.View;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.ListView;
- import java.util.List;
- public class MainActivity extends AppCompatActivity implements View.OnClickListener {
- private EditText mName, mAge;
- private Button mAdd;
- private ListView mListView;
- private DaoMaster.DevOpenHelper mDevOpenHelper;
- private DaoMaster mDaoMaster;
- private DaoSession mDaoSession;
- private PersonDao mPersonDao;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- initView();
- initEvent();
- openDb();
- }
- private void initView() {
- mName = (EditText) findViewById(R.id.name);
- mAge = (EditText) findViewById(R.id.age);
- mAdd = (Button) findViewById(R.id.add);
- mListView = (ListView) findViewById(R.id.list_view);
- }
- private void initEvent() {
- mAdd.setOnClickListener(this);
- }
- private void openDb() {
- mDevOpenHelper = new DaoMaster.DevOpenHelper(this, "person.db", null);
- mDaoMaster = new DaoMaster(mDevOpenHelper.getWritableDb());
- mDaoSession = mDaoMaster.newSession();
- mPersonDao = mDaoSession.getPersonDao();
- }
- //插入
- public void insert() {
- Person person = new Person(Long.valueOf(1), mName.getText().toString(),
- Integer.parseInt(mAge.getText().toString()));
- mPersonDao.insert(person);
- mName.setText("");
- mAge.setText("");
- }
- public void delete(Person person) {
- mPersonDao.delete(person);
- }
- //更新
- public void update(Person person) {
- mPersonDao.insertOrReplace(person);
- }
- //查询
- public void query() {
- List<Person> persons = mPersonDao.queryBuilder().list();
- }
- @Override
- public void onClick(View view) {
- switch (view.getId()) {
- case R.id.add:
- insert();
- break;
- }
- }
- }
package com.jackie.greendao;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText mName, mAge;
private Button mAdd;
private ListView mListView;
private DaoMaster.DevOpenHelper mDevOpenHelper;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
private PersonDao mPersonDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initEvent();
openDb();
}
private void initView() {
mName = (EditText) findViewById(R.id.name);
mAge = (EditText) findViewById(R.id.age);
mAdd = (Button) findViewById(R.id.add);
mListView = (ListView) findViewById(R.id.list_view);
}
private void initEvent() {
mAdd.setOnClickListener(this);
}
private void openDb() {
mDevOpenHelper = new DaoMaster.DevOpenHelper(this, "person.db", null);
mDaoMaster = new DaoMaster(mDevOpenHelper.getWritableDb());
mDaoSession = mDaoMaster.newSession();
mPersonDao = mDaoSession.getPersonDao();
}
//插入
public void insert() {
Person person = new Person(Long.valueOf(1), mName.getText().toString(),
Integer.parseInt(mAge.getText().toString()));
mPersonDao.insert(person);
mName.setText("");
mAge.setText("");
}
public void delete(Person person) {
mPersonDao.delete(person);
}
//更新
public void update(Person person) {
mPersonDao.insertOrReplace(person);
}
//查询
public void query() {
List<Person> persons = mPersonDao.queryBuilder().list();
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.add:
insert();
break;
}
}
}
四、查询功能
GreeDAO提供了各种各种的查询API,参见http://greenrobot.org/greendao/documentation/queries/
如果需要在控制台查看GreenDao是怎么拼装SQL语句的,在OnCreate()方法中打开下面的开关:
五、条件查询
- //查询所有数据
- public void queryAll() {
- List<Person> persons = mPersonDao.queryBuilder().list();
- }
- //eq: equal 精确查询 名字等于jackie
- public void queryEq() {
- Person person = mPersonDao.queryBuilder().where(PersonDao.Properties.Name.eq("jackie")).unique();
- }
- //notEq: not equal 精确查询 名字不等于jackie
- public void queryNotEq() {
- Person person = mPersonDao.queryBuilder().where(PersonDao.Properties.Name.notEq("jackie")).unique();
- }
- //like 模糊查询 名字以jackie开头
- public void queryLike() {
- Person person = mPersonDao.queryBuilder().where(PersonDao.Properties.Name.like("jackie")).unique();
- //通配符
- List<Person> persons = mPersonDao.queryBuilder().where(PersonDao.Properties.Name.like("jackie%")).list();
- }
- //between 区间查询 年龄在20到30之间
- public void queryBetween() {
- List<Person> persons = mPersonDao.queryBuilder().where(PersonDao.Properties.Age.between(20, 30)).list();
- }
- //gt: greater than 半开区间查询,年龄大于18
- public void queryGt() {
- List<Person> persons = mPersonDao.queryBuilder().where(PersonDao.Properties.Age.gt(18)).list();
- }
- //ge: greater equal 半封闭区间查询,年龄大于或者等于18
- public void queryGe() {
- List<Person> persons = mPersonDao.queryBuilder().where(PersonDao.Properties.Age.ge(18)).list();
- }
- //lt: less than 半开区间查询,年龄小于18
- public void queryLt() {
- List<Person> persons = mPersonDao.queryBuilder().where(PersonDao.Properties.Age.lt(18)).list();
- }
- //le: less equal 半封闭区间查询,年龄小于或者等于18
- public void queryLe() {
- List<Person> persons = mPersonDao.queryBuilder().where(PersonDao.Properties.Age.le(18)).list();
- }
- //名字以jackie开头,年龄升序排序
- public void queryLikeAsc() {
- //通配符
- List<Person> persons = mPersonDao.queryBuilder().where(PersonDao.Properties.Name.like("jackie%")).orderAsc(PersonDao.Properties.Age).list();
- }
- //名字以jackie开头,年龄降序排序
- public void queryLikeDesc() {
- List<Person> persons = mPersonDao.queryBuilder().where(PersonDao.Properties.Name.like("jackie%")).orderDesc(PersonDao.Properties.Age).list();
- }
//查询所有数据
public void queryAll() {
List<Person> persons = mPersonDao.queryBuilder().list();
}
//eq: equal 精确查询 名字等于jackie
public void queryEq() {
Person person = mPersonDao.queryBuilder().where(PersonDao.Properties.Name.eq("jackie")).unique();
}
//notEq: not equal 精确查询 名字不等于jackie
public void queryNotEq() {
Person person = mPersonDao.queryBuilder().where(PersonDao.Properties.Name.notEq("jackie")).unique();
}
//like 模糊查询 名字以jackie开头
public void queryLike() {
Person person = mPersonDao.queryBuilder().where(PersonDao.Properties.Name.like("jackie")).unique();
//通配符
List<Person> persons = mPersonDao.queryBuilder().where(PersonDao.Properties.Name.like("jackie%")).list();
}
//between 区间查询 年龄在20到30之间
public void queryBetween() {
List<Person> persons = mPersonDao.queryBuilder().where(PersonDao.Properties.Age.between(20, 30)).list();
}
//gt: greater than 半开区间查询,年龄大于18
public void queryGt() {
List<Person> persons = mPersonDao.queryBuilder().where(PersonDao.Properties.Age.gt(18)).list();
}
//ge: greater equal 半封闭区间查询,年龄大于或者等于18
public void queryGe() {
List<Person> persons = mPersonDao.queryBuilder().where(PersonDao.Properties.Age.ge(18)).list();
}
//lt: less than 半开区间查询,年龄小于18
public void queryLt() {
List<Person> persons = mPersonDao.queryBuilder().where(PersonDao.Properties.Age.lt(18)).list();
}
//le: less equal 半封闭区间查询,年龄小于或者等于18
public void queryLe() {
List<Person> persons = mPersonDao.queryBuilder().where(PersonDao.Properties.Age.le(18)).list();
}
//名字以jackie开头,年龄升序排序
public void queryLikeAsc() {
//通配符
List<Person> persons = mPersonDao.queryBuilder().where(PersonDao.Properties.Name.like("jackie%")).orderAsc(PersonDao.Properties.Age).list();
}
//名字以jackie开头,年龄降序排序
public void queryLikeDesc() {
List<Person> persons = mPersonDao.queryBuilder().where(PersonDao.Properties.Name.like("jackie%")).orderDesc(PersonDao.Properties.Age).list();
}
当上述查询满足不了业务逻辑时,可以自定义查询语句:
六、多线程查询
首先来看错误的方法:
错误截图:
从上面可以看出,只能在创建Query对象的线程中调用查询方法!
解决方法:
七、1对1查询