IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android使用GreenDAO多库问题解决方案 -> 正文阅读

[移动开发]Android使用GreenDAO多库问题解决方案

前言

之前开发app的时候,用到数据库都是自己封装;这次就想偷个懒,用用框架,各种比较后选择用GreenDAO。
GreenDAO Github代码地址
Android数据库GreenDao使用说明

参照说明添加了依赖、实体类,Make Project后,发现自动生成的代码只能支持一个数据库文件,但是我需要创建多个数据库。

解决方案

简单来说,就是不同的库创建不同的OpenHelper。下面以两个库为例

参照自动生成代码,写两个OpenHelper,直接上代码

public class OrderDbHelper extends DatabaseOpenHelper {
	public static final int SCHEMA_VERSION = 6;
    /** Creates underlying database table using DAOs. */
    public static void createAllTables(Database db, boolean ifNotExists) {
        OrderDao.createTable(db, ifNotExists);
        ProductDao.createTable(db, ifNotExists);
    }

    /** Drops underlying database table using DAOs. */
    public static void dropAllTables(Database db, boolean ifExists) {
        OrderDao.dropTable(db, ifExists);
        ProductDao.dropTable(db, ifExists);
    }

    public OrderDbHelper(Context context, String name) {
        super(context, name, SCHEMA_VERSION);
    }

    @Override
    public void onCreate(Database db) {
        createAllTables(db, true);
    }

    @Override
    public void onUpgrade(Database db, int oldVersion, int newVersion) {
        if (oldVersion < newVersion) {
            dropAllTables(db, true);
            onCreate(db);
        }
    }
}
public class UserDbHelper extends DatabaseOpenHelper {
    public static final int SCHEMA_VERSION = 5;

    /** Creates underlying database table using DAOs. */
    public static void createAllTables(Database db, boolean ifNotExists) {
        UserDao.createTable(db, ifNotExists);
    }

    /** Drops underlying database table using DAOs. */
    public static void dropAllTables(Database db, boolean ifExists) {
        UserDao.dropTable(db, ifExists);
    }

    public UserDbHelper(Context context, String name) {
        super(context, name, SCHEMA_VERSION);
    }

    @Override
    public void onCreate(Database db) {
        createAllTables(db, true);
    }

    @Override
    public void onUpgrade(Database db, int oldVersion, int newVersion) {
        if (oldVersion < newVersion) {
            dropAllTables(db, true);
            onCreate(db);
        }
    }
}

然后写一个DbManager

public class DbManager {
    private DaoMaster mOrderDaoMaster;
    private DaoSession mOrderDaoSession;

    private DaoMaster mUserDaoMaster;
    private DaoSession mUserDaoSession;

    private DbContext mContext;

    private DbManager() {
    }

    private static class SingletonInstance {
        private static DbManager INSTANCE = new DbManager();
    }

    public static DbManager getInstance() {
        return SingletonInstance.INSTANCE;
    }

    public void init(DbContext context) {
        mContext = context;

        createOrderDb(context, "order.db");
        createUserDb(context, "user.db");
    }

    private void createOrderDb(Context context, String name) {
        OrderDbHelper openHelper = new OrderDbHelper(context, name);
        mOrderDaoMaster = new DaoMaster(openHelper.getWritableDb());
        mOrderDaoSession = mOrderMaster.newSession();
    }

    private void createUserDb(Context context, String name) {
        UserDbHelper openHelper = new UserDbHelper(context, name);
        mUserDaoMaster = new DaoMaster(openHelper.getWritableDb());
        mUserDaoSession = mUserDaoMaster.newSession();
    }

    public void insertUser(User user) {
        mUserDaoSession.getUserDao().insert(user);
    }

    public void insertOrder(Order order) {
		mOrderDaoSession.getOrderDao().insert(order);
   }

    public void close() {
        closeOrderDb();
        closeUserDb();
    }

    private void closeOrderDb() {
        if (mOrderDaoSession != null) {
            mOrderDaoSession.clear();
            mOrderDaoSession = null;
        }

        if (mOrderDaoMaster != null) {
            mOrderDaoMaster.getDatabase().close();
            mOrderDaoMaster = null;
        }
    }

    private void closeUserDb() {
        if (mUserDaoSession != null) {
            mUserDaoSession.clear();
            mUserDaoSession = null;
        }

        if (mUserDaoMaster != null) {
            mUserDaoMaster.getDatabase().close();
            mUserDaoMaster = null;
        }
    }
}

当然,偷懒是有代价的,这里利用的框架生成的
DaoMaster和DaoSession,每个库都会创建对应的对象,而框架生成的代码中是包含了所有实体的,这会造成内存的浪费,比如DaoMaster的构造函数

public DaoMaster(Database db) {
    super(db, SCHEMA_VERSION);
    registerDaoClass(UserDao.class);
    registerDaoClass(OrderDao.class);
    registerDaoClass(ProductDao.class);
}

可以看出,第一个库其实是不需要注册UserDao的,第二个库是不需要OrderDao和ProductDao的。同样,DaoSession也有类似问题。
勤快的同学可以去掉框架自动生成代码,每个库都编写自己的DaoMaster和DaoSession,但这样就不能偷懒了,每次添加实体或者修改都是挺麻烦的事情。

期待GreenDAO早日改进,或者各位有什么更好的解决方案,希望能回复一下。

修改数据库文件存储路径

本项目中,还希望修改一下数据库文件存储路径。上面代码中也看到了,有个DbContext,其实是自己实现的,继承自ContextWrapper,重写getDatabasePath方法。当然也可以在初始化Context中,重写这个方法来修改数据文件路径。

public class DbContext extends ContextWrapper {
    public DbContext(Context base) {
        super(base);
    }

    @Override
    public File getDatabasePath(String name) {
        return new File(getExternalFilesDir("databases"), name);
    }
}

最后

在研究多库方案的时候,看到一个多schema的概念,不知道这个schema该怎么理解,希望知道的朋友能告知一下,谢谢

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:33:24  更:2021-12-04 13:33:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:29:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码