一,配置
1,在项目的gradle中添加插件
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // greendao的插件
android {
compileSdkVersion 26
buildToolsVersion "26.0.0"
defaultConfig {
}
2,配置greendao
greendao {
schemaVersion 1 //数据库升级用(比如表的字段增加了,需要更新原来的表)
daoPackage 'laobi.com.sqlitedemo' //这个是生成代码保存的包名
targetGenDir 'src/main/java/dao' //保存到java代码路径
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
2,在项目的gradle中添加依赖
compile 'org.greenrobot:greendao:3.2.2'
compile 'org.greenrobot:greendao-generator:3.2.2'
3,在工程(Project)build.gradle配置
buildscript {
repositories {
jcenter()
mavenCentral() // greendao
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.1'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // greendao
}
}
二,在application中初始化
// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
@Override
public void onCreate() {
super.onCreate();
context = this;
initGreenDao();
}
private void initGreenDao() {
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, ENCRYPTED ? "users-db-encrypted" : "users-db");
Database db = helper.getWritableDb();
// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
daoSession = new DaoMaster(db).newSession();
}
public static DaoSession getDaoSession() {
return daoSession;
}
三,实体类bean的编写
1,编写bean
@Entity
public class ShopDataBean {
//static
/**
* id : 1373
* name : 1123213
* address : 福建省-厦门市-
* province : 福建省
* city : 厦门市
*/
@Id(autoincrement = true)
private Long id;
@Property(nameInDb = "NAME")
public String name;
@Property(nameInDb = "ADDRESS")
private String address;
@Property(nameInDb = "PROVINCE")
public String province;
@Property(nameInDb = "CITY")
public String city;
2,编写到这里后,同时按ctrl+F9键,
就会自动生成下图中第1,2,3个文件(DaoMaster,DaoSeddion,ShopDataBeanDao)和get(),set()方法,.
如果另外一个页面要增加user这个数据,按同样的操作,就会生成下图中第4个文件(第1,2个文件是所有生成的dao公用的)
2.1DevOpenHelper:创建SQLite数据库的SQLiteOpenHelper的具体实现
2.2,DaoMaster:GreenDao的顶级对象,作为数据库对象、用于创建表和删除表
2.3,DaoSession:管理所有的Dao对象,Dao对象中存在着增删改查等API
四.代码中使用
1,统一封装的增删改查
public class ShopDao {
//增加
public static void insert(ShopDataBean shopDataBean){
MyApplication.getDaoSession().getShopDataBeanDao().insert(shopDataBean);
}
//清除数据库
public static void deleteAll(){
MyApplication.getDaoSession().getShopDataBeanDao().deleteAll();
}
//删除指定的数据
public static void delete(ShopDataBean shopDataBean){
MyApplication.getDaoSession().getShopDataBeanDao().delete(shopDataBean);
}
//修改指定的数据
public static void update(ShopDataBean shopDataBean){
MyApplication.getDaoSession().getShopDataBeanDao().update(shopDataBean);
}
//查询所有的数据
public static List<ShopDataBean> queryAll(){
return MyApplication.getDaoSession().getShopDataBeanDao().queryBuilder().orderAsc(laobi.com.sqlitedemo.ShopDataBeanDao.Properties.Id).build().list();
}
// public static void queryAll(){
// MyApplication.getDaoSession().getShopDataBeanDao().loadAll();
// }
}
2,如果后台返回的大量的数据,比如10000条数据,就需要开启子线程去插入数据(这样从网络拿回数据,就可以立即显示在界面)
HappyOkhttpManager.getInstance().postJson(Constant.params, new HHttpStatus() {
@Override
public void onSuccess(String json) {
Log.e("date", "返回onResponse: " + json);
try {
JSONObject jsonObject = new JSONObject(json);
JSONObject response = jsonObject.getJSONObject("response");
String result_code = response.getString("result_code");
String error_msg = response.getString("error_msg");
if (result_code.equals("true")) {
HappyMutilChooseShopListActivityList happyMutilChooseShopListActivityList = new Gson().fromJson(json, HappyMutilChooseShopListActivityList.class);
List<ShopDataBean> shop_data = happyMutilChooseShopListActivityList.getResponse().getShop_data();
mGreenDaoAdapter.setData(shop_data);
insertUser(shop_data);
} else {
Toast.makeText(GreenDao2Activity.this, error_msg, Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
//开启子线程,插入数据(这样从网络拿回数据,就可以立即显示在界面)
private void insertUser(final List<ShopDataBean> shopDataBeans) {
new Thread(new Runnable() {
@Override
public void run() {
if (shopDataBeans.size() != 0) {
for (int i = 0; i < shopDataBeans.size(); i++) {
ShopDataBean shopDataBean = new ShopDataBean(null, shopDataBeans.get(i).getName()
, shopDataBeans.get(i).getAddress(),
shopDataBeans.get(i).getProvince(), shopDataBeans.get(i).getCity());
// mShopDataBeanDao.insert(shopDataBean);
ShopDao.insert(shopDataBean);
}
}
}
}).start();
}
五,其他注释
(1)@Entity 实体标识
@nameInDb 在数据库中的名字,如不写则为实体中类名
@indexes 索引
@createInDb 是否创建表,默认为true,false时不创建
@schema 指定架构名称为实体
@active 无论是更新生成都刷新
(2)@Id 每条数据对应的位置,必写项
(3)@Property(nameInDb = "") 表示该属性将作为表的一个字段,其中nameInDb属性值是在数据库中对应的字段名称,可以自定义字段名,例如可以定一个跟实体对象字段不一样的字段名
(4)@NotNull 不为null
(5)@Unique 唯一约束 该属性值必须在数据库中是唯一值
(6)@ToMany 一对多
(7)@OrderBy 排序
(8)@ToOne 一对一 关系表
(9)@Transient 不保存于数据库
(10)@generated 由greendao产生的构造函数或方法
借鉴: