greendao存储图片 greendao数据库_greendao存储图片

app数据存储有很多办法,一般情况下根据数据量来选择:

数据量较小可使用SharedPreferences保持,比较多使用GreenDao保存,数据量巨大可使用File流保存;

最近项目中需要保存几百组数据,正好借此结合了解下GreenDao数据库,为什么选择GreenDao?GreenDao有哪些优势就不再叙述了,网上一搜一大堆,简单说下使用步骤,重点了解下查询操作;

导入插件配置GreenDao

①在Project的build.gradle中添加相关依赖

greendao存储图片 greendao数据库_android_02

②在Module的build.gradle中添加相关依赖和配置信息

greendao存储图片 greendao数据库_GreenDao_03

创建数据存储对象

/*
 * @Entity:     告诉GreenDao该对象为实体,只有被@Entity注释的Bean类才能被dao类操作()
 * @Id:         对象的Id,使用Long类型作为EntityId,否则会报错。@Id(autoincrement = true)表示主键会自增,如果false就会使用旧值
 * @Property:   可以自定义字段名,注意外键不能使用该属性
 * @NotNull:    属性不能为空
 * @Transient:  使用该注释的属性不会被存入数据库的字段中
 * @Unique:     该属性值必须在数据库中是唯一值
 * @Generated:  编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改
 */
@Entity
public class Person {
    @Id
    private Long id;
    @NotNull
    private String name;
    @NotNull
    private int age;
    private String idCard;
}

Build  >  make Project  重构工程后会自动生成数据库辅助类

greendao存储图片 greendao数据库_GreenDao_04

准备GreenDao工具类

为了方便项目中操作数据库,简单封装了一个数据库工具类:

public class DaoManager {

    // 数据库名称
    private static final String DB_NAME = "person.db";

    private static DaoManager instance;

    private MyOpenHelper mHelp;
    private DaoSession mDaoSession;

    /**
     * 使用单例模式获得操作数据库的对象
     */
    public static DaoManager getInstance() {
        if (instance == null)
            instance = new DaoManager();
        return instance;
    }

    // 初始化数据库
    public void initGreenDao(Context mContext) {
        if (mHelp != null) return;
        /*
         通过 DaoMaster 的内部类 DevOpenHelper,获取 SQLiteOpenHelper 对象。
         注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
                先使用DaoMaster.DevOpenHelper创建,下面数据库升级使用自定义的OpenHelper
        */
        mHelp = new MyOpenHelper(mContext, DB_NAME, null);
        SQLiteDatabase db = mHelp.getWritableDatabase();
        DaoMaster daoMaster = new DaoMaster(db);
        mDaoSession = daoMaster.newSession();
    }

    public DaoSession getDaoSession() {
        return mDaoSession;
    }

    // 关闭数据库
    public void closeGreenDao() {
        if (mDaoSession != null) {
            mDaoSession.clear();
            mDaoSession = null;
        }
        if (mHelp != null) {
            mHelp.close();
            mHelp = null;
        }
    }

}

在项目启动时初始化数据库

greendao存储图片 greendao数据库_数据库_05

数据库的增删查改

增加数据,这里只介绍单条增加

Person p1 = new Person((long) 1, "zs", 6,"001");
                DaoManager.getInstance().getDaoSession().insert(p1);

最主要的就是查询操作,这里介绍几种查询:(如果SQL语句很6,可使用SQL语句结合rawQuery方法查询)

PersonDao personDao = DaoManager.getInstance().getDaoSession().getPersonDao();

                // 查询所有
                List<Person> peopleList = personDao.loadAll();

                // 条件查询 (查询单个对象,用eq方法)
                 Person unique = personDao.queryBuilder().where(PersonDao.Properties.Name.eq("zs")).unique();

                // 条件查询 -- 查询非内容 notEq 返回集合 (查询Age!=6的数据)
                 List<Person> notEqList = personDao.queryBuilder().where(PersonDao.Properties.Age.notEq(6)).list();

                // 条件查询 -- 模糊查询 (查询Name以“z”开头的数据)
                 List<Person> zNameList = personDao.queryBuilder().where(PersonDao.Properties.Name.like("z%")).list();

修改数据

DaoManager.getInstance().getDaoSession().getPersonDao().update(new Person((long) 1, "zl", 6,"006"));

删除数据(可结合查询操作删除部分数据)

PersonDao personDao = DaoManager.getInstance().getDaoSession().getPersonDao();

                // 删除所有记录
                 personDao.deleteAll();

                // 删除多条 -- 配合查询删除符合条件的数据 (删除名字以“z”开头的数据)
                personDao.deleteInTx(personDao.queryBuilder().where(PersonDao.Properties.Name.like("z%")).list());

GreenDao很强大,这里只是简单介绍最基础的增删查改方法,入门后可根据项目需求自行研究

GreenDao升级

数据库升级也非常简单,更新表单数据后,增加scemaVersion版本即可,问题是默认会删除旧数据,在此借助GreenDaoUpgradeHelper三方库升级;

/**
 * 自定义OpenHelp类,数据库升级使用
 * 替代DaoMaster.DevOpenHelper初始化数据库
 */
public class MyOpenHelper extends DaoMaster.OpenHelper {

    public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
        super(context, name, factory);
    }

    // 在onUpgrade方法中进行数据库的迁移
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        super.onUpgrade(db, oldVersion, newVersion);
        // GreenDaoUpgradeHelper 迁移数据
        MigrationHelper.migrate(db, PersonDao.class, UserInfoDao.class);
    }

}

greendao存储图片 greendao数据库_greendao存储图片_06

GreenDao加密

greendao存储图片 greendao数据库_android 数据库_07