GreenDao讲解与使用
学习参考资料:https://blog.csdn.net/speedystone/article/details/72769793
“GreenDAO 是一款开源的面向 Android 的轻便、快捷的 ORM 框架,将 Java 对象映射到 SQLite 数据库中,我们操作数据库的时候,不在需要编写复杂的 SQL语句, 在性能方面,GreenDAO 针对 Android 进行了高度优化, 最小的内存开销 、依赖体积小 同时还是支持数据库加密。”
优点:
官网中明确指明了其首要设计目标:
Maximum performance (probably the fastest ORM for Android):系能最大化
Easy to use APIs:便于使用
Highly optimized for Android:对于Android高度优化
Minimal memory consumption:最小化内存开销
Small library size, focus on the essentials:较小的文件体积,只集中在必要的部分上。
1.ORM(Object Relational Mapping)对象关系映射,可以非常便捷的将Java 对象映射到 SQLite 数据库中保存。
2.高性能:官网测试结果:插入和更新的速度是sqlite的2倍,加载实体的速度是ormlite的4.5倍
image.png
3.支持加密
4.轻量级:GreenDao 核心库小于100k ,所以我们并不会担心添加 GreenDao 后 APK 大小会变的是否庞大。
5.支持 protocol buffer(protobuf) 协议:GreenDao 支持 protocol buffer(protobuf) 协议数据的直接存储,如果你通过 protobuf 协议与服务器交互,将不需要任何的映射。
6.代码生成:greenDAO 会根据配置信息自动生成核心管理类以及 DAO 对象
7.开源
核心关系:
image.png
集成:
a、设置仓库与插件(Project: build.gradle)
buildscript { repositories { jcenter() mavenCentral() // add repository } dependencies { classpath 'com.android.tools.build:gradle:2.3.2' classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin }}
b、 配置依赖 ( Module:app build.gradle )
apply plugin: 'com.android.application'apply plugin: 'org.greenrobot.greendao' // apply plugindependencies { compile 'org.greenrobot:greendao:3.2.2' // add library // This is only needed if you want to use encrypted databases compile 'net.zetetic:android-database-sqlcipher:3.5.6'//加密库依赖(可选项)}
c、 配置数据库相关信息 ( Module:app build.gradle )
greendao { schemaVersion 1 //数据库版本号 daoPackage 'com.speedystone.greendaodemo.db'// 设置DaoMaster、DaoSession、Dao 包名 targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录}
d、点击 : Sync Project with Gradle Files 按钮,同步一下工程 , 配置完成
使用方法:
@Entitypublic class User { @Id(autoincrement = true) private Long id; //这里设置Long并自增,这在创建对象时,id设置为null可以交给数据库自己去自增 //如果设置为long则需要传值,并不能自增了 @Unique //该属性数据库里只能有唯一值 private String name; @Property(nameInDb = "age") //这里表示此参数在数据库中的表结构名称为“age”,否则默认为“AGE”大写 private int age; ... ...}
点击 Make Project(或者 Make Moudle ‘App’) 编译一下工程 。如果配置正确,会在配置的包目录下自动会生成 DaoMaster,DaoSession 和 UserDao 类 。
初始化:
public class MyApp extends Application { private DaoSession daoSession; @Override public void onCreate() { super.onCreate(); initGreenDao(); } /** * 初始化Dao */ private void initGreenDao() { //这里采用自定义的OpenHelper DbHelper helper = new DbHelper(this, "test,db");// DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "test.db"); SQLiteDatabase db = helper.getWritableDatabase();// 加密数据库// Database db = helper.getEncryptedReadableDb("123456"); DaoMaster daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); } /** * 获取dao实例 * @return */ public DaoSession getDaoSession(){ return daoSession; }}
自定义OpenHelper
public class DbHelper extends DaoMaster.DevOpenHelper { public DbHelper(Context context, String name) { super(context, name); } public DbHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) { super(context, name, factory); } @Override public void onUpgrade(Database db, int oldVersion, int newVersion) { super.onUpgrade(db, oldVersion, newVersion); Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion ); if(newVersion == 2){ // 修改 USER 表 //这里添加升级数据库后修改的表结构 db.execSQL("ALTER TABLE 'USER' ADD 'NICKNAME' String"); } }}
操作方法:
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { private UserDao userDao; private String TAG = "greenDaoDemo"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView(); initDao(); initData(); QueryBuilder.LOG_SQL = true; QueryBuilder.LOG_VALUES = true; } /** * 懒加载 */ public void lazyInit(){ LazyList users = userDao.queryBuilder().listLazy(); for(User u :users){ Log.i(TAG,"用户名:"+u.getName()); } } /** * 分页查询 * @return */ public List pageQuery(){// 从第二条数据开始查5条 return userDao.queryBuilder().offset(2).limit(5).list(); } public void insertOrResplace(User user){ userDao.insertOrReplace(user); } public void delete(User user){ userDao.delete(user); } public void deleteByUserId(long id){ userDao.deleteByKey(id); } public void updata(User user){ userDao.update(user); } public List queryAll(){ return userDao.loadAll();//查询所有记录 } public User queryById(long id){ return userDao.loadByRowId(id); } public List query10(){ return userDao.queryRaw("AEG>?","10"); } public List query102(){ QueryBuilder builder = userDao.queryBuilder(); return builder.where(UserDao.Properties.Age.gt(10)).build().list(); } private void initData() { User user = new User(null,"小明",16);// user.setId(Null);// user.setName("小明");// user.setAge(16); userDao.insert(user); } private void initDao() { MyApp application = (MyApp) getApplication(); DaoSession daoSession = application.getDaoSession(); userDao = daoSession.getUserDao(); } ... ...
注解:
@Entity
表明这个实体类会在数据库中生成一个与之相对应的表
属性:
schema:告知GreenDao当前实体属于哪个 schema
schema active:标记一个实体处于活跃状态,活动实体有更新、删除和刷新方法
nameInDb:在数据库中使用的别名,默认使用的是实体的类名,
indexes:定义索引,可以跨越多个列
createInDb:标记创建数据库表(默认:true)
generateConstructors 自动创建全参构造方法(同时会生成一个无参构造方法)(默认:true)
generateGettersSetters 自动生成 getters and setters 方法(默认:true)
@Entity( schema = "myschema", active = true, nameInDb = "AWESOME_USERS", indexes = { @Index(value = "name DESC", unique = true) }, createInDb = true, generateConstructors = false, generateGettersSetters = true)public class User { ...}
@Id
对应数据表中的 Id 字段
@Index
使用@Index作为一个属性来创建一个索引,默认是使用字段名
@Property
设置一个非默认关系映射所对应的列名,默认是使用字段名,例如:@Property(nameInDb = “userName”)
@NotNull
设置数据库表当前列不能为空
@Transient
添加此标记后不会生成数据库表的列
@Unique
表名该属性在数据库中只能有唯一值
@ToOne
表示一对一关系
@Entitypublic class Order { @Id private long id; private long customerId; @ToOne(joinProperty = "customerId") //一对一关系 private Customer customer; ... ...
@OrderBy
更加某一字段排序 ,例如:@OrderBy(“date ASC”)
@ToMany
定义一对多个实体对象的关系
@Entitypublic class Customer { @Id private Long id; @ToMany(referencedJoinProperty = "customerId") @OrderBy("date ASC") private List orders;}@Entitypublic class Order { @Id private Long id; private Date date; private long customerId;}
通过 @Convert 注解转换数据类型
例如:将枚举类型转换成整形
@Entitypublic class User { @Id private Long id; @Convert(converter = RoleConverter.class, columnType = Integer.class) private Role role; public enum Role { DEFAULT(0), AUTHOR(1), ADMIN(2); final int id; Role(int id) { this.id = id; } } public static class RoleConverter implements PropertyConverter { @Override public Role convertToEntityProperty(Integer databaseValue) { if (databaseValue == null) { return null; } for (Role role : Role.values()) { if (role.id == databaseValue) { return role; } } return Role.DEFAULT; } @Override public Integer convertToDatabaseValue(Role entityProperty) { return entityProperty == null ? null : entityProperty.id; } }
混淆配置:
### greenDAO 3-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {public static java.lang.String TABLENAME;}-keep class **$Properties# If you do not use SQLCipher:-dontwarn org.greenrobot.greendao.database.**# If you do not use RxJava:-dontwarn rx.**### greenDAO 2-keepclassmembers class * extends de.greenrobot.dao.AbstractDao {public static java.lang.String TABLENAME;}-keep class **$Properties
更多相关文章
- SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
- Android《第五章:ContentProvider》
- Android.Could not find *.apk in android 2.1
- Android(安卓)Room牛刀小试
- Android(安卓)registerContentObserver 接口监视数据库变化
- 安卓数据库连接解决办法 ,避免 sqlite3 database is locked
- Android中进入页面默认定位到ListView的第一条数据解决方法
- 学习ContentProvider---之一:查询数据库
- 10、Android数据存储