Android使用WCDB+Room 总结

article/2025/10/8 21:13:25

        最近项目有需要用到wcdb数据库,并且保证和IOS互通数据,在网上找很多相关资料,最后还是靠自己一点点摸索成功,现在做个总结。

一、在gradle 里加上 WCDB 相关的 room 组件

    def room_version = "2.3.0"// wcdb数据库和room数据库组合使用implementation 'com.tencent.wcdb:wcdb-android:1.0.8'implementation 'com.tencent.wcdb:room:1.0.8'implementation "androidx.room:room-runtime:$room_version"kapt "androidx.room:room-compiler:$room_version"implementation "androidx.room:room-ktx:$room_version"

二、在项目需要用到的界面中初始化wcdb数据库,我是写了一个工具类,直接调用即可,先具体来看看

首先打开 RoomDatabase 时,指定 WCDBOpenHelperFactory 作为 openFactory

 //指定加密方式,使用默认加密可以省略SQLiteCipherSpec cipherSpec = new SQLiteCipherSpec().setPageSize(4096).setKDFIteration(64000);WCDBOpenHelperFactory factory = new WCDBOpenHelperFactory()
//                  .passphrase("passphrase".getBytes())  // // 指定加密DB密钥,非加密DB去掉此行.cipherSpec(cipherSpec)  //指定加密方式,使用默认加密可以省略// cipher to use, remove for default settings// enable WAL mode, remove if not needed//.writeAheadLoggingEnabled(true)    打开WAL以及读写并发,可以省略让Room决定是否要打开.asyncCheckpointEnabled(true);        // 开异步Checkpoint优化,不需要可以省略

其次创建数据库

    //dbName可以使用单独的名字或者绝对路径AppDatabase   db = Room.databaseBuilder(mContext, AppDatabase.class,  "wcdb.db")//创建本地数据库文件,如果需要和后台数据库绑定,需要和IOS互通就需要,否则只是自己本地操作,不需要//如果需要用到互通保存到本地,记得先加存储和查询权限// .createFromFile(new File(dir, "wcdb.db"))//数据库版本更新//  .addMigrations(MIGRATION_1_2)///允许主线程查询.allowMainThreadQueries()//数据库的模式,可以根据自己的需要设置,TRUNCATE模式只创建2个数据库,而且如果需要用到和IOS交互,上传数据库时,用TRUNCATE模式.setJournalMode(RoomDatabase.JournalMode.TRUNCATE).openHelperFactory(factory)   // 使用WCDB打开Room.build();

三、ROOM数据库的使用

1.创建实体类

        这里可以根据自己的业务需求,是定义id为自增的主键还是自己定义其他的自增主键。因为我要和IOS互通,所以我们都自己定义了相同的自增主键。

        这里需要特别注意的是,因为考虑到和ios互通,所以在创建数据库的时候要和ios沟通好,要他们保证数据库的非空字段,不然等到后期把在ios手机上创建出来的数据库从服务器下载下来后,会报错。具体什么错误忘记了,嘿嘿嘿,这样错误研究了N久,这里这边注明一下!

如果不需要考虑互通,上诉可以忽略!

@Entity
public class FlagTable {//    @PrimaryKey(autoGenerate = true)
//    public int id;@PrimaryKey(autoGenerate = false)@NonNullpublic String flagId;public String title;public String subTitle;public int color;public String completeDay;public boolean isComplete ;public long createTime;}

2.创建数据库Dao

这里是数据库的增删查改CRUD都有,可以根据自己的业务逻辑自己写。


@Dao
public interface FlagInfoDao {@Query("SELECT * FROM FlagTable")List<FlagTable> getAll();@Query("SELECT * FROM FlagTable WHERE flagId = :flagId")FlagTable getById(String flagId);@Query("SELECT * FROM FlagTable WHERE isComplete = :isComplete order by createTime asc")List<FlagTable> getAll(boolean isComplete);@Insertvoid insert(FlagTable... flagInfo);@Deletevoid delete(FlagTable flagInfo);@Query("DELETE FROM FlagTable WHERE flagId = :flagId")void deleteFlagById(String flagId);@Query("DELETE FROM FlagTable")void deleteAll();@Updatevoid update(FlagTable flagInfo);
}

3.创建DataBase数据库

@Database(entities = {FlagTable.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {public abstract FlagInfoDao flagInfoDao();}

四、数据库升级(使用此方法记得修改数据库版本号)

        这个要说明一下,当开发中使用了Google的Room框架的话,当你在之后的版本中新增了表或者改动了某些表结构的话,你就需要对数据库的版本号进行相应的更新,现在整理两种更新方式

1.这种方式会清空数据库中的数据,所以要使用这种方式之前一定要慎重考虑。fallbackToDestructiveMigration会将所有表全部丢弃。

AppDatabase db = null;//dbName可以使用单独的名字或者绝对路径db = Room.databaseBuilder(mContext, AppDatabase.class,  "wcdb.db")//添加下面这一行.fallbackToDestructiveMigration().build();

2. SQLite的ALTER TABLE命令非常局限,只支持重命名表以及添加新的字段。

//添加新的字段

        Migration MIGRATION_1_2 = new Migration(1, 2) {@Overridepublic void migrate(SupportSQLiteDatabase database) {
//                    为旧表添加新的字段,添加int类型的字段时候,要不为空,给 默认值database.execSQL("ALTER TABLE FlagTable "+ " ADD COLUMN delayCount INTEGER NOT NULL DEFAULT 0");}};

//创建新的表

Migration MIGRATION_1_2 = new Migration(1, 2) {@Overridepublic void migrate(SupportSQLiteDatabase database) {
//                    为旧表添加新的字段database.execSQL("ALTER TABLE User "+ " ADD COLUMN book_id TEXT");
//                创建新的数据表database.execSQL("CREATE TABLE IF NOT EXISTS `CalenderInfo` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `subId` TEXT, `eventId` TEXT, `flagId` TEXT, `startTime` TEXT)");}};

 在创建数据库的时候添加addMigrations

AppDatabase   db = Room.databaseBuilder(mContext, AppDatabase.class,  "wcdb.db")//数据库版本更新.addMigrations(MIGRATION_1_2).build();

五、查看数据库数据

1.获取数据库文件 ,并需要上传给后台,可以调用此方法,获取数据库具体地址

String  flag = context.getDatabasePath(“wcdb.db”)

2.查看数据库数据

手机连接studio,创建数据库并操作数据库后,在data目录下会出现两个文件。如图:

 下载保存到桌面,并拖入SQLiteStudio数据库打开,双击数据库名打开后,能很详细的看到数据库变,表结构字段以及数据信息。如图:

六、最近抽时间自己写了个小demo,希望等帮助到需要的小伙伴。

https://github.com/zgy1014/wcdb_room#wcbd_room

本文算是自己在项目中使用WCDB过程中一些使用心得和积累,WCDB在使用这一块其实还有更多高级的用法,这里并没有提到,后面有时间了再做详述。也欢迎小伙伴们遇到问题一起解决。


http://chatgpt.dhexx.cn/article/PhDyf87T.shtml

相关文章

IOS数据存储 之WCDB (一)

IOS数据存储 之WCDB &#xff08;一&#xff09; 1. WCDB 简介1.1 使用WCDB框架3大优势1.2 WCDB 的一些基础概念1.2.1 类字段绑定&#xff08;ORM&#xff09;1.2.2 WINQ&#xff08;WCDB语言集成查询&#xff09;1.2.2.1 字段映射与运算符1.2.2.2 字段组合1.2.2.3 AllProperti…

iOS开发 数据存储之WCDB的介绍

一.介绍 WCDB是一个高效、完整、易用的移动数据库框架,基于SQLCipher,支持iOS,macOS和Android 二.基本特性 易用,WCDB支持一句代码即可将数据取出并组合为object WINQ(WCDB语言集成查询):通过WINQ,开发者无须为了拼接SQL的字符串而写一大坨胶水代码ORM(Object Relational Ma…

开源微信小程序自助建站系统源码 含精美的多行业模板和搭建教程

分享一个微信小程序自助建站系统源码&#xff0c;含各行各业的小程序模板和搭建教程&#xff0c;可一键切换模板&#xff0c;自由DIY&#xff0c;搭建属于你自己的小程序。 特色功能一览&#xff1a; 11、支持创建多个小程序&#xff01;&#xff08;没有数量限制&#xff0c;后…

强大易用的开源建站工具Halo

最近无意间看到别人的博客外观非常美观&#xff0c;便萌生了偷师学艺的想法…所以就看到看了Halo这个开源的建站项目,其实使用起来非常简单&#xff0c;但是想要做一个类似的开源建站工具&#xff0c;谈何容易 访问官网 https://halo.run/ 使用docker部署 搜索镜像halo do…

14个免费好用的建站工具

有时候&#xff0c;我们想建立一个独立网站的时候&#xff0c;苦于自己技能不够&#xff0c;而迟迟没有行动&#xff0c;其实&#xff0c;我们真正的去构建一个独立网站的时候&#xff0c;我们并不需要多复杂的技术。我们也不一定要成为非常专业的程序员&#xff0c;因为现在&a…

推荐一款免费开源的建站系统 - AnqiCMS

安企内容管理系统(AnqiCMS)&#xff0c;是一款使用 GoLang 开发的企业站内容管理系统&#xff0c;它部署简单&#xff0c;软件安全&#xff0c;界面优雅&#xff0c;小巧&#xff0c;执行速度飞快&#xff0c;使用 AnqiCMS 搭建的网站可以防止众多安全问题发生。AnqiCMS 的设计…

介绍一款开源、高性价比的在线教育建站系统

今天给大家介绍一款开源在线教育建站系统——edusoho&#xff0c;项目是用PHP开发&#xff0c;所以基本上会搭建php站点就可以完成本次的搭建。 先看看安装之后的登录界面。 去官网下载源码 笔者下载企培开源版&#xff1a;edusoho-ct-21.4.5.zip 系统说明 1.系统&#xff1…

国内好用的五款开源建站系统

推荐5款优秀的开源建站系统,都有免费版本,有需要可以去试试。蝉知 蝉知系统是一款开源的的企业营销自助建站系统。它专为企业营销设计,伪静态网址、关键词、语义化结构,内置流量统计。 蝉知功能全面,文章发布、会员管理、论坛评论、产品展示等,并内置商城系统,商品、订…

免费开源的建站程序大全,不会编程也可以自助搭建网站了哦

想建网站又不会编程的小伙伴有福啦&#xff0c;本期推荐一些开源的cms建站程序&#xff0c;不需要写后端的任何逻辑代码&#xff0c;轻轻松松就可以建立自己的网站了&#xff0c;当然&#xff0c;要想网站有自己的个性&#xff0c;模版还是需要自己写的&#xff0c;只需要会简单…

绝了!小说建站项目完整开源

超棒的开源小说文学建站 CMS 系统&#xff0c;作为面试项目有牌面儿&#xff01; 编程导航开源仓库&#xff1a;https://github.com/liyupi/code-nav 大家好&#xff0c;我是鱼皮&#xff0c;今天给大家推荐一个优秀的开源 Java 全栈项目。 小说精品屋&#xff0c;是一套非常完…

最新首发自助建站系统源码,傻瓜式一键建站系统源码,高度开源支持专业在线自助建站服务平台软件

一佰互联,巅云门户自助建站系统v8建站平台版&#xff0c;历经3年不断打磨终于上线了。专业PS级大师级高端响应式智能建站平台软件&#xff0c;只为网络公司而生&#xff0c;采用国内知名开源php框架,Thinkphp6vue.js前端数据响应系统,实现了在线自助开通网站&#xff0c;企业站…

四大免费开源建站系统

原文&#xff1a;四大免费开源建站系统 - 知乎 第一&#xff1a; WordPress WordPress的主流客户是企业/个人的官网。一家公司不一定会在网上卖东西&#xff0c;但一定会需要一个官网。用WordPress做官网可谓是性价比最优选择。如果没有预算&#xff0c;你可以自己买几十美金的…

有哪些免费好用的开源建站程序/系统,推荐下?

我推荐WordPress建站程序&#xff0c;学习入门门槛很低&#xff0c;全世界近三分之一的网站都是采用wordpress,所以没有理由不去学习它。 我从一名小白变为wordpress建站老手&#xff0c;对比过很多建站程序&#xff0c;还是觉得wordpress能帮我节省时间和精力&#xff0c;让我…

开源自助建站系统源码完整源码+搭建教程 傻瓜式一键建站系统源码

一键傻瓜式自助建站系统源码&#xff0c;目前包含七百多套完整网站模板&#xff0c;全部都是响应式网站模板&#xff0c;傻瓜一键自助建站。开发组合PHPmysql&#xff0c;功能强大。 一键自助建站系统源码带安装教程&#xff0c;源码下载&#xff1a;春哥技术博客获取。自助建站…

五款开源免费的建站系统推荐

最近研究了下开源的建站系统&#xff0c;推荐5款国内的吧&#xff0c;都有免费版本&#xff0c;有需要可以去试试。 ECTouch ECTouch是一款开源免费的移动商城网店系统。能够帮助企业和个人快速构建手机移动商城并减少二次开发带来的成本。 ECTouch采用PHPMYSQL方式运行&…

Excel如何按照指定顺序排列

需求&#xff1a;要求按照指定的code出相应的value值&#xff0c;后台可能查出来的code对应的值无法与给定的顺序匹配上&#xff0c;当然可以用代码解决&#xff0c;但是如果想偷懒可以直接用Excel强大的自定义排序解决。 Step1&#xff1a;在Excel中自定义排序&#xff1a;点击…

(19)写一个函数,用”起泡法“对输入的10数字符按由小到大顺序排列

用”起泡法“对输入的10数字符按由小到大顺序排列 起泡法&#xff1a;即每一次将相邻两个数进行比较&#xff0c;若符合条件则交换两个数的值。每进行一趟排序&#xff0c;最大的一个数变成最后一个数。以此类推&#xff0c;直至整个数组按照由小到大排列。 举例&#xff1a;…

G2Plot 折线图表错乱,不按顺序排列

问题描述&#xff1a; 问题&#xff1a;G2Plot 折线图表错乱&#xff0c;不按顺序排列 BUG如图&#xff1a; 原因分析&#xff1a; 问题分析&#xff1a; 在仔细检查了参数值时&#xff0c;分析没有问题的图表的 value 值类型为Number&#xff0c;出问题的是String类型。 有…

输入五个整数,将他们从大到小顺序排列

思路: 将5个整数做成列表,运用 sorted函数将列表元素的值从小到大排序,然后利用切片反转列表元素. a int(input(">> ")) b int(input(">> ")) c int(input(">> ")) d int(input(">> ")) e int(input(&…

matplotlib中柱状图Y轴坐标不按顺序排列问题

背景&#xff1a; 昨天偶然做一个爬取数据&#xff0c;做成直方图的小练习发现&#xff0c;最后出来的图标Y轴并不是按顺序排列&#xff0c;按照老规矩&#xff0c;百度一下&#xff0c;找到了原因&#xff0c;一个低级的问题 import matplotlib.pyplot as plt from matplotl…