您的位置:首页 > 移动开发 > Android开发

GreenDao的基本使用(android数据库)

2017-11-01 18:51 302 查看
在android中,在有些数据量相对较大或者处于安全考虑的情况下,会使用android自带的数据库—-sqlite:

但是使用sqlite需要考虑到以下几点:

1.严格控制数据库资源的打开与关闭(db,cursor);
2.在遍历数据时候取到的是cursor要转化为list再使用
3.事务回滚,可以大大优化数据库的效率;


在android开发中我们会遇到一些数据库,内部框架做了封装使用起来比较方便:如 ormLite greenDao等

相比而言,greendao应该是最快,效率最高的数据库框架(greendao官网有介绍),ok直接代码详解greemdao.进入正题:

1.greenDao框架的初始化(准备工作与接入)

1.1

//首先实在project的build中配置:

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'

//greenDao的配置
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'

}
}


1.2

//在moudle的build中配置

apply plugin: 'com.android.application'

//greenDao依赖
apply plugin: 'org.greenrobot.greendao'

android {

........

//在创建玩实体类之后make project 存放greenDao  DB 的包位置
greendao {
schemaVersion 1
daoPackage 'com.example.mysmall.greendao.greendao'//这个是生成代码保存的包名
targetGenDir 'src/main/java'//保存到java代码路径
}
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude g
4000
roup: 'com.android.support', module: 'support-annotations'
})

.....
//greenDao的配置
compile 'org.greenrobot:greendao:3.2.2'
compile 'org.greenrobot:greendao-generator:3.2.2'
}


2.创建实体类 接着点击 Build -> Make Project

创建实体类: @Generated(hash = 664611791)中的hash参数 是build->Make Project之后生成的:

@Entity
public class User {

/**定义主键*/
@Id(autoincrement = true)
private long id;

private String name;
private int age;
private String sex;

@Generated(hash = 664611791)
public User(long id, String name, int age, String sex) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}

@Generated(hash = 586692638)
public User() {
}

public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}


需要注意一下 上面实体类通过注解会映射为数据库表(就不需要自己去写数据库创建的sal);

ok~下面来看注解:

@Entity表明该类是持久化的类(持久化含义,存入数据库文件中,作本地化处理)

@Id选择一个long或Long类型的属性作为该实体所对应数据库中数据表的主键(注意数据类型必须是long)

@Generated写在构造方法前

然后是关键性的一步build->Make Project然后自动生成数据库的操作类:



就是DaoMaster DaoSession UserDao;

3数据库操作类生成 开始用greenDao操作数据库:(用log来展示每次操作的数据变化):

3.1数据库的初始化

在 App(extends Application中实现代码):

public class App extends Application{

private UserDao userDao;
private static App mApp;

@Override
public void onCreate() {
super.onCreate();

/**初始化数据库*/
DaoMaster.DevOpenHelper mHelper = new DaoMaster.
DevOpenHelper(this, "user-db", null);

SQLiteDatabase db = mHelper.getWritableDatabase();
DaoMaster master = new DaoMaster(db);
DaoSession daoSession = master.newSession();
userDao = daoSession.getUserDao();

}

public static App getInstance(){
if (mApp == null){
synchronized (App.class){
mApp = new App();
}
}

return mApp;
}

public UserDao getDao(){
return userDao;
}
}


核心代码:

DaoMaster.DevOpenHelper mHelper = new DaoMaster.
DevOpenHelper(this, "user-db", null);

SQLiteDatabase db = mHelper.getWritableDatabase();
DaoMaster master = new DaoMaster(db);
DaoSession daoSession = master.newSession();
userDao = daoSession.getUserDao();


3.2数据库的增删改查:

private void initDelete() {
//mDao.deleteByKey(Long.valueOf(1));
String trim = mPos.getText().toString().trim();
if (trim != null && !trim.equals("")) {
mDao.deleteByKey(Long.valueOf(trim));

QueryBuilder<User> qb = mDao.queryBuilder();
List<User> list = qb.where(UserDao.Properties.Id.eq(Long.valueOf(trim))).list();
if (list.size()<1){
Toast.makeText(this,"指定数据删除成功",Toast.LENGTH_SHORT).show();
}

}else {
mDao.deleteAll();
}

}

private void initUpdate() {

String trim = mPos.getText().toString().trim();
if (trim != null && !trim.equals("")) {
User user = mDao.load(Long.valueOf(trim));
user.setName("保尔柯察金");
mDao.update(user);

}

}

private void initInsert() {
for (int i = 0; i < 5; i++) {
mIndex ++;
if (isEcho(String.valueOf(mIndex))){
Toast.makeText(this,"主键重复",Toast.LENGTH_SHORT).show();
}else {
User user = new User(Long.valueOf(mIndex), "张三" + i, 18, "男");
mDao.insert(user);
}

}

}

private void initSelect() {
Query<User> query = mDao.queryBuilder().orderAsc(UserDao.Properties.Id).build();
List<User> list = query.list();
for (int i = 0; i < list.size(); i++) {
User user = list.get(i);
String s = user.toString();
Log.i("query",s);
}
}

/**判断主键是否重复*/
private boolean isEcho(String id){
QueryBuilder<User> qb = mDao.queryBuilder();
List<User> list = qb.where(UserDao.Properties.Id.eq(id)).list();
if (list.size() > 0){
return true;
}
return false;

}


ok~ 从上面代码中可以看到 没有依据sql的操作语句 而且 每次操作完成资源是自动开关,不需要你手动开关数据库/游标/事务

是不是很方便呢;

4完整代码展示 :

下面粘贴完整代码:



//app

package com.example.mysmall.greendao.global;

import android.app.Application;
import android.database.sqlite.SQLiteDatabase;

import com.example.mysmall.greendao.greendao.DaoMaster;
import com.example.mysmall.greendao.greendao.DaoSession;
import com.example.mysmall.greendao.greendao.UserDao;

/**
* Created by houruixiang on 2017/10/31.
*/

public class App extends Application{

private UserDao userDao;
private static App mApp;

@Override
public void onCreate() {
super.onCreate();

/**初始化数据库*/
DaoMaster.DevOpenHelper mHelper = new DaoMaster.DevOpenHelper(this, "user-db", null);
SQLiteDatabase db = mHelper.getWritableDatabase();
DaoMaster master = new DaoMaster(db);
DaoSession daoSession = master.newSession();
userDao = daoSession.getUserDao();

}

public static App getInstance(){
if (mApp == null){
synchronized (App.class){
mApp = new App();
}
}

return mApp;
}

public UserDao getDao(){
return userDao;
}
}


//MainActivity

package com.example.mysmall.greendao;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.example.mysmall.greendao.global.App;
import com.example.mysmall.greendao.greendao.UserDao;
import com.example.mysmall.greendao.model.User;

import org.greenrobot.greendao.query.Query;
import org.greenrobot.greendao.query.QueryBuilder;

import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private Button mSelect;
private Button mInsert;
private Button mUpdate;
private Button mDelete;
private int mInde
c7eb
x;
private UserDao mDao;
private EditText mPos;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**获取数据库操作对象*/
mDao = ((App) getApplication()).getDao();

initView();
}

private void initView() {
mSelect = (Button) findViewById(R.id.seclet);
mInsert = (Button) findViewById(R.id.insert);
mUpdate = (Button) findViewById(R.id.update);
mDelete = (Button) findViewById(R.id.delete);
mPos = (EditText) findViewById(R.id.tarPosition);

mSelect.setOnClickListener(this);
mInsert.setOnClickListener(this);
mUpdate.setOnClickListener(this);
mDelete.setOnClickListener(this);

}

@Override
public void onClick(View v) {

switch (v.getId()){
case R.id.seclet:
initSelect();
break;
case R.id.insert:
initInsert();
break;
case R.id.update:
initUpdate();
break;
case R.id.delete:
initDelete();
break;

}

}

private void initDelete() {
//mDao.deleteByKey(Long.valueOf(1));
String trim = mPos.getText().toString().trim();
if (trim != null && !trim.equals("")) {
mDao.deleteByKey(Long.valueOf(trim));

QueryBuilder<User> qb = mDao.queryBuilder();
List<User> list = qb.where(UserDao.Properties.Id.eq(Long.valueOf(trim))).list();
if (list.size()<1){
Toast.makeText(this,"指定数据删除成功",Toast.LENGTH_SHORT).show();
}

}else {
mDao.deleteAll();
}

}

private void initUpdate() {

String trim = mPos.getText().toString().trim();
if (trim != null && !trim.equals("")) {
User user = mDao.load(Long.valueOf(trim));
user.setName("保尔柯察金");
mDao.update(user);

}

}

private void initInsert() {
for (int i = 0; i < 5; i++) {
mIndex ++;
if (isEcho(String.valueOf(mIndex))){
Toast.makeText(this,"主键重复",Toast.LENGTH_SHORT).show();
}else {
User user = new User(Long.valueOf(mIndex), "张三" + i, 18, "男");
mDao.insert(user);
}

}

}

private void initSelect() {
Query<User> query = mDao.queryBuilder().orderAsc(UserDao.Properties.Id).build();
List<User> list = query.list();
for (int i = 0; i < list.size(); i++) {
User user = list.get(i);
String s = user.toString();
Log.i("query",s);
}
}

/**判断主键是否重复*/
private boolean isEcho(String id){
QueryBuilder<User> qb = mDao.queryBuilder();
List<User> list = qb.where(UserDao.Properties.Id.eq(id)).list();
if (list.size() > 0){
return true;
}
return false;

}
}


总而言之 greendao的框架作为android的数据库框架会很大程度提高效率;有兴趣的可以探讨其内部实现原理机制~感谢阅读 天气转冷 小心感冒哦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息