关于GreenDao
greenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案。
关于greenDAO的概念可以看官网greenDAO
GreenDAO 优势
1、一个精简的库
2、性能最大化
3、内存开销最小化
4、易于使用的 APIs
5、对 Android 进行高度优化
GreenDAO配置
1、在app的Build.gradle中添加如下配置:
apply plugin: 'org.greenrobot.greendao'
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
greendao{
schemaVersion 1
daoPackage 'com.zs.test.mygreendaodemo.greendao'
targetGenDir 'src/main/java'
}
//schemaVersion: 数据库schema版本,也可以理解为数据库版本号
//daoPackage:设置DaoMaster、DaoSession、Dao包名
//targetGenDir:设置DaoMaster、DaoSession、Dao目录
//targetGenDirTest:设置生成单元测试目录
//generateTests:设置自动生成单元测试用例
此处注意daoPackage,自己设置DaoMaster、DaoSession等自动生成的代码的位置,我的代码结构如下:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.2.1'
testCompile 'junit:junit:4.12'
compile 'org.greenrobot:greendao:3.2.0'
}
在工程的Build.gradle中添加如下配置:
buildscript { repositories { jcenter() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:2.2.0' classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0' } }
2、写实体类
@Entity
public class User {
@Id(autoincrement = true)
private Long id;
private String name;
private int age;
private boolean isBoy;
在第一步配置完后,同步一下,然后写实体,@之后会有Entity代码提示,然后 点击Build后make project后GreenDao会自动帮你生成get/set方法以及 UserDao、DaoMaster、DaoSession类。
3、写GreenDaoManager
public class GreenDaoManager { private DaoMaster mDaoMaster; private DaoSession mDaoSession; private static GreenDaoManager mInstance; //单例 private GreenDaoManager(){ if (mInstance == null) { DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(MyApplication.getContext(), "user1-db", null);//此处为自己需要处理的表 mDaoMaster = new DaoMaster(devOpenHelper.getWritableDatabase()); mDaoSession = mDaoMaster.newSession(); } } public static GreenDaoManager getInstance() { if (mInstance == null) { synchronized (GreenDaoManager.class) {//保证异步处理安全操作 if (mInstance == null) { mInstance = new GreenDaoManager(); } } } return mInstance; } public DaoMaster getMaster() { return mDaoMaster; } public DaoSession getSession() { return mDaoSession; } public DaoSession getNewSession() { mDaoSession = mDaoMaster.newSession(); return mDaoSession; } }
4、在Application里面初始化GreenDao
public class MyApplication extends Application { private static Context mContext; @Override public void onCreate() { super.onCreate(); mContext = getApplicationContext(); //greenDao全局配置,只希望有一个数据库操作对象 GreenDaoManager.getInstance(); } public static Context getContext() { return mContext; } }
5、Greendao常用增删改查方法
public class MainActivity extends AppCompatActivity {
//@Transient,该注解表示这个属性将不会作为数据表中的一个字段
//@NotNull表示该字段不可以为空,@Unique表示该字段唯一
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// updatadata();
// insertdata();
// querydata();
//删除数据
// getUserDao().deleteByKey(2l);//long类型
// querydata();
// querydataBy();
getuserById();
}
private void getuserById() {
User user =getUserDao().load(1l);
Log.i("tag", "结果:" + user.getId() + "," + user.getName() + "," + user.getAge() + "," + user.getIsBoy() + ";");
}
private void insertdata() {
//插入数据
User insertData = new User(null, "插入数据", 24, false);
getUserDao().insert(insertData);
}
private void updatadata() {
//更改数据
List<User> userss = getUserDao().loadAll();
User user = new User(userss.get(0).getId(), "更改后的数据用户", 22, true);
getUserDao().update(user);
}
private void querydata() {
//查询数据详细
List<User> users = getUserDao().loadAll();
Log.i("tag", "当前数量:" + users.size());
for (int i = 0; i < users.size(); i++) {
Log.i("tag", "结果:" + users.get(i).getId() + "," + users.get(i).getName() + "," + users.get(i).getAge() + "," + users.get(i).getIsBoy() + ";");
}
}
private void querydataBy() {查询条件
Query<User> nQuery = getUserDao().queryBuilder()
// .where(UserDao.Properties.Name.eq("user1"))//.where(UserDao.Properties.Id.notEq(999))
.orderAsc(UserDao.Properties.Age)//.limit(5)//orderDesc
.build();
List<User> users = nQuery.list();
Log.i("tag", "当前数量:" + users.size());
for (int i = 0; i < users.size(); i++) {
Log.i("tag", "结果:" + users.get(i).getId() + "," + users.get(i).getName() + "," + users.get(i).getAge() + "," + users.get(i).getIsBoy() + ";");
}
// QueryBuilder qb = userDao.queryBuilder();
// qb.where(Properties.FirstName.eq("Joe"),
// qb.or(Properties.YearOfBirth.gt(1970),
// qb.and(Properties.YearOfBirth.eq(1970), Properties.MonthOfBirth.ge(10))));
// List youngJoes = qb.list();
}
/**
* 根据查询条件,返回数据列表
* @param where 条件
* @param params 参数
* @return 数据列表
*/
public List<User> queryN(String where, String... params){
return getUserDao().queryRaw(where, params);
}
/**
* 根据用户信息,插件或修改信息
* @param user 用户信息
* @return 插件或修改的用户id
*/
public long saveN(User user){
return getUserDao().insertOrReplace(user);
}
/**
* 批量插入或修改用户信息
* @param list 用户信息列表
*/
public void saveNLists(final List<User> list){
if(list == null || list.isEmpty()){
return;
}
getUserDao().getSession().runInTx(new Runnable() {
@Override
public void run() {
for(int i=0; i<list.size(); i++){
User user = list.get(i);
getUserDao().insertOrReplace(user);
}
}
});
}
/**
* 删除所有数据
*/
public void deleteAllNote(){
getUserDao().deleteAll();
}
/**
* 根据用户类,删除信息
* @param user 用户信息类
*/
public void deleteNote(User user){
getUserDao().delete(user);
}
private UserDao getUserDao() {
return GreenDaoManager.getInstance().getSession().getUserDao();
}
}