Android ORM 架构数据库 greenDao 使用解析

昨日世界

在 Android 开发过程中,经常会遇到数据存储需求,对于简易信息,可以使用 SP (SharedPreferences) 存储,对于复杂场景,比如聊天记录,网络缓存,一般需要借助数据库存储信息,比如 SQLite。除了系统原生数据库 SQLite,还存在一些开源的数据库,如 greenDao。

greenDao 采用的是 Android 轻量级 ORM(Object Relation Mapping)架构。ORM 就是将 Java 对象映射到 SQLite 数据库中,操作数据库的时候,不需要写复杂的 SQL 语句,使用对象来存储、更新、删除和查询数据库,易用操作。并且 greenDao 针对 Android 进行了高度优化,内存开销小,依赖体积小并且支持数据库加密。



image

如何添加 greenDAO 到项目中?

在根build.gradle 中添加 Gradle 配置

buildscript {
    repositories {
        google()
        jcenter()
        mavenCentral() // add repository
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.2'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' // add plugin
    }
}

在应用 modules 中的 app/build.gradle 添加 Gradle 配置

apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
 
dependencies {
    implementation 'org.greenrobot:greendao:3.3.0' // add library
}

至此已经将 greendao 引入到项目中,其中配置 mavenCentral()是因为 greendao 存在 mavenCentral 仓库中,引入 gradle-plugin 是因为可将插件链接到项目构建过程,当构建项目可以自动生成 DaoMaster、DaoSession 和 xxxDao 类。

实例演示,创建实体类,生成特定文件对数据库操作

创建一个 ChatHistory 类

@Entity
public class ChatHistory {
    @Id(autoincrement = true)
    private Long id;
    @NotNull
    private String userId;
    @NotNull
    private String content;
    @NotNull
    private String timeStamp;
}

点击 Android Studio/Build/Make Project,会自动生成 ChatHistory 类的构造函数以及 get、set 方法,并且在 build/generated 目录下生成 ChatHistoryDao、DaoMaster、DaoSession 类。如果要改变 ChatHistory、DaoMaster、DaoSession 的生成目录,可在 build.gradle 文件中配置

android {
    GreenDao {
        schemaVersion 1
        daoPackage 'com.ecarx.wechat'
        targetGenDir 'src/main/java'
    }
}

利用生成的 ChatHistory、DaoMaster、DaoSession 类可以操作数据库

屏幕快照 2021-03-19 下午3.38.51.png

对生成的类进行封装,以便于对数据库的操作

public class DBManager {
    private static DBManager instance;
    private DaoSession mDaoSession;
    private ChatHistoryDao mChatHistoryDao;

    public static DBManager getInstance(Context context) {
        if (instance == null) {
            synchronized (DBManager.class) {
                instance = new DBManager(context);
            }
        }
        return instance;
    }

    private DBManager(Context context) {
        DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(context, "chat.db");
        mDaoSession = new DaoMaster(devOpenHelper.getWritableDatabase()).newSession();
        mChatHistoryDao = mDaoSession.getChatHistoryDao();
    }

    //插入记录
    public void insertChat(ChatHistory chat) {
        try {
            mChatHistoryDao.insert(chat);
        } catch (Exception e)  {
            e.printStackTrace();
        }
    }

    //更新记录
    public void updateChat(ChatHistory chat) {
        List<ChatHistory> chatHistoryList = mChatHistoryDao.queryBuilder().where(ChatHistoryDao.Properties.Id.eq(chat.getId())).list();
        if (chatHistoryList != null && chatHistoryList.size() > 0) {
            mChatHistoryDao.update(chatHistoryList.get(0));
        }
    }

    //分页查询
    public List<ChatHistory> queryChat(int page, int pageSize, String userId) {
        List<ChatHistory> chatHistories = new ArrayList<>();
        try {
            QueryBuilder queryBuilder = mChatHistoryDao.queryBuilder();
            queryBuilder.where(ChatHistoryDao.Properties.UserId.eq(userId));
            queryBuilder.orderDesc(ChatHistoryDao.Properties.Id);
            queryBuilder.offset((page - 1) * pageSize);
            queryBuilder.limit(pageSize);
            chatHistories = queryBuilder.list();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return chatHistories;
    }

    //删除记录
    public void deleteChat(int userId) {
        try {
            List<ChatHistory> chatHistories = mChatHistoryDao.queryBuilder().where(ChatHistoryDao.Properties.UserId.eq(userId)).list();
            if (chatHistories != null && chatHistories.size() > 0) {
                mChatHistoryDao.delete((ChatHistory) chatHistories);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

通过封装类实现数据的插入,查询等操作

ChatHistory chatHistory = new ChatHistory();
chatHistory.setUserId("10086");
chatHistory.setContent("明天去郊游怎么样");
chatHistory.setTimeStamp("1616135247000");

DBManager dbManager = DBManager.getInstance(this);

//插入记录
dbManager.insertChat(chatHistory);

//查询记录
List<ChatHistory> list = dbManager.queryChat(1, 15, "10086");
总结

greenDao 的使用分三步:

  • 配置 gradle,引入 greendao 和 greendao-gradle-plugin
  • 创建实体类,编译自动生成 DaoMaster、DaoSession 和 xxxDao
  • 使用生成类进行数据操作
阅读 348
0 声望
0 粉丝
0 条评论
你知道吗?

0 声望
0 粉丝
宣传栏