需求
使用GreenDao数据库进行数据的存储。
介绍
GreenDao 是一个轻量级的对象关系映射(ORM)库,用于简化 Android 应用中的数据库操作。它提供了以下主要功能:
简化数据库操作:通过注解界说实体类,GreenDao 自动生成 DAO(数据访问对象)类,简化了数据库的增、删、改、查操作。
高性能:GreenDao 设计目标之一是高效地执行数据库操作,尤其在处置惩罚大量数据时体现出色。
自动生成代码:通过编译时生成代码,减少了手动编写 SQL 和数据处置惩罚逻辑的需要。
变乱支持:支持数据库变乱,确保数据操作的原子性和同等性。
机动性:可以通过自界说查询和批量操作,满意复杂的数据处置惩罚需求。
小巧:库体积小,得当需要轻量级 ORM 的应用。
集成
在 build.gradle 文件中添加 GreenDao 依赖:
- implementation 'org.greenrobot:greendao:3.3.0'
复制代码 设置 build.gradle 以生成 DAO 类。添加插件和设置:
- apply plugin: 'org.greenrobot.greendao'
- greendao {
- schemaVersion 1 //定义数据库的版本号,用于处理数据库升级。
- daoPackage 'com.example.dao' //指定生成的 DAO 类包名。
- targetGenDir 'src/main/java' //指定生成的实体类包名。
- }
复制代码 使用
创建实体类:
使用 GreenDao 提供的注解界说实体类。举例:
- @Entity
- public class UpdateBean{
- @Id(autoincrement = true)
- private Long id;
- private String name;
- // getters and setters
- }
复制代码 创建实体类之后,使用Build重新构建一下项目,然后会自动生成相关文件
【DaoMaster】【DaoSession】【UpdateBeanDao】
创建一个帮助类 【UpdateOpenHelper】
- public class UpdateOpenHelper extends DaoMaster.OpenHelper {
- public UpdateOpenHelper(Context context, String name) {
- super(context, name);
- }
- public UpdateOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
- super(context, name, factory);
- }
- @Override
- public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- DaoMaster.dropAllTables(wrap(db), true);
- }
-
- @Override
- public void onUpgrade(Database db, int oldVersion, int newVersion) {
- super.onUpgrade(db, oldVersion, newVersion);
- }
- }
复制代码 创建一个管理类【UpdateManager 】
- public class UpdateManager {
- private Context mContext;
- private static UpdateManager manager = new UpdateManager();
- private static ConcurrentHashMap<String, DaoMaster> masterMap = new ConcurrentHashMap<>();
- private static ConcurrentHashMap<String, DaoSession> daoSessionMap = new ConcurrentHashMap<>();
- private static ConcurrentHashMap<String, UpdateOpenHelper> helperMap = new ConcurrentHashMap<>();
- public static UpdateManager getInstance() {
- return manager;
- }
- public void init(Context context) {
- this.mContext = context;
- }
- private DaoMaster getDaoMaster(String dbName) {
- if (!masterMap.containsKey(dbName)) {
- UpdateOpenHelper openHelper = helperMap.get(dbName);
- if (openHelper == null) {
- UGDaoContext daoContext = new UGDaoContext(mContext);
- openHelper = new UpdateOpenHelper(daoContext, dbName, null);
- helperMap.put(dbName, openHelper);
- }
- DaoMaster master;
- try {
- master = new DaoMaster(openHelper.getWritableDatabase());
- masterMap.put(dbName, master);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- return masterMap.get(dbName);
- }
- public DaoSession getDaoSession(String dbName) {
- if (!daoSessionMap.containsKey(dbName)) {
- DaoMaster master = getDaoMaster(dbName);
- if (master != null) {
- DaoSession session = master.newSession();
- daoSessionMap.put(dbName, session);
- }
- }
- return daoSessionMap.get(dbName);
- }
- /**
- * 关闭指定数据库连接
- *
- * @param dbName 数据库名字
- */
- public void closeConnection(String dbName) {
- DaoSession session = daoSessionMap.get(dbName);
- if (session != null) {
- session.clear();
- daoSessionMap.remove(dbName);
- }
- DaoMaster master = masterMap.get(dbName);
- if (master != null) {
- master = null;
- masterMap.remove(dbName);
- }
- UpdateOpenHelper helper = helperMap.get(dbName);
- if (helper != null) {
- helper.close();
- helperMap.remove(dbName);
- }
- }
- /**
- * 关闭所有数据库连接
- */
- public void closeAllConnection() {
- // 关闭所有DaoSessions
- synchronized (this) {
- for (String dbName : daoSessionMap.keySet()) {
- closeConnection(dbName); // 关闭每一个连接
- }
- // 额外步骤:清理所有映射
- daoSessionMap.clear();
- masterMap.clear();
- helperMap.clear();
- }
- }
- }
复制代码 还有需要修改数据库的文件的存储路径,GreenDao数据库默认的存储路径是在应用内部私有存储,以是假如删除了应用之后,数据文件也会被删除,同时也不利于外部查找数据库文件。
创建【UGDaoContext】修改数据库文件地点
- public class UGDaoContext extends ContextWrapper {
- public UGDaoContext(Context base) {
- super(base);
- }
- @Override
- public File getDatabasePath(String name) {
- String dbDir;
- boolean isExistSDCar = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
- if (isExistSDCar) {
- dbDir = Environment.getExternalStorageDirectory().getAbsolutePath();
- } else {
- dbDir = Environment.getDataDirectory().getAbsolutePath();
- }
- String dbDirPath = dbDir + File.separator + "app_dao" + File.separator + "data_update";
- Log.d("TAG", "数据库的文件夹地址:" + dbDirPath);
- File dbDirFile = new File(dbDirPath);
- if (!dbDirFile.exists()) {
- dbDirFile.mkdirs();
- }
- String dbNamePath = dbDirPath + File.separator + name;
- File dbNameFile = new File(dbNamePath);
- boolean isSuccess = false;
- if (!dbNameFile.exists()) {
- try {
- isSuccess = dbNameFile.createNewFile();
- } catch (IOException e) {
- e.printStackTrace();
- }
- } else {
- isSuccess = true;
- }
- if (isSuccess) {
- Log.d("TAG", "数据库的文件地址:" + dbNamePath);
- return dbNameFile;
- } else {
- return super.getDatabasePath(name);
- }
- }
- @Override
- public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) {
- return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
- }
- @Override
- public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) {
- return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
- }
- }
复制代码 接下里再创建一个工具类实现对数据库的操作【UpdateDaoUtil】
这样根本上一个数据库就创建了,剩下就是如何使用了。
- UpdateDaoUtil updateDaoUtil;
复制代码- updateDaoUtil = new UpdateDaoUtil(this);
复制代码- if (updateDaoUtil != null) {
- Log.i("TAG", "将List数据存入本地数据库,存入条数 " + updateBeanList.size());
- List<UpdateBean> list = new ArrayList<>(updateBeanList);
- boolean update = updateDaoUtil.insertUpdate(list);
- if (update) {
- Log.i("TAG", "数据存入数据库正常");
-
- }
- }
复制代码 记得烧毁
- @Override
- protected void onDestroy() {
- super.onDestroy();
- if (updateDaoUtil != null) {
- updateDaoUtil.closeAll();
- }
- }
复制代码 GreenDao数据库的根本使用方式就是这样了。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |