ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【Android】GreenDao数据库的使用方式 [打印本页]

作者: 小秦哥    时间: 2024-9-17 23:12
标题: 【Android】GreenDao数据库的使用方式
需求

使用GreenDao数据库进行数据的存储。
介绍

GreenDao 是一个轻量级的对象关系映射(ORM)库,用于简化 Android 应用中的数据库操作。它提供了以下主要功能:
简化数据库操作:通过注解界说实体类,GreenDao 自动生成 DAO(数据访问对象)类,简化了数据库的增、删、改、查操作。
高性能:GreenDao 设计目标之一是高效地执行数据库操作,尤其在处置惩罚大量数据时体现出色。
自动生成代码:通过编译时生成代码,减少了手动编写 SQL 和数据处置惩罚逻辑的需要。
变乱支持:支持数据库变乱,确保数据操作的原子性和同等性。
机动性:可以通过自界说查询和批量操作,满意复杂的数据处置惩罚需求。
小巧:库体积小,得当需要轻量级 ORM 的应用。
集成

在 build.gradle 文件中添加 GreenDao 依赖:
  1. implementation 'org.greenrobot:greendao:3.3.0'
复制代码
设置 build.gradle 以生成 DAO 类。添加插件和设置:
  1. apply plugin: 'org.greenrobot.greendao'
  2. greendao {
  3.     schemaVersion 1 //定义数据库的版本号,用于处理数据库升级。
  4.     daoPackage 'com.example.dao' //指定生成的 DAO 类包名。
  5.     targetGenDir 'src/main/java' //指定生成的实体类包名。
  6. }
复制代码
使用

创建实体类:
使用 GreenDao 提供的注解界说实体类。举例:
  1. @Entity
  2. public class UpdateBean{
  3.      @Id(autoincrement = true)
  4.     private Long id;
  5.     private String name;
  6.     // getters and setters
  7. }
复制代码
创建实体类之后,使用Build重新构建一下项目,然后会自动生成相关文件
【DaoMaster】【DaoSession】【UpdateBeanDao】
创建一个帮助类 【UpdateOpenHelper】
  1. public class UpdateOpenHelper extends DaoMaster.OpenHelper {
  2.     public UpdateOpenHelper(Context context, String name) {
  3.         super(context, name);
  4.     }
  5.     public UpdateOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
  6.         super(context, name, factory);
  7.     }
  8.     @Override
  9.     public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  10.         DaoMaster.dropAllTables(wrap(db), true);
  11.     }
  12.    
  13.     @Override
  14.     public void onUpgrade(Database db, int oldVersion, int newVersion) {
  15.         super.onUpgrade(db, oldVersion, newVersion);
  16.     }
  17. }
复制代码
创建一个管理类【UpdateManager 】
  1. public class UpdateManager {
  2.     private Context mContext;
  3.     private static UpdateManager manager = new UpdateManager();
  4.     private static ConcurrentHashMap<String, DaoMaster> masterMap = new ConcurrentHashMap<>();
  5.     private static ConcurrentHashMap<String, DaoSession> daoSessionMap = new ConcurrentHashMap<>();
  6.     private static ConcurrentHashMap<String, UpdateOpenHelper> helperMap = new ConcurrentHashMap<>();
  7.     public static UpdateManager getInstance() {
  8.         return manager;
  9.     }
  10.     public void init(Context context) {
  11.         this.mContext = context;
  12.     }
  13.     private DaoMaster getDaoMaster(String dbName) {
  14.         if (!masterMap.containsKey(dbName)) {
  15.             UpdateOpenHelper openHelper = helperMap.get(dbName);
  16.             if (openHelper == null) {
  17.                 UGDaoContext daoContext = new UGDaoContext(mContext);
  18.                 openHelper = new UpdateOpenHelper(daoContext, dbName, null);
  19.                 helperMap.put(dbName, openHelper);
  20.             }
  21.             DaoMaster master;
  22.             try {
  23.                 master = new DaoMaster(openHelper.getWritableDatabase());
  24.                 masterMap.put(dbName, master);
  25.             } catch (Exception e) {
  26.                 e.printStackTrace();
  27.             }
  28.         }
  29.         return masterMap.get(dbName);
  30.     }
  31.     public DaoSession getDaoSession(String dbName) {
  32.         if (!daoSessionMap.containsKey(dbName)) {
  33.             DaoMaster master = getDaoMaster(dbName);
  34.             if (master != null) {
  35.                 DaoSession session = master.newSession();
  36.                 daoSessionMap.put(dbName, session);
  37.             }
  38.         }
  39.         return daoSessionMap.get(dbName);
  40.     }
  41.     /**
  42.      * 关闭指定数据库连接
  43.      *
  44.      * @param dbName 数据库名字
  45.      */
  46.     public void closeConnection(String dbName) {
  47.         DaoSession session = daoSessionMap.get(dbName);
  48.         if (session != null) {
  49.             session.clear();
  50.             daoSessionMap.remove(dbName);
  51.         }
  52.         DaoMaster master = masterMap.get(dbName);
  53.         if (master != null) {
  54.             master = null;
  55.             masterMap.remove(dbName);
  56.         }
  57.         UpdateOpenHelper helper = helperMap.get(dbName);
  58.         if (helper != null) {
  59.             helper.close();
  60.             helperMap.remove(dbName);
  61.         }
  62.     }
  63.     /**
  64.      * 关闭所有数据库连接
  65.      */
  66.     public void closeAllConnection() {
  67.         // 关闭所有DaoSessions
  68.         synchronized (this) {
  69.             for (String dbName : daoSessionMap.keySet()) {
  70.                 closeConnection(dbName); // 关闭每一个连接
  71.             }
  72.             // 额外步骤:清理所有映射
  73.             daoSessionMap.clear();
  74.             masterMap.clear();
  75.             helperMap.clear();
  76.         }
  77.     }
  78. }
复制代码
还有需要修改数据库的文件的存储路径,GreenDao数据库默认的存储路径是在应用内部私有存储,以是假如删除了应用之后,数据文件也会被删除,同时也不利于外部查找数据库文件。
创建【UGDaoContext】修改数据库文件地点
  1. public class UGDaoContext extends ContextWrapper {
  2.     public UGDaoContext(Context base) {
  3.         super(base);
  4.     }
  5.     @Override
  6.     public File getDatabasePath(String name) {
  7.         String dbDir;
  8.         boolean isExistSDCar = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
  9.         if (isExistSDCar) {
  10.             dbDir = Environment.getExternalStorageDirectory().getAbsolutePath();
  11.         } else {
  12.             dbDir = Environment.getDataDirectory().getAbsolutePath();
  13.         }
  14.         String dbDirPath = dbDir + File.separator + "app_dao" + File.separator + "data_update";
  15.         Log.d("TAG", "数据库的文件夹地址:" + dbDirPath);
  16.         File dbDirFile = new File(dbDirPath);
  17.         if (!dbDirFile.exists()) {
  18.             dbDirFile.mkdirs();
  19.         }
  20.         String dbNamePath = dbDirPath + File.separator + name;
  21.         File dbNameFile = new File(dbNamePath);
  22.         boolean isSuccess = false;
  23.         if (!dbNameFile.exists()) {
  24.             try {
  25.                 isSuccess = dbNameFile.createNewFile();
  26.             } catch (IOException e) {
  27.                 e.printStackTrace();
  28.             }
  29.         } else {
  30.             isSuccess = true;
  31.         }
  32.         if (isSuccess) {
  33.             Log.d("TAG", "数据库的文件地址:" + dbNamePath);
  34.             return dbNameFile;
  35.         } else {
  36.             return super.getDatabasePath(name);
  37.         }
  38.     }
  39.     @Override
  40.     public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) {
  41.         return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
  42.     }
  43.     @Override
  44.     public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) {
  45.         return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
  46.     }
  47. }
复制代码
接下里再创建一个工具类实现对数据库的操作【UpdateDaoUtil】
  1. public class UpdateDaoUtil {
  2.     private UpdateManager manager;
  3.     public UpdateDaoUtil(Context context) {
  4.         manager = UpdateManager.getInstance();
  5.         manager.init(context);
  6.     }
  7.     /**
  8.      * 完成UpdateBean记录的插入
  9.      */
  10.     public synchronized boolean insertUpdate(UpdateBean updateBean, String dbName) {
  11.         boolean flag = false;
  12.         if (manager.getDaoSession(dbName).getUpdateBeanDao().insert(updateBean) != -1) {
  13.             flag = true;
  14.         }
  15.         return flag;
  16.     }
  17.     /**
  18.      * 完成UpdateBean记录的插入
  19.      */
  20.     public synchronized boolean insertUpdate(UpdateBean updateBean) {
  21.         boolean flag = false;
  22.         if (manager.getDaoSession(getCurrentDBName()).getUpdateBeanDao().insert(updateBean) != -1) {
  23.             flag = true;
  24.         }
  25.         return flag;
  26.     }
  27.     /**
  28.      * 完成UpdateBean列表记录的插入
  29.      */
  30.     public synchronized boolean insertUpdate(List<UpdateBean> list) {
  31.         int frequency = 0;
  32.         UpdateBeanDao dao = manager.getDaoSession(getCurrentDBName()).getUpdateBeanDao();
  33.         for (UpdateBean updateBean : list) {
  34.             if (dao.insert(updateBean) == -1) {
  35.                 frequency++;
  36.             }
  37.         }
  38.         return frequency == 0;
  39.     }
  40.     /**
  41.      * 删除单条记录
  42.      */
  43.     public synchronized boolean deleteUpdateBean(UpdateBean updateBean, String dbName) {
  44.         boolean flag = false;
  45.         try {
  46.             manager.getDaoSession(dbName).delete(updateBean);
  47.             flag = true;
  48.         } catch (Exception e) {
  49.             e.printStackTrace();
  50.         }
  51.         return flag;
  52.     }
  53.     /**
  54.      * 删除单条记录
  55.      */
  56.     public synchronized boolean deleteUpdateBean(UpdateBean updateBean) {
  57.         boolean flag = false;
  58.         try {
  59.             manager.getDaoSession(getCurrentDBName()).delete(updateBean);
  60.             flag = true;
  61.         } catch (Exception e) {
  62.             e.printStackTrace();
  63.         }
  64.         return flag;
  65.     }
  66.     /**
  67.      * 删除所有记录
  68.      */
  69.     public synchronized boolean deleteAll(String dbname) {
  70.         boolean flag = false;
  71.         try {
  72.             manager.getDaoSession(dbname).deleteAll(UpdateBean.class);
  73.             flag = true;
  74.         } catch (Exception e) {
  75.             e.printStackTrace();
  76.         }
  77.         return flag;
  78.     }
  79.     /**
  80.      * 删除所有记录
  81.      */
  82.     public synchronized boolean deleteAll() {
  83.         boolean flag = false;
  84.         try {
  85.             manager.getDaoSession(getCurrentDBName()).deleteAll(UpdateBean.class);
  86.             flag = true;
  87.         } catch (Exception e) {
  88.             e.printStackTrace();
  89.         }
  90.         return flag;
  91.     }
  92.     /**
  93.      * 查询数据库前 number 条数据
  94.      */
  95.     public synchronized List<UpdateBean> queryDataNumber(int number, String dbname) {
  96.         QueryBuilder<UpdateBean> queryBuilder = manager.getDaoSession(dbname).queryBuilder(UpdateBean.class);
  97.         return queryBuilder.limit(number).list();
  98.     }
  99.     /**
  100.      * 查询数据库前 number 条数据
  101.      */
  102.     public synchronized List<UpdateBean> queryDataNumber(int number) {
  103.         QueryBuilder<UpdateBean> queryBuilder = manager.getDaoSession(getCurrentDBName()).queryBuilder(UpdateBean.class);
  104.         return queryBuilder.limit(number).list();
  105.     }
  106.     /**
  107.      * 删除数据库前 number 条数据
  108.      */
  109.     public synchronized void deleteDataNumber(int number, String dbname) {
  110.         UpdateBeanDao dao = manager.getDaoSession(dbname).getUpdateBeanDao();
  111.         List<UpdateBean> lists = dao.queryBuilder().limit(number).list();
  112.         dao.deleteInTx(lists);
  113.     }
  114.     /**
  115.      * 删除数据库前 number 条数据
  116.      */
  117.     public synchronized void deleteDataNumber(int number) {
  118.         UpdateBeanDao dao = manager.getDaoSession(getCurrentDBName()).getUpdateBeanDao();
  119.         List<UpdateBean> lists = dao.queryBuilder().limit(number).list();
  120.         dao.deleteInTx(lists);
  121.     }
  122.     /**
  123.      * 查询所有记录
  124.      */
  125.     public synchronized List<UpdateBean> queryAll(String dbName) {
  126.         return manager.getDaoSession(dbName).loadAll(UpdateBean.class);
  127.     }
  128.     /**
  129.      * 查询所有记录
  130.      */
  131.     public synchronized List<UpdateBean> queryAll() {
  132.         return manager.getDaoSession(getCurrentDBName()).loadAll(UpdateBean.class);
  133.     }
  134.     /**
  135.      * 使用指定名称的数据库,每次查询200条未上传的数据
  136.      *
  137.      * @param dbname 数据库表名称
  138.      */
  139.     public synchronized List<UpdateBean> queryListUpdate(String dbname) {
  140.         QueryBuilder<UpdateBean> queryBuilder = manager.getDaoSession(dbname).queryBuilder(UpdateBean.class);
  141.         return queryBuilder.where(UpdateBeanDao.Properties.IsUpdate.eq(0)).limit(200).list();
  142.     }
  143.     /**
  144.      * 更新是否上传状态
  145.      *
  146.      * @param list 上传数据的ID的list
  147.      */
  148.     public synchronized void updateStatus(List<Long> list) {
  149.         DaoSession daoSession = manager.getDaoSession(getCurrentDBName());
  150.         UpdateBeanDao updateBeanDao = daoSession.getUpdateBeanDao();
  151.         try {
  152.             daoSession.runInTx(() -> {
  153.                 for (Long id : list) {
  154.                     UpdateBean bean = updateBeanDao.load(id);
  155.                     if (bean != null) {
  156.                         bean.setIsUpdate(1);
  157.                         updateBeanDao.update(bean);
  158.                     }
  159.                 }
  160.             });
  161.         } catch (Exception e) {
  162.             e.printStackTrace();
  163.         }
  164.     }
  165.     /**
  166.      * 更新是否上传状态
  167.      *
  168.      * @param dbName 数据库表名字
  169.      * @param list   上传数据的ID的list
  170.      */
  171.     public synchronized void updateStatus(String dbName, List<Long> list) {
  172.         DaoSession daoSession = manager.getDaoSession(dbName);
  173.         UpdateBeanDao updateBeanDao = daoSession.getUpdateBeanDao();
  174.         try {
  175.             daoSession.runInTx(() -> {
  176.                 for (Long id : list) {
  177.                     UpdateBean bean = updateBeanDao.load(id);
  178.                     if (bean != null) {
  179.                         bean.setIsUpdate(1);
  180.                         updateBeanDao.update(bean);
  181.                     }
  182.                 }
  183.             });
  184.         } catch (Exception e) {
  185.             e.printStackTrace();
  186.         }
  187.     }
  188.     /**
  189.      * 使用queryBuilder进行查询未上传的数据
  190.      */
  191.     public synchronized List<UpdateBean> queryItemByQueryBuilder(int isUpdate) {
  192.         QueryBuilder<UpdateBean> queryBuilder = manager.getDaoSession(getCurrentDBName()).queryBuilder(UpdateBean.class);
  193.         return queryBuilder.where(UpdateBeanDao.Properties.IsUpdate.eq(isUpdate)).limit(100).list();
  194.     }
  195.     /**
  196.      * 关闭当前日期资源
  197.      */
  198.     public synchronized void close() {
  199.         manager.closeConnection(getCurrentDBName());
  200.     }
  201.     /**
  202.      * 关闭特定名字的数据资源
  203.      */
  204.     public synchronized void close(String dbName) {
  205.         manager.closeConnection(dbName);
  206.     }
  207.     /**
  208.      * 关闭所有连接
  209.      */
  210.     public synchronized void closeAll() {
  211.         manager.closeAllConnection();
  212.     }
  213.     /**
  214.      * 数据表的名称是当天的日期
  215.      *
  216.      * @return 当天日期
  217.      */
  218.     private static String getCurrentDateFormatted() {
  219.         long currentTimeMillis = System.currentTimeMillis();
  220.         Date date = new Date(currentTimeMillis);
  221.         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd", Locale.getDefault());
  222.         return sdf.format(date);
  223.     }
  224.     /**
  225.      * 获取当天数据库表的名称
  226.      */
  227.     private static String getCurrentDBName() {
  228.         return getCurrentDateFormatted() + "_db";
  229.     }
  230.     /**
  231.      * 组装数据库名字
  232.      *
  233.      * @param dateTime 日期时间 例如 20240814
  234.      */
  235.     public static String setDBName(String dateTime) {
  236.         return dateTime + "_db";
  237.     }
  238. }
复制代码
这样根本上一个数据库就创建了,剩下就是如何使用了。
  1. UpdateDaoUtil updateDaoUtil;
复制代码
  1. updateDaoUtil = new UpdateDaoUtil(this);
复制代码
  1.    if (updateDaoUtil != null) {
  2.                     Log.i("TAG", "将List数据存入本地数据库,存入条数 " + updateBeanList.size());
  3.                     List<UpdateBean> list = new ArrayList<>(updateBeanList);
  4.                     boolean update = updateDaoUtil.insertUpdate(list);
  5.                     if (update) {
  6.                         Log.i("TAG", "数据存入数据库正常");
  7.                   
  8.                     }
  9.                 }
复制代码
记得烧毁
  1.     @Override
  2.     protected void onDestroy() {
  3.         super.onDestroy();
  4.         if (updateDaoUtil != null) {
  5.             updateDaoUtil.closeAll();
  6.         }
  7.     }
复制代码
GreenDao数据库的根本使用方式就是这样了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4