Android 数据库GreenDao的应用齐全解析

一:什么是GreenDao?
GreenDao是Android平台下的一个ORM(“对象/关系映射”)框架。它将Java对象映射成数据库表,之后你就能够面对对象来存储,更新,删除,查问Objects.

二:GreenDao的长处
1.高性能
2.易于应用的弱小API,涵盖关系和连贯
3.最小的内存耗费
4.库的大小(<100kB)以放弃较低的构建工夫并防止65K办法限度
5.数据库加密:GreenDao反对SQLCipher,以确保用户的数据安全
三:GreenDao的应用
GreenDao的三个外围类:别离是DaoMaster,DaoSession,XXXDao,这三个类都会主动创立,无需本人编写。
DaoMaster:DaoMaster保留数据库对象(SQLiteDatabase)并治理特定模式的DAO类(而不是对象)。他的静态方法来创立表或者删除它们。它的外部OpenHelper和DevOpenHelper是SQLiteOpenHelper实现,它们在SQLite数据库中创立模式。
DaoSession:治理特定模式的所有可用DAO对象,你能够应用其中一个getter办法获取该对象。DaoSession还提供了一些通用的长久办法,如实体的插入,加载,更新,刷新和删除。
XXXDao:数据拜访对象(DAO)长久存在并查问实体。对于每一个实体,GreenDao生成DAO.它具备DaoSession更多的持久性办法
Entities:可长久化对象。通常,实体对象代表一个数据库行,应用规范java属性。

四:Android Studio中应用GreenDao
1.遇到编译问题

Unable to find method 'org.gradle.api.tasks.TaskInputs.property(Ljava/lang/String;Ljava/lang/Object;)Lorg/gradle/api/tasks/TaskInputs;'


最初这一句的中文意思是:您的我的项目可能应用的第三方插件与我的项目中的其余插件或我的项目所要求的Gradle版本不兼容。在损坏Gradle过程的状况下,您还能够尝试敞开IDE,而后杀死所有Java过程
解决形式:把GreenDao版本升级成3.3.0就没有问题了


起因可能是:*Gradle 的版本和库的Gradle版本不兼容,引发的Bug
如果,不是GreeDao的问题,那么可能是我的项目中应用的库须要的定的构建版本工具与版本不兼容*
2.应用GreenDao,须要增加GreenDao Gradle并增加GreenDao库:
第一步:在工程的build.gradle文件下增加:

dependencies { classpath 'com.android.tools.build:gradle:3.2.1' classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' // 1.第一步,增加插件 更好反对GreenDao // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files}

第二步:在相干Moudle:app的build.gradle文件下增加:

apply plugin: 'org.greenrobot.greendao' //第二步apply plugindependencies { implementation 'org.greenrobot:greendao:3.3.0' // 第三步:增加库}

第三步:配置数据库相干信息

android{greendao{ schemaVersion 2 //数据库版本号,降级时可配置 daoPackage  'com.soudao.test.greendao'//dao的包名,包名默认是entity实体类所在的包 targetGenDir 'src/main/java'//生成数据库文件的目录DaoMaster和DaoSession}}

schemaVersion: 数据库schema版本,也能够了解为数据库版本号
daoPackage:设置DaoMaster 、DaoSession、Dao包名
targetGenDir:设置DaoMaster 、DaoSession、Dao目录
targetGenDirTest:设置生成单元测试目录
generateTests:设置主动生成单元测试用例
五:创立实体类@Entity

@Entitypublic class Teacher {    @Id private Long id; private String name; @Transient private  int tempUsageCount; }

点击Build-->Make Project编译我的项目会主动编译生成get,set办法并且在配置的com.soudao.test.greendao目录下生成三个文件DaoMaster,DaoSession,XXXDao文件。

@Entitypublic class Teacher {    @Id private Long id; private String name; @Transient private  int tempUsageCount; @Generated(hash = 1434396195)    public Teacher(Long id, String name) {        this.id = id; this.name = name; }    @Generated(hash = 1630413260)    public Teacher() {    }    public Long getId() {        return this.id; }    public void setId(Long id) {        this.id = id; }    public String getName() {        return this.name; }    public void setName(String name) {        this.name = name; }}

实体类相干属性的注解:
@Id :主键 Long型,能够通过@Id(autoincrement = true)设置自增长
@Property:设置一个非默认关系映射所对应的列名,默认是的应用字段名 举例:@Property (nameInDb="name")
@NotNull:设置数据库表当前列不能为空
@Transient :增加次标记之后不会生成数据库表的列
@Index:应用@Index作为一个属性来创立一个索引,通过name设置索引别名,也能够通过unique给索引增加束缚(@Index(unique = true)//设置唯一性)
@Unique:向数据库列增加了一个惟一的束缚
@ToOne:示意一对一关系
@OrderBy:更加某一字段排序 ,例如:@OrderBy(“date ASC”)
六:实现增删改查
1.下面咱们曾经获取到DaoMaster 、DaoSession、Dao类
咱们创立一个数据库治理类DBManager

public class DBManager {    private Context context;//定义一个上下文 private final static String dbName = "test_db";//定义一个数据库名 private static DBManager mInstance;//单例 private DaoMaster.DevOpenHelper openHelper;//在构造方法里创立一个DaoMaster.DevOpenHelper private DaoSession mDaoSession;//会话层操作具体的DAO对象 private SQLiteDatabase db;//获取一个数据库操作类 public DBManager(Context context) {        this.context = context; openHelper = new DaoMaster.DevOpenHelper(context, dbName, null); }    /* * 双重检索获取DBManager对象的单例*/ public static DBManager getInstance(Context context) {        if (mInstance == null) {            synchronized (DBManager.class) {                if (mInstance == null) {                    mInstance = new DBManager(context); }            }        }        return mInstance; }    /** * 获取可读的数据库 */ public SQLiteDatabase getReadableDatabase() {        if (openHelper == null) {            openHelper = new DaoMaster.DevOpenHelper(context, dbName, null); }        SQLiteDatabase db = openHelper.getReadableDatabase(); return db; }    /** * 获取可写的数据库 */ public SQLiteDatabase getWritableDatabase() {        if (openHelper == null) {            openHelper = new DaoMaster.DevOpenHelper(context, dbName, null); }        db = openHelper.getWritableDatabase(); return db; }    /** * 获取可写的会话层 */ public DaoSession getWriteDaoSession() {        DaoMaster daoMaster = new DaoMaster(getWritableDatabase()); mDaoSession = daoMaster.newSession(); return mDaoSession; }    /** * 获取可读的会话层 */ public DaoSession getReadDaoSession() {        DaoMaster daoMaster = new DaoMaster(getReadableDatabase()); mDaoSession = daoMaster.newSession(); return mDaoSession; }}

1.DBManager.getInstance(this);等价于DaoMaster.DevOpenHelper helper=new DaoMaster.DevOpenHelper(this,"test_db");
单例获取DaoMaster.DevOpenHelper对象
2.DBManager.getInstance(this).getWritableDatabase()等价于SQLiteDatabase db=helper.getWritableDatabase();
3.DBManager.getInstance(this).getWriteDaoSession()等价于
DaoMaster daoMaster=new DaoMaster(db);
DaoSession daoSession=daoMaster.newSession();
这三步获取到DaoSession会话层对象能够去操作
删除一条数据

 public void deleteUser(Student student) {        DaoSession daoSession = DBManager.getInstance(this).getWriteDaoSession();        UserDao userDao = daoSession.getStudentDao();        userDao.delete(student);    }

插入一条数据

 public void insertUser(Student student) {        DaoSession daoSession = DBManager.getInstance(this).getWriteDaoSession();        UserDao userDao = daoSession.getStudentDao();        userDao.insert(student);    }

更新一条数据

public void updateUser(Student student) {        DaoSession daoSession = DBManager.getInstance(this).getWriteDaoSession();        UserDao userDao = daoSession.getStudentDao();        userDao.update(student);    }

查问学生列表

public List<User> queryUserList() {       DaoSession daoSession = DBManager.getInstance(this).getReadDaoSession();        UserDao userDao = daoSession.getStudentDao();        QueryBuilder<Student> qb = userDao.queryBuilder();        List<Student> list = qb.list();         return list;    }

等还能够查问针对用户的筛选。具体须要触类旁通。
结语:不积跬步,无以至千里。不积小流,无以成江海。