关闭

Android中轻松使用greenDao实现数据持久化

标签: greenDaoandroid数据库数据sqlite
288人阅读 评论(0) 收藏 举报
分类:

文章背景
程序猿或是程序媛们在开发Android项目的时候,在使用原始方法来操作SQLite数据库实现数据本地持久化时,往往要编写大量的sql语句来实现数据库的各种操作,这对程序员的技术要求较高,同时在一定程度上影响开发效率,那么我们可以使用目前市面上比较流行的第三方数据库操作库greenDao。但本人还是强烈建议先学习SQLite原始操作方法,万变不理其中,这样再学习greenDao就会变得更轻松,更深刻些,可以参考:http://blog.csdn.net/xinanheishao/article/details/73436291

文章目标
greenDao实现数据库建库建表
greenDao实现增删改查操作
提供一个数据库操作工具给大伙。

greenDao简单介绍
greenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案,所谓ORM可以简单理解为框架可以把数据库的表自动转化为实体模型,程序员只要操作实体即可,操作实体即操作对应的表,这种框架设计是目前比较流行也是软件开发的趋势。
greenDao是一个精简的库
greenDao和同类型的库相比,性能是最好的,不过数据量不大的情况下,也看不出性能优势
greenDao内存开销最小化
greenDao易于使用的 APIs

演示效果图:
greenDao

导入greenDao3.0库

dependencies {
    compile 'org.greenrobot:greendao:3.0.1'
    compile 'org.greenrobot:greendao-generator:3.0.0'
}

gradle中的greenDao相关配置
在gradle的中配置完毕之后,sync project一下,gradle会自动去远程仓库下载一个gradle的插件,专为greenDAO服务的,用来生成数据库相关的代码。

apply plugin: 'org.greenrobot.greendao'
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.1'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

greenDao生成配置
配置说明:
schemaVersion—->指定数据库schema版本号,迁移等操作会用到
daoPackage——–>通过gradle插件生成的数据库相关文件的包名,默认为你 的entity所在的包名
targetGenDir——–>这就是我们上面说到的自定义生成数据库文件的目录了,可以将生成的文件放到我们的java目录中,而不是build中,这样就不用额外的设置资源目录了

greendao {
    schemaVersion 1
    daoPackage 'com.example.yangdechengapplication.greendao'
    targetGenDir 'src/main/java'
}

实体类的生成

package com.example.yangdechengapplication.entity;

import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Transient;
import org.greenrobot.greendao.annotation.Generated;

/**
 * Created by Administrator on 2017/6/25.
 */
@Entity
public class User {
    @Id
    private Long id;
    private String userNo;
    private String name;
    @Transient
    private int tempUsageCount; // not persisted
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Long getId() {
        return this.id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getUserNo() {
        return this.userNo;
    }
    public void setUserNo(String userNo) {
        this.userNo = userNo;
    }
    @Generated(hash = 1192512955)
    public User(Long id, String userNo, String name) {
        this.id = id;
        this.userNo = userNo;
        this.name = name;
    }
    @Generated(hash = 586692638)
    public User() {
    }
}

实体类中常用的注解:

@Entity  表明这个实体类会在数据库中生成一个与之相对应的表。

@Id  对应数据表中的 Id 字段,有了解数据库的话,是一条数据的唯一标识。

@Property(nameInDb = “STUDENTNUM”)  表名这个属性对应数据表中的 STUDENTNUM 字段。

@Property  可以自定义字段名,注意外键不能使用该属性

@NotNull  该属性值不能为空

@Transient  该属性不会被存入数据库中

@Unique  表名该属性在数据库中只能有唯一值

当你编写完实体之后,点击编译根据实体类会在greenDao配置的目录下生成三个数据库数据库相关的类:DaoSession、DaoMaster以及所有实体类的dao类,其中DaoMaster 和 DaoSession 这两个类用于初始化数据库,UserDao就是操作User表的类。
如图所示:
dao效果图

GreenDaoHelper
这是我封装的数据库库初始化的帮助类

package com.example.yangdechengapplication.data;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

import com.example.yangdechengapplication.MyApplication;
import com.example.yangdechengapplication.greendao.DaoMaster;
import com.example.yangdechengapplication.greendao.DaoSession;

/**
 * Created by Administrator on 2017/6/25.
 */

public class GreenDaoHelper {

    private static DaoMaster.DevOpenHelper mHelper;
    private static SQLiteDatabase db;
    private static DaoMaster mDaoMaster;
    private static DaoSession mDaoSession;
    private static GreenDaoHelper instance = new GreenDaoHelper();
    public static GreenDaoHelper getInstance(){
        return instance;
    }

    /**
     * 初始化greenDao,这个操作建议在Application初始化的时候添加;
     */
    public static void initGreenDao(Context context) {
        // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
        // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
        // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
        // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
        mHelper = new DaoMaster.DevOpenHelper(context, "mygreendb", null);
        db = mHelper.getWritableDatabase();
        // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
        mDaoMaster = new DaoMaster(db);
        mDaoSession = mDaoMaster.newSession();
    }
    public static DaoSession getDaoSession() {
        return mDaoSession;
    }
    public static SQLiteDatabase getDb() {
        return db;
    }

}

然后再程序的入口初始化数据库

package com.example.yangdechengapplication;

import android.app.Application;

import com.example.yangdechengapplication.data.BaseDBHelper;
import com.example.yangdechengapplication.data.GreenDaoHelper;
import com.example.yangdechengapplication.tools.CrashHandler;
import com.example.yangdechengapplication.tools.LogToFile;

/**
 * Created by Administrator on 2017/6/15.
 */

public class MyApplication extends Application {
    private final static float HEAP_UTILIZATION = 0.75f;
    private final static int MIN_HEAP_SIZE = 6* 1024* 1024 ;
    @Override
    public void onCreate() {
        super.onCreate();

        // 异常处理,不需要处理时注释掉这两句即可!
        CrashHandler crashHandler = CrashHandler.getInstance();
        // 注册crashHandler
        crashHandler.init(getApplicationContext());
        LogToFile.init(getApplicationContext());
        //ydc 20170616 初始化数据库
        BaseDBHelper.getInstance().init(getApplicationContext());
        //ydc 20170629  初始化greenDao数据库
        GreenDaoHelper.initGreenDao(getApplicationContext());
    }
}

查看数据库
如果是模拟器运行的话,Android系统底层是Linux构建的,所以我们可以使用adb shell命令来查看我们所创建的数据库,步骤如下:
adb shell
su
ls -l
cd data
ls -l
cd data
ls -l
cd 你的包名
ls -l
cd databases
ls -l

还可以进一步操作:
在 # 提示符下输入以下命令,我们进入sqlite(Figure3)。
sqlite3 mygreendb.db
这个命令会打开mygreendb.db数据库,若mygreendb.db数据库不存在,则会新建一个名为
mygreendb.db的数据库。(注意数据库名大小写有区别)
在sqlite>提示符下输入
.help 这个命令让我们看到许多命令
.tables 查看所有表,例如我的系统里有USER表

adb001

adb002

adb003

adb004

adb005

adb006

adb007

数据库增删改查操作
在Activity中获取UserDao实例

UserDao  userDao= GreenDaoHelper.getDaoSession().getUserDao();

增加操作

User user = new User(null,String.valueOf(userNo), "张三");
            userDao.insert(user);

删除操作

 userDao.deleteAll();

修改操作
先根据编号获取的想修改的User实体,再做修改

 User user=getUserByNo(String.valueOf(2));
            user.setName("李四");
            userDao.update(user);

private User getUserByNo(String userNo){
        user=userDao.queryBuilder().where(UserDao.Properties.UserNo.eq(userNo)).unique();
        return user;
    }  

查询操作

 List<User> userList = userDao.queryBuilder()
                    .where(UserDao.Properties.Id.notEq(999))
                    .orderAsc(UserDao.Properties.Id)
                    .limit(5)
                    .build().list();

GreendaoActivity
greenDao增删改查操作所在类Activity

package com.example.yangdechengapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.example.yangdechengapplication.data.DBHelperService;
import com.example.yangdechengapplication.data.GreenDaoHelper;
import com.example.yangdechengapplication.entity.User;
import com.example.yangdechengapplication.greendao.UserDao;
import java.util.List;

/**
 * Created by ydc on 2017/6/25.
 */

public class GreendaoActivity extends AppCompatActivity {
    private Button delete;
    private Button insertButton;
    private Button updateButton;
    private Button queryButton;
    private TextView tv_info;
    private UserDao userDao;
    private User user;

    private  int userNo=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_greendao);
        userDao= GreenDaoHelper.getDaoSession().getUserDao();

        delete = (Button)findViewById(R.id.delete);
        updateButton = (Button)findViewById(R.id.update);
        insertButton = (Button)findViewById(R.id.insert);
        queryButton = (Button)findViewById(R.id.query);
        tv_info=(TextView)findViewById(R.id.tv_info);

        delete.setOnClickListener(new DeleteListener());
        updateButton.setOnClickListener(new UpdateListener());
        insertButton.setOnClickListener(new InsertListener());
        queryButton.setOnClickListener(new QueryListener());
    }


    class InsertListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {

            userNo++;
            user = new User(null,String.valueOf(userNo), "张三");
            userDao.insert(user);
        }
    }



    class UpdateListener implements View.OnClickListener {

        @Override
        public void onClick(View arg0) {
            user=getUserByNo(String.valueOf(userNo));
            user.setName("李四");
            userDao.update(user);
        }
    }

    class QueryListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            String names="";
            List<User> userList = userDao.queryBuilder()
                    .where(UserDao.Properties.Id.notEq(999))
                    .orderAsc(UserDao.Properties.Id)
                    .limit(5)
                    .build().list();

            for (User u: userList
                 ) {
                names+="姓名:"+u.getName()+" 学号:"+u.getUserNo()+";\n";

            }
            tv_info.setText(names);
        }
    }
    class DeleteListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            userDao.deleteAll();
        }
    }

    private User getUserByNo(String userNo){
        user=userDao.queryBuilder().where(UserDao.Properties.UserNo.eq(userNo)).unique();
        return user;
    }
}

Dome下载地址:http://download.csdn.net/download/xinanheishao/9880447

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:36946次
    • 积分:974
    • 等级:
    • 排名:千里之外
    • 原创:35篇
    • 转载:170篇
    • 译文:1篇
    • 评论:6条
    文章分类
    最新评论