• Android,GreenDao数据库框架


    1 基本介绍

    1.1 概念

    GreenDao是一个基于SQLite的Android ORM嵌入式关系数据库,通过将 Java 对象映射到数据库表(称为 ORM,“对象/关系映射”) ,使用一个简单的面向对象的 API 来存储、更新、删除和查询 Java 对象。

    开源Github地址 https://github.com/greenrobot/greenDAO

    1.2 特点

    • 最佳性能 (可能是 Android 中最快的 ORM) ,基准测试也是开源的;
    • 易于使用的功能强大的 api,涵盖关系和连接;
    • 最小的内存消耗;
    • 小型库大小(< 100KB) ,以保持较低的构建时间,并避免65k 方法限制;
    • 数据库加密:greenDAO 支持 SQLCipher 来保证用户数据的安全;
    • 强大而活跃的社区交流支持。

    2 使用GreenDao

    2.1 引入依赖

    2.1.1 项目目录下.gradle配置

    1. buildscript {
    2. repositories {
    3. google()
    4. jcenter()
    5. // GreenDao仓库
    6. mavenCentral()
    7. }
    8. dependencies {
    9. classpath 'com.android.tools.build:gradle:3.5.4'
    10. // GreenDao插件
    11. classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0'
    12. }
    13. }

    2.1.2 app目录下.gradle配置

    1. apply plugin: 'com.android.application'
    2. //GreenDao插件
    3. apply plugin: 'org.greenrobot.greendao'
    1. dependencies {
    2. // GreenDao依赖添加
    3. implementation 'org.greenrobot:greendao:3.3.0'
    4. }

    2.2 app目录下.gradle配置greenDao基本信息

    1. greendao {
    2. // 数据库版本号
    3. schemaVersion 1
    4. // 生成数据库文件的目录
    5. targetGenDir 'src/main/java'
    6. // 生成的数据库相关文件的包名
    7. daoPackage 'com.clc.greendao_demo.greendao.gen'
    8. }

    2.3 创建实体类

    1. @Entity
    2. public class User {
    3. @Id(autoincrement = true)
    4. private Long id;
    5. @Unique
    6. private String userId;
    7. @Property
    8. private String userName;
    9. @Property
    10. private int age;
    11. }

    2.4 生成关键类

    创建好实体类,接着Make project(点击小锤子图标),便发现GreenDao为我们的User实体类生成了对应的Getter、Setter方法以及俩个构造函数,同时在我们配置的com.nianlun.greendao.gen包下生成了三个对应类文件DaoMasterDaoSessionUserDao,之后所有相关的数据库操作都依靠这三个文件

    • DaoMaster:使用greenDAO的切入点。DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的DAO类(而不是对象)。 它具有静态方法来创建表或将它们删除。 其内部类OpenHelper和DevOpenHelper是在SQLite数据库中创建模式的SQLiteOpenHelper实现。一个DaoMaster就代表着一个数据库的连接;
    • DaoSession:管理特定模式的所有可用DAO对象,您可以使用其中一个getter方法获取。 DaoSession还为实体提供了一些通用的持久性方法,如插入,加载,更新,刷新和删除。 DaoSession可以让我们使用一些Entity的基本操作和获取Dao操作类,DaoSession可以创建多个,每一个都是属于同一个数据库连接的;
    • XxxDAO:数据访问对象(DAO)持续存在并查询实体。 对于每个实体,GreenDAO生成一个DAO。 它比DaoSession有更多的持久化方法,如增、删、改、查。

    2.5 暴露公共方法

    自动生成GreenDao关键类后,我们要暴露一些公共方法,例如数据库初始化、数据表的增删改查。

    1. public class DaoManager {
    2. private static final String TAG = DaoManager.class.getSimpleName();
    3. private static final String DB_NAME = "CLC_DB";
    4. private DaoMaster mDaoMaster;
    5. private DaoMaster.DevOpenHelper mHelper;
    6. private DaoSession mDaoSession;
    7. private UserDao mUserDao;
    8. private static class SingletonHolder {
    9. private static DaoManager instance;
    10. }
    11. public static DaoManager getInstance() {
    12. return SingletonHolder.instance;
    13. }
    14. public static void init(Application application) {
    15. SingletonHolder.instance = new DaoManager(application);
    16. }
    17. private DaoManager(Application application) {
    18. setDebug();
    19. mHelper = new DaoMaster.DevOpenHelper(application, DB_NAME, null);
    20. mDaoMaster = new DaoMaster(mHelper.getWritableDatabase());
    21. mDaoSession = mDaoMaster.newSession();
    22. mUserDao = mDaoSession.getUserDao();
    23. }
    24. /**
    25. * 打开输出日志,默认关闭
    26. */
    27. public void setDebug() {
    28. if (BuildConfig.DEBUG) {
    29. QueryBuilder.LOG_SQL = true;
    30. QueryBuilder.LOG_VALUES = true;
    31. }
    32. }
    33. /**
    34. * 关闭所有的操作,数据库开启后,使用完毕要关闭
    35. */
    36. public void closeConnection() {
    37. closeHelper();
    38. closeDaoSession();
    39. }
    40. public void closeHelper() {
    41. if (mHelper != null) {
    42. mHelper.close();
    43. mHelper = null;
    44. }
    45. }
    46. public void closeDaoSession() {
    47. if (mDaoSession != null) {
    48. mDaoSession.clear();
    49. mDaoSession = null;
    50. }
    51. }
    52. /**
    53. * 增
    54. */
    55. public long insert(User user) {
    56. return mUserDao.insert(user);
    57. }
    58. /**
    59. * 查
    60. */
    61. public List<User> searchAll() {
    62. return mUserDao.queryBuilder().list();
    63. }
    64. }

    2.6 测试

    1. public class MainActivity extends AppCompatActivity {
    2. private static final String TAG = "MainActivity___";
    3. @Override
    4. protected void onCreate(Bundle savedInstanceState) {
    5. super.onCreate(savedInstanceState);
    6. setContentView(R.layout.activity_main);
    7. DaoManager.init(getApplication());
    8. }
    9. @Override
    10. protected void onResume() {
    11. super.onResume();
    12. User user1 = new User(null, "111", "qqq", 33);
    13. DaoManager.getInstance().insert(user1);
    14. User user2 = new User(null, "222", "qqq", 33);
    15. DaoManager.getInstance().insert(user2);
    16. User user3 = new User(null, "333", "qqq", 33);
    17. DaoManager.getInstance().insert(user3);
    18. List<User> users = DaoManager.getInstance().searchAll();
    19. Log.d(TAG, "onResume: " + users);
    20. }
    21. }

     运行

    3 扩展

    3.1 GreenDao常用注解

    3.1.1 实体@Entity注解

    schema:告知GreenDao当前实体属于哪个schema
    active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
    nameInDb:在数据中使用的别名,默认使用的是实体的类名
    indexes:定义索引,可以跨越多个列
    createInDb:标记创建数据库表

    3.1.2 基础属性注解

    @Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
    @Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property (nameInDb="name")
    @NotNul:设置数据库表当前列不能为空
    @Transient :添加次标记之后不会生成数据库表的列

    3.1.3 索引注解

    @Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
    @Unique:向数据库列添加了一个唯一的约束

    3.1.4 关系注解

    @ToOne:定义与另一个实体(一个实体对象)的关系
    @ToMany:定义与多个实体对象的关系

    3.2 增删改查api

    3.2.1 insert

    3.2.2 delete

    自定义条件删除

    mUserDao.queryBuilder().where(UserDao.Properties.Age.eq(33)).buildDelete().executeDeleteWithoutDetachingEntities()
    

    3.2.3 update​​​​​​​

    3.2.4 query

    查询所有 mUserDao.queryBuilder().list()
    按条件查询 mUserDao.queryBuilder().where(UserDao.Properties.Age.eq(33)).list()
    

    4 常见问题

    4.1 GreenDao版本与Gradle版本不兼容

    demo:com.android.tools.build:gradle:4.0.1 + gradle-6.4.1-all.zip

    一开始使用greenDao版本是3.2.2,项目编译不通过;后来提高greenDao版本到3.3.0就正常了。

    报错信息

    1. Unable to find method 'org.gradle.api.tasks.TaskInputs.property(Ljava/lang/String;Ljava/lang/Object;)Lorg/gradle/api/tasks/TaskInputs;'.
    2. Possible causes for this unexpected error include:
    3. Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
    4. Re-download dependencies and sync project (requires network)
    5. The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem.
    6. Stop Gradle build processes (requires restart)
    7. Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.
    8. In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.

  • 相关阅读:
    【Python爬虫+数据分析】采集电商平台数据信息采集|电商API数据采集接口接入
    剖析SGI STL内存池总结
    计算机视觉的应用14-目标检测经典算法之YOLOv1-YOLOv5的模型架构与改进过程详解,便于记忆
    PMP商业分析概述
    阿里测试8年,从5K到40K,这178天的心酸只有我自己知道···
    大厂产品经理面试题合集100篇(二)-社招产品经理简历如何写?
    Splunk的转发器扮演什么角色?
    数据结构栈的使用——马踏棋盘
    java毕业设计网上商城系统源码+lw文档+mybatis+系统+mysql数据库+调试
    Python 中的 Urljoin 简介
  • 原文地址:https://blog.csdn.net/qq_38861828/article/details/125482579