基于 OpenHarmony ActiveOhos_sqllite 组件开发指南

news2024/11/15 17:28:02

1. ActiveOhos 功能介绍

1.1.组件介绍

基于鸿蒙系统连接数据库进行 sqlite 数据库操作的时候,创建连接的时候是有些繁琐的,本组件就是为了简化 sqlite 的连接,并且对鸿蒙原生的 API 进行封装加强,使得读写 sqlite 数据库的时候更加方便

1.2. phone 模拟器上运行效果

插入数据成功

2. ActiveOhos 使用方法

2.1.为应用添加 sqlitelibrary-debug.har 包依赖
在应用模块中调用 HAR,常用的添加依赖的方式包括如下两种。

方式一:依赖本地 HAR

第 一 步 : 将 sqlitelibrary-debug.har 复 制 到 entry\libs 目 录 下 即 可 ( 由 于
build.gradle 中已经依赖的 libs 目录下的
.har,因此不需要在做修改)。
*

查看工程目录中 build.gradle 下的*.har 是存在

第二步:除了依赖以上 har 之外还需要添加外部依赖用来实现类的引入,引入方式如下,引入完之后同步下就可以使用。

  • 如果使用注解处理器的模块为“com.huawei.ohos.hap”模块,则需要在模块的 “build.gradle”文件的“ohos”节点中添加以下配置:
compileOptions{
annotationEnabled true
}
  • 如果使用注解处理器的模块为“com.huawei.ohos.library”模块,则需要在模块的 “build.gradle”文件的“dependencies”节点中配置注解处理器。查看 “orm_annotations_java.jar”、
    “orm_annotations_processor_java.jar”、“javapoet_java.jar”这 3 个jar 包在 HUAWEI SDK 中的对应目录,并将目录的这三个 jar 包导进来。
dependencies { compile files("orm_annotations_java.jar 的路径
","orm_annotations_processor_java.jar 的路径","javapoet_java.jar 的
路径") annotationProcessor files("orm_annotations_java.jar 的路径
","orm_annotations_processor_java.jar 的路径","javapoet_java.jar 的
路径")}
  • 如果使用注解处理器的模块为“java-library”模块,则需要在模块的 “build.gradle”文件的“dependencies”节点中配置注解处理器,并导入“ohos.jar”。
dependencies { compile files("ohos.jar 的路径
","orm_annotations_java.jar 的路径
","orm_annotations_processor_java.jar 的路径","javapoet_java.jar 的
路径") annotationProcessor files("orm_annotations_java.jar
的路径","orm_annotations_processor_java.jar 的路径
","javapoet_java.jar 的路径")}

比如:

以上操作无误之后就可以进行编码了!

3. ActiveOhos 开发实现

3.1.主页面的布局文件

定义四个按钮分别实现增删改查,定义四个 Button 实现请求点击事件

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical">
<Button
ohos:id="$+id:btn_insert"
ohos:height="match_content"
ohos:width="80fp"
ohos:text_color="red"
ohos:text="插入"
ohos:text_size="20fp"
ohos:weight="100fp"/>
<Button
ohos:id="$+id:btn_query"
ohos:height="match_content"
ohos:width="100fp"
ohos:text_color="blue"
ohos:text="查询"
ohos:text_size="20fp"
ohos:weight="100fp"/>
<Button
ohos:id="$+id:btn_update"
ohos:height="match_content"
ohos:width="100fp"
ohos:text_color="green"
ohos:text="更新"
ohos:text_size="20fp"
ohos:weight="100fp"/>
<Button
ohos:id="$+id:btn_delete"
ohos:height="match_content"
ohos:width="100fp"
ohos:text_color="black"
ohos:text="删除"
ohos:text_size="20fp"
ohos:weight="100fp"/>
<ListContainer
ohos:id="$+id:listText"
ohos:height="match_parent"
ohos:width="match_parent"/>
</DirectionalLayout>
ohos:width="match_content"
ohos:background_element="$graphic:background_ability_main"
ohos:layout_alignment="horizontal_center"
ohos:text="get 请求"
ohos:text_size="50"
ohos:top_margin="80vp"
/>
</DirectionalLayout>

3.2.例子代码如下

组件中一共有两种连接数据的方式,分别 OrmContext,RdbStore ,其中 OrmContext 是需要定义一个实体类(User)来和数据库对应表名及字段,还有一个数据库类 BookStore 来配合开发代码如下:

MainAbilitySlice

import com.example.myapplication.BookStore;
import com.example.myapplication.ResourceTable;
import com.example.myapplication.User;
import com.example.sqlitelibrary.DBManage;
import com.example.sqlitelibrary.DBOrmContext;
import com.example.sqlitelibrary.utils.Log;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Button;
import ohos.agp.components.Component;
import ohos.data.DatabaseHelper;
import ohos.data.orm.OrmContext;
import ohos.data.orm.OrmPredicates;
import ohos.data.rdb.RdbStore;
import ohos.data.rdb.ValuesBucket;
import java.util.ArrayList;
import java.util.List;
public class MainAbilitySlice extends AbilitySlice implements
Component.ClickedListener {
private DatabaseHelper helper;
private RdbStore store;
private OrmContext context;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
helper = new DatabaseHelper(this);
DBManage dbManger = new DBManage("user.db","user");
context = dbManger.getConnectionContext(helper, BookStore.class);
// DBManage dbManger = new DBManage("user.db");
// store = dbManger.getConnectionStore(helper,"user");
Button btnInsert = (Button) findComponentById(ResourceTable.Id_btn_insert);
Button btnQuery = (Button) findComponentById(ResourceTable.Id_btn_query);
Button btnDelete = (Button) findComponentById(ResourceTable.Id_btn_delete);
Button btnUpdate = (Button) findComponentById(ResourceTable.Id_btn_update);
btnInsert.setClickedListener(this::onClick);
btnQuery.setClickedListener(this::onClick);
btnDelete.setClickedListener(this::onClick);
btnUpdate.setClickedListener(this::onClick);
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
@Override
public void onClick(Component component) {
// RdbStoreManage rdbStoreMange = new RdbStoreManage();
// ValuesBucket values = new ValuesBucket();
// values.putInteger("id", 1);
// values.putString("name", "zhangsan");
// values.putInteger("age", 18);
// values.putDouble("salary", 100.5);
// values.putByteArray("blobType", new byte[] {1, 2, 3});
// rdbStoreMange.setSql(store, "insert into user values(zhangsan, 18, 100.5,
byte[1,2,3])");
// long id = rdbStoreMange.insert(store,"user", values);
// System.out.println(id);
DBOrmContext dbOrmContext = new DBOrmContext();
switch (component.getId()) {
case ResourceTable.Id_btn_insert: //插入数据
//第一次使用 user 对应的表的时候,如果有这张表就直接使用,没有就创建表
User user = new User();
user.setFirstName("Zhang");
user.setLastName("San");
user.setAge(29);
user.setBalance(100.51);
boolean b = dbOrmContext.insert(context, user);
Log.i("插入成功");
System.out.println(b);
break;
case ResourceTable.Id_btn_query: //条件查询
List<User> users = new ArrayList<>();
OrmPredicates query = context.where(User.class).equalTo("lastName",
"San");
users = dbOrmContext.query(context, query);
break;
case ResourceTable.Id_btn_delete: //条件删除
OrmPredicates delete = context.where(User.class).equalTo("lastName", "San");
int delete1 = dbOrmContext.delete(context, delete);
System.out.println(delete1);
break;
case ResourceTable.Id_btn_update: //条件更新
ValuesBucket valuesBucket = new ValuesBucket();
valuesBucket.putInteger("age", 31);
valuesBucket.putString("firstName", "Zhang");
valuesBucket.putString("lastName", "San");
valuesBucket.putDouble("balance", 300.51);
OrmPredicates update = context.where(User.class).equalTo("userId",
1);
int update1 = dbOrmContext.update(context, valuesBucket, update);
System.out.println(update1);
break;
}
dbOrmContext.flush(context);
}
}

user.java

@Entity(tableName = "user", ignoredColumns = {"ignoreColumn1",
"ignoreColumn2"},
indices = {@Index(value = {"firstName", "lastName"}, name =
"name_index", unique = true)})
public class User extends OrmObject {
// 此处将 userId 设为了自增的主键。注意只有在数据类型为包装类型时,自增主键才
能生效。
@PrimaryKey(autoGenerate = true)
private Integer userId;
private String firstName;
private String lastName;
private int age;
private double balance;
private int ignoreColumn1;
private int ignoreColumn2;
// 开发者自行添加字段的 getter 和 setter 方法

BookStore.java

@Database(entities = {User.class}, version = 1)
public abstract class BookStore extends OrmDatabase {
}

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1575337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java8新特性 (jdk1.8)

目录 一、Lamdba表达式&#xff1f; 二、函数式接口 三、方法引用和构造引用 四、Stream API流 五、接口中的新增 默认方法和静态方法 六、新时间日期API 七、Optional 八、其他特性 一、Lamdba表达式&#xff1f; 为什么使用Lambda表达式&#xff1f; Lambda 是一个 匿…

[挖坟]如何安装Shizuku和LSPatch并安装模块(不需要Root,非Magisk)

2023年12月13日&#xff0c;LSPatch 停止维护 2024年1月8日&#xff0c;LSPosed 停止维护 2024年1月8日&#xff0c;ZygiskNext 停止维护 2024年1月9日&#xff0c;KernelSU 停止维护 这里使用 ColorOS 14 演示&#xff0c;其他品牌手机类似 安装 Shizuku 官网: https://shiz…

JQuery(二)---【使用JQuery对HTML、CSS进行操作】

零.前言 JQuery(一)---【JQuery简介、安装、初步使用、各种事件】-CSDN博客 一.使用JQuery对HTML操作 1.1获取元素内容、属性 使用JQ可以操作元素的“内容” text()&#xff1a;设置或返回元素的文本内容html()&#xff1a;设置或返回元素的内容(包括HTML标记)val()&#…

每天一个注解之@DataSource、 @DS

在Java中&#xff0c;DataSource 注解通常用于标记数据源&#xff08;DataSource&#xff09;相关的信息。数据源是一个用于获取数据库连接的对象&#xff0c;它通常用于与数据库进行交互。DataSource 注解的详细说明可能会因不同的框架或库而有所不同&#xff0c;但通常用于配…

2024-04-07 作业

作业要求&#xff1a; 1> 思维导图 2> 自由发挥应用场景实现一个登录窗口界面。 【可以是QQ登录界面、也可以是自己发挥的登录界面】 要求&#xff1a;尽量每行代码都有注释 作业1&#xff1a; 作业2&#xff1a; 运行代码&#xff1a; #include "myqwidget.h&quo…

部署安装ElasticSearch、Kibana、IK

文章目录 1、部署单点es1.1、创建网络1.2、加载镜像1.3、运行 2、部署kibana2.1、部署2.2、DevTools 3、IK分词器3.1、在线安装3.2、离线安装1&#xff09;查看数据卷目录2&#xff09;解压缩分词器安装包3&#xff09;上传到es容器的插件数据卷中4&#xff09;重启容器5&#…

2024.4.7

1. 2列火车 #include<myhead.h>pthread_mutex_t m1; pthread_mutex_t m2;void* run(void* arg) {while(1){pthread_mutex_lock(&m1);printf("火车B进入\n");printf("A请等待\n");pthread_mutex_unlock(&m2);sleep(2);} }int main(in…

火山方舟大模型服务平台调用Demo测试(豆包)

豆包得后台大模型支持为字节得火山方舟&#xff0c;所以想使用豆包的API&#xff0c;直接从这里就可以。 一、首先注册账号&#xff1a; 火山引擎-云上增长新动力 注册完成之后&#xff0c;控制台-账户-API访问密钥 二、找到API测试用例&#xff1a; Skylark-chat API调用…

白盒测试-语句覆盖

​ 语句覆盖法是指设计适当数量的测试用例&#xff0c;使被测程序中的每条语句至少被执行一次。语句覆盖率的计算方法为&#xff1a; ​ 至少被执行一次的语句数量 / 程序中可执行的语句总数。 案例 ​ 为了清晰地比较几种逻辑覆盖法设计测试用例的异同&#xff0c;逻辑覆盖…

LeetCode热题100:哈希

1.两数之和 题目链接&#xff1a;两数之和 题目描述&#xff1a;给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数…

11.2 浏览器调试常用技巧

目录 1、开发者工具介绍 2、查看节点事件 3、断点调试 4、观察调用栈 5、恢复 JavaScript 执行 6、Ajax 断点 7、改写 JavaScript 文件 1、开发者工具介绍 由于需要学习 JavaScript 逆向&#xff0c;所以此文主要介绍与 JavaScript 逆向有帮助的功能。 以下链接为例&a…

国内:深圳交通流量数据集

数据来源&#xff1a;深圳政府数据开放平台&#xff08;深圳市政府数据开放平台&#xff09;&#xff0c;这个官网上还有其他类数据集&#xff0c;值得收藏&#xff01;&#xff01;&#xff01; 数据集介绍&#xff1a;宝安区-G4高速西乡大道入口车流量统计 第一行每列的标题…

记一次Debug与Release版程序输出不一致的问题解决

问题叙述&#xff1a; 在x86平台下无论Debug还是Release都没问题&#xff0c;而在arm平台下Debug版本程序无问题&#xff0c;Release版本程序&#xff08;-O3编译&#xff09;发现输出值不正确&#xff0c;怀疑值被篡改&#xff0c;于是在调用前后分别使用printf打印出参数值&…

vitepress系列-04-规整sideBar左侧菜单导航

规整左侧菜单导航 新建navConfig.ts 文件用来管理左侧导航菜单&#xff1a; 将于其他的配置分开&#xff0c;避免config.mts太大 在config目录下&#xff0c;新建 sidebarModules文件目录用来左侧导航菜单 按模块进行分类&#xff1a; 在config下新建sidebarConfig.ts文件&…

3dmax经常染失败?优化方法提升染质量!

在三维建模和渲染的过程中&#xff0c;优化模型和场景的效率是至关重要的。以下是一些提升效率的方法&#xff1a; 模型简化&#xff1a;在创建模型时&#xff0c;应尽量减少使用的命令和修改器的数量。这是因为命令和修改器越多&#xff0c;消耗的内存和CPU资源也就越多&…

vitepress系列-05-其他优化设置

其他优化设置 设置底部上一页和下一页 设置&#xff1a; import { defineConfig } from vitepress// https://vitepress.dev/reference/site-config export default defineConfig({lang: en-US,title: "东东爱编码的技术博客",description: "记录日常学习点点…

Cute Background FX

Cute Background FX是环境背景粒子系统的集合。非常适合作为菜单的背景。 该包包括: -20个独特预制件+20个URP预制件 -5种独特的环境设计 -15种纹理 -2个自定义着色器+2个URP着色器 -共59项独特资产 -一个演示场景,您可以在其中概述所有内容。 所有纹理都是512x512分辨率的P…

布隆过滤器详解及java实现

什么是布隆过滤器&#xff1f; 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种数据结构&#xff0c;用于判断一个元素是否属于一个集合。它的特点是高效地判断一个元素是否可能存在于集合中&#xff0c;但是存在一定的误判率。 布隆过滤器的基本原理是使用一个位数组…

原型变量、原子操作、原子性、内存序

一、原子变量、原子操作 锁竞争&#xff1a;互斥锁、条件变量、原子变量、信号量、读写锁、自旋锁。在高性能基础组件优化的时候&#xff0c;为了进一步提高并发性能&#xff0c;可以使用原子变量。性能&#xff1a;原子变量 > 自旋锁 > 互斥锁。 操作临界资源的时间较长…

第十讲 Query Execution Part 1

1 处理模型【Processing Model】 DBMS 的处理模型【Processing Model】定义了系统如何执行【execute】查询计划【Query Plan】。 针对不同的工作负载进行不同的权衡。 方法1&#xff1a;迭代器模型【Iterator Model】 方法2&#xff1a;物化模型【Materialization Model】 方…