Android--数据库GreenDao使用
一、简介
greenDAO是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操作关系型数据库,它能够让你操作数据库时更简单、更方便。如下图所示:
Github地址:https://github.com/greenrobot/greenDAO
GreenDao 优点:
1.性能高,号称Android最快的关系型数据库
2.内存占用小
3.库文件比较小,小于100K,编译时间低,而且可以避免65K方法限制
4.支持数据库加密 greendao支持SQLCipher进行数据库加密 有关SQLCipher可以参考这篇博客Android数据存储之Sqlite采用SQLCipher数据库加密实战
5.简洁易用的API
二、配置
1、需要在工程(Project)的build.gradle中添加依赖
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.0.0' //GreenDao3依赖 classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1' } }
2、在项目(Module)的build.gradle中添加依赖
apply plugin: 'com.android.application' //使用greendao apply plugin: 'org.greenrobot.greendao' android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.handsome.didi" minSdkVersion 14 targetSdkVersion 23 versionCode 1 versionName "1.0" } //greendao配置 greendao { //版本号,升级时可配置 schemaVersion 1 } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' //greendao依赖 compile 'org.greenrobot:greendao:3.2.0' }
三、使用
1、创建Bean对象(表名和字段名)
GreenDao需要创建Bean对象之后,该Bean对象就是表名,而它的属性值就是字段名,其实现是通过注释的方式来实现的,下面是购物车的Bean对象(每个Bean对象对应一张表)
import org.greenrobot.greendao.annotation.Entity; import org.greenrobot.greendao.annotation.Id; import org.greenrobot.greendao.annotation.Generated; /** * app实体类 */ @Entity public class app { //不能用int @Id(autoincrement = true) private Long id; private String packageName; private String label; private String versionName; private int versionCode; private String sourceDir; private String dataDir; private boolean system; private boolean installed; @Generated(hash = 1362904721) public app(Long id, String packageName, String label, String versionName, int versionCode, String sourceDir, String dataDir, boolean system, boolean installed) { this.id = id; this.packageName = packageName; this.label = label; this.versionName = versionName; this.versionCode = versionCode; this.sourceDir = sourceDir; this.dataDir = dataDir; this.system = system; this.installed = installed; } @Generated(hash = 1515546537) public app() { } public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } public String getPackageName() { return this.packageName; } public void setPackageName(String packageName) { this.packageName = packageName; } public String getLabel() { return this.label; } public void setLabel(String label) { this.label = label; } public String getVersionName() { return this.versionName; } public void setVersionName(String versionName) { this.versionName = versionName; } public int getVersionCode() { return this.versionCode; } public void setVersionCode(int versionCode) { this.versionCode = versionCode; } public String getSourceDir() { return this.sourceDir; } public void setSourceDir(String sourceDir) { this.sourceDir = sourceDir; } public String getDataDir() { return this.dataDir; } public void setDataDir(String dataDir) { this.dataDir = dataDir; } public boolean getSystem() { return this.system; } public void setSystem(boolean system) { this.system = system; } public boolean getInstalled() { return this.installed; } public void setInstalled(boolean installed) { this.installed = installed; } }
这里需要注意的是,创建完成之后,需要build gradle来完成我们的代码自动生成。自动生成的代码有
- Bean实体的构造方法和get、set方法
- DaoMaster、DaoSession、DAOS类
这里对Bean对象的注释进行解释
- @Entity:告诉GreenDao该对象为实体,只有被@Entity注释的Bean类才能被dao类操作
- @Id:对象的Id,使用Long类型作为EntityId,否则会报错。(autoincrement = true)表示主键会自增,如果false就会使用旧值
- @Property:可以自定义字段名,注意外键不能使用该属性
- @NotNull:属性不能为空
- @Transient:使用该注释的属性不会被存入数据库的字段中
- @Unique:该属性值必须在数据库中是唯一值
- @Generated:编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改
2、GreenDao数据库创建
public class MyApplication extends Application { private static DaoSession daoSession; @Override public void onCreate() { super.onCreate(); //配置数据库 setupDatabase(); } /** * 配置数据库 */ private void setupDatabase() { //创建数据库app.db" DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "app.db", null); //获取可写数据库 SQLiteDatabase db = helper.getWritableDatabase(); //获取数据库对象 DaoMaster daoMaster = new DaoMaster(db); //获取Dao对象管理者 daoSession = daoMaster.newSession(); } public static DaoSession getDaoInstant() { return daoSession; } }
可以发现,GreenDao已经将我们的数据库创建缩成几句话,代码会自动将Bean对象创建成表,不再是传统的手写SQL语句。这里的数据库创建只需要在Application中执行一次即可,这里对几个类进行解释
- DevOpenHelper:创建SQLite数据库的SQLiteOpenHelper的具体实现
- DaoMaster:GreenDao的顶级对象,作为数据库对象、用于创建表和删除表
- DaoSession:管理所有的Dao对象,Dao对象中存在着增删改查等API
由于我们已经创建好了DaoSession和Shop的Bean对象,编译后会自动生成我们的ShopDao对象,可通过DaoSession获得
AppDao dao = daoSession.getAppDao();
这里的Dao(Data Access Object)是指数据访问接口,即提供了数据库操作一些API接口,可通过dao进行增删改查操作
3、数据库的增删改查
public class utilsDao { /** * 添加数据,如果有重复则覆盖 * * @param shop */ public static void insertLove(app shop) { BaseApplication.getDaoInstant().getShopDao().insertOrReplace(shop); } /** * 删除数据 * * @param id */ public static void deleteLove(long id) { BaseApplication.getDaoInstant().getShopDao().deleteByKey(id); } /** * 更新数据 * * @param shop */ public static void updateLove(app shop) { BaseApplication.getDaoInstant().getShopDao().update(shop); } /** * 查询条件为Label=秒拍 的数据 * * @return */ public static List<app> queryLove() { return BaseApplication.getAppDao().queryBuilder().where(appDao.Properties.Label.eq("秒拍")).list(); } /** * 查询全部数据 */ public static List<app> queryAll() { return BaseApplication.getDaoInstant().getShopDao().loadAll(); } }
效果很明显,GreenDao的封装更加短小精悍,语义明朗,下面对GreenDao中Dao对象其他API的介绍
- 增加单个数据
- getShopDao().insert(shop);
- getShopDao().insertOrReplace(shop);
- 增加多个数据
- getShopDao().insertInTx(shopList);
- getShopDao().insertOrReplaceInTx(shopList);
- 查询全部
- List< Shop> list = getShopDao().loadAll();
- List< Shop> list = getShopDao().queryBuilder().list();
- 查询附加单个条件
- .where()
- .whereOr()
- 查询附加多个条件
- .where(, , ,)
- .whereOr(, , ,)
- 查询附加排序
- .orderDesc()
- .orderAsc()
- 查询限制当页个数
- .limit()
- 查询总个数
- .count()
- 修改单个数据
- getShopDao().update(shop);
- 修改多个数据
- getShopDao().updateInTx(shopList);
- 删除单个数据
- getTABUserDao().delete(user);
- 删除多个数据
- getUserDao().deleteInTx(userList);
- 删除数据ByKey
- getTABUserDao().deleteByKey();
自己封装的工具类:
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import com.xiaobai.cloneapp.domain.DaoMaster; import com.xiaobai.cloneapp.domain.DaoSession; import com.xiaobai.cloneapp.domain.dirinfo; import com.xiaobai.cloneapp.domain.dirinfoDao; import org.greenrobot.greendao.query.QueryBuilder; import java.util.List; /** * 数据库管理 */ public class DBManager { private final static String dbName = "appinfo.db"; private static DBManager mInstance; private DaoMaster.DevOpenHelper openHelper; private Context context; private DaoSession sDaoSession; private static DaoMaster sDaoMaster; public DBManager(Context context) { this.context = context; openHelper = new DaoMaster.DevOpenHelper(context, dbName, null); } /** * 获取单例引用 * * @param context * @return */ public static DBManager getInstance(Context context) { if (mInstance == null) { synchronized (DBManager.class) { if (mInstance == null) { mInstance = new DBManager(context); } } } return mInstance; } /** * 判断是否有存在数据库,如果没有则创建 * @return */ public DaoMaster getDaoMaster(String DBName){ if(sDaoMaster == null) { DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, DBName, null); sDaoMaster = new DaoMaster(helper.getWritableDatabase()); } return sDaoMaster; } /** * 获取可写数据库 */ private SQLiteDatabase getWritableDatabase() { if (openHelper == null) { openHelper = new DaoMaster.DevOpenHelper(context, dbName, null); } SQLiteDatabase db = openHelper.getWritableDatabase(); return db; } /** * 获取可读数据库 */ private SQLiteDatabase getReadableDatabase() { if (openHelper == null) { openHelper = new DaoMaster.DevOpenHelper(context, dbName, null); } SQLiteDatabase db = openHelper.getReadableDatabase(); return db; } /** * 插入dirinfo一条记录 * * @param */ public void insertDir(dirinfo dir) { DaoMaster daoMaster = new DaoMaster(getWritableDatabase()); sDaoSession = daoMaster.newSession(); dirinfoDao dirDao = sDaoSession.getDirinfoDao(); dirDao.insertOrReplace(dir); } /** * 查询用户列表 */ /** * 查询用户列表 */ public List<dirinfo> queryDirList() { DaoMaster daoMaster = new DaoMaster(getReadableDatabase()); DaoSession daoSession = daoMaster.newSession(); dirinfoDao dirDao = daoSession.getDirinfoDao(); QueryBuilder<dirinfo> qb = dirDao.queryBuilder(); List<dirinfo> list = qb.list(); return list; } public List<dirinfo> queryDirList(String DIRECTION) { DaoMaster daoMaster = new DaoMaster(getReadableDatabase()); DaoSession daoSession = daoMaster.newSession(); dirinfoDao dirDao = daoSession.getDirinfoDao(); QueryBuilder<dirinfo> qb = dirDao.queryBuilder(); qb.where(dirinfoDao.Properties.Direction.gt(DIRECTION)).orderAsc(dirinfoDao.Properties.Direction); List<dirinfo> list = qb.list(); return list; } /** * 更新一条记录 * * @param dir */ public void updatedir(dirinfo dir) { DaoMaster daoMaster = new DaoMaster(getWritableDatabase()); DaoSession daoSession = daoMaster.newSession(); dirinfoDao dirDao = daoSession.getDirinfoDao(); dirDao.update(dir); } /** * 删除一条记录 * * @param dir */ public void deleteUser(dirinfo dir) { DaoMaster daoMaster = new DaoMaster(getWritableDatabase()); DaoSession daoSession = daoMaster.newSession(); dirinfoDao dirDao = daoSession.getDirinfoDao(); dirDao.delete(dir); } /** * 删除所有数据 * * @param */ public void deleteAllDir() { DaoMaster daoMaster = new DaoMaster(getWritableDatabase()); DaoSession daoSession = daoMaster.newSession(); dirinfoDao dirDao = daoSession.getDirinfoDao(); dirDao.deleteAll(); } /** * 关闭所有的操作,数据库开启后,使用完毕要关闭 */ public void closeConnection(){ closeHelper(); closeDaoSession(); } private void closeHelper(){ if(openHelper != null){ openHelper.close(); openHelper = null; } } private void closeDaoSession(){ if(sDaoSession != null){ sDaoSession.clear(); sDaoSession = null; } } }
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
谷歌Android things物联网硬件接入阿里云IoT物联网套件实战
aliyun-iot-androidthings-nxp 谷歌Android things物联网硬件接入阿里云IoT物联网套件云端实战项目代码 https://github.com/iot-blog/aliyun-iot-android-things-nxp 1.硬件设备 android things开发板 NXP Pico i.MX7D NXP Pico i.MX7D 完整I/O接口文档 温湿度传感器 DHT12 DHT12支持I2C,淘宝有售 甲醛传感器 ZE08-CH2O ZE08支持UART,淘宝有售 设备接线 2.阿里云IoT物联网套件 2.1 开通阿里云IoT物联网套件 IoT物联网套件官网地址 2.2 创建高级版产品 产品属性定义 属性名 标识符 数据类型 描述 温度 temperature float DHT12传感器采集 湿度 humidity float DHT
- 下一篇
Fiddler - 工具配置及在ios抓取不了https的解决方法
一、首先,官网下载最新版fiddler工具: https://www.telerik.com/fiddler 二、打开fiddler,点击Tools - Options 我电脑上的各项配置如下图(也可以根据需要自己配置或参考其他百度配置): 三、配置完后重启fiddler 四、在fiddler右上角这里悬浮鼠标,观看自己电脑IP(记好这个后期有用,因为这个ip不时会变,所以每次使用建议重新查看): 或者window键+R,输入cmd,在命令行输入ipconfig,查看 五、打开手机配置网络代理(以ios为例): 设置 - 无限局域网 - 链接一个wifi - wifi最右边的小"i"图标 - 滑到最下方点击http代理的“配置代理” 服务器红框处填写刚才在fiddler或命令行得到的ip,端口号一般都是8888,除非自己做了配置; 六、获取证书: 打开ios本机的safari浏览器,地址栏输入“服务器:端口号” 例如我刚才获取的ip是172.20.15.38,那么我的地址输入就是http://172.20.15.38:8888 看到页面如下: 七、安装证书:点击空框位...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS8安装Docker,最新的服务器搭配容器使用