greendao android使用教程,GreenDao的基本使用(android数据库)

在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 group: '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然后自动生成数据库的操作类:

79618a3c6dbc75670e9eb2cccde7afd0.png

就是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 qb = mDao.queryBuilder();

List 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 query = mDao.queryBuilder().orderAsc(UserDao.Properties.Id).build();

List 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 qb = mDao.queryBuilder();

List list = qb.where(UserDao.Properties.Id.eq(id)).list();

if (list.size() > 0){

return true;

}

return false;

}复制代码

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

是不是很方便呢;

4完整代码展示 :

下面粘贴完整代码:

3fd8bf2e695edad4461e58da4436c35f.png

//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 mIndex;

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 qb = mDao.queryBuilder();

List 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 query = mDao.queryBuilder().orderAsc(UserDao.Properties.Id).build();

List 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 qb = mDao.queryBuilder();

List list = qb.where(UserDao.Properties.Id.eq(id)).list();

if (list.size() > 0){

return true;

}

return false;

}

}

复制代码

总而言之 greendao的框架作为android的数据库框架会很大程度提高效率;有兴趣的可以探讨其内部实现原理机制~感谢阅读 天气转冷 小心感冒哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值