1# SQLite调试工具指导 2<!--Kit: ArkData--> 3<!--Subsystem: DistributedDataManager--> 4<!--Owner: @MyLinChi--> 5<!--Designer: @csuxsh--> 6<!--Tester: @zhujieliang--> 7<!--Adviser: @ge-yafang--> 8 9SQLite是一款轻量级、嵌入式、无服务器的关系型数据库管理系统,其核心优势在于将整个数据库存储于单一文件中,无需独立服务器进程,支持跨平台运行,被广泛应用于移动应用、嵌入式设备和桌面软件等场景。 10 11本调试工具基于hdc命令实现对SQLite数据库的操作,提供一种通过命令行接口高效管理SQLite数据库的方式,适用于开发、调试和运维阶段对数据库的快速操作与验证。 12 13## 环境要求 14 15- 开发者在使用本工具前需开启[开发者模式](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-developer-mode#section530763213432),且需要获取[hdc工具](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/hdc),执行hdc shell。 16- 连接设备。 17 18## 操作准备 19 20在使用SQLite之前需先切换至目标调试应用路径下,再使用命令进入到SQLite调试工具。 21 22```bash 23# 打开 hdc 命令行 24c:/users/zzz>hdc shell 25$ cd /data/app/el1/100/base/com.test.myapplication // 进入到目标调试应用路径下(当前路径为示例,开发者需自己获取调试应用路径)。 26$ ls -lZ // 查看路径下的数据库文件,有debug_hap_data_file标签,则确认为调试应用的文件。 27total 9531 28drwxrwsr-x 2 20020197 ddms o:object_r:debug_hap_data_file:s0:x229,x334,x512,x868,x1024 3440 2025-08-08 16:54 lock 29-rw-rw---- 1 20020197 ddms o:object_r:debug_hap_data_file:s0:x229,x334,x512,x868,x1024 9228288 2025-08-08 16:55 rdbPerfTest.db 30-rw-rw---- 1 20020197 ddms o:object_r:debug_hap_data_file:s0:x229,x334,x512,x868,x1024 343 2025-08-08 16:54 rdbPerfTest.db-compare 31-rw-rw---- 1 20020197 ddms o:object_r:debug_hap_data_file:s0:x229,x334,x512,x868,x1024 12288 2025-08-08 16:55 rdbPerfTest.db-dwr 32-rw-rw---- 1 20020197 ddms o:object_r:debug_hap_data_file:s0:x229,x334,x512,x868,x1024 32768 2025-08-08 16:55 rdbPerfTest.db-shm 33-rw-rw---- 1 20020197 ddms o:object_r:debug_hap_data_file:s0:x229,x334,x512,x868,x1024 444992 2025-08-08 16:55 rdbPerfTest.db-wal 34$ sqlite3 rdbPerfTest.db // 打开数据库文件。 35SQLite version 3.44.4 2025-02-19 00:18:53 36Enter ".help" for usage hints. 37sqlite> 38``` 39 40在非调试应用路径下,尝试执行数据库和表的创建操作时,系统将抛出权限错误。 41 42使用SQL语句中的`CREATE TABLE`命令创建表,具体如下: 43 44```bash 45# 打开 hdc 命令行 46c:/users/zzz>hdc shell 47# 尝试打开或创建新的数据库 48$ sqlite3 a.db 49SQLite version 3.44.4 2025-02-19 00:18:53 50Enter ".help" for usage hints. 51# 创建表 52sqlite>create table t1(a int); 53Error: unable to open database "a.db": unable to open database file 54# 打开asd.db数据库 55sqlite> .open asd.db 56Error: unable to open database "asd.db": unable to open database file 57Notice: using substitute in-memory database instead of "asd.db" 58``` 59 60执行上述命令时,SQLite尝试打开或创建表与asd.db数据库,但由于没有权限,会出现以下的错误信息: 61 62```bash 63# 创建表 64sqlite>create table t1(a int); 65Error: unable to open database "a.db": unable to open database file 66# 打开asd.db数据库 67sqlite> .open asd.db 68Error: unable to open database "asd.db": unable to open database file 69Notice: using substitute in-memory database instead of "asd.db" 70``` 71SQLite访问加密数据库后,查询会出现以下报错: 72```sqlite 73# sqlite3 ./wallet_personal_info_data_relational_store 74SQLite version 3.44.4 2025-02-19 00:18:53 75Enter ".help" for usage hints. 76sqlite> select * from sqlite_master; 77Parse error: file is not a database (26) 78sqlite> .table 79Error: file is not a database 80sqlite> .q 81``` 82 83## 命令列表 84 85当前SQLite调试工具支持的命令如下表所示: 86 87| 命令 | 功能描述 | 88| ------------------ | --------------------------------------- | 89| `.help` | 显示所有可用的SQLite命令及简要说明。 | 90| `.open 数据库名称` | 打开或创建一个数据库文件。 | 91| `.databases` | 列出当前连接的所有数据库。 | 92| `.tables` | 列出当前数据库中的所有表。 | 93| ` .show` | 查看SQLite命令提示符的默认设置。 | 94| `.schema` | 获取表的完整信息。 | 95| `.quit` 或 `.exit` | 退出SQLite命令行界面。 | 96| `.schema [TABLE]` | 显示表的创建SQL语句(或所有表的结构)。 | 97 98## 注意事项 99 100- SQLite命令不需要分号:与SQL语句不同,SQLite命令直接回车执行,无需添加分号。 101- 需确保`sqlite>`提示符与命令之间不存在空格,否则将导致命令无法正常执行。 102 103## 命令的具体使用及示例 104 105### 帮助命令(.help) 106 107```SQLite 108sqlite>.help 109``` 110### 创建或打开已有的数据库 111 112- 打开已有数据库 113 114 若数据库文件已存在,可通过`.open`打开: 115 116 ```SQLite 117 sqlite3 # 进入SQLite交互式Shell 118 .open /data/app/el1/100/base/com.test.myapplication/mydb.db # 在Shell内打开已有数据库 119 ``` 120 121 或直接在命令行指定文件路径: 122 123 ```SQLite 124 sqlite3 /data/app/el1/100/base/com.test.myapplication/mydb.db # 直接打开数据库(跳过进入Shell步骤) 125 ``` 126 127 128- 创建并打开新数据库 129 130 若指定的数据库文件不存在,SQLite将自动创建该文件: 131 132 ```SQLite 133 sqlite3 # 进入SQLite Shell 134 .open /data/app/el1/100/base/com.test.myapplication/newdb.db # 在Shell内创建并打开新数据库 135 ``` 136 137 或直接通过命令行创建: 138 139 ```SQLite 140 sqlite3 /data/app/el1/100/base/com.test.myapplication/newdb.db # 直接创建并打开新数据库 141 ``` 142 143### 创建表 144 145可通过SQL语句`create table`创建COMPANY表,将ID设置为主键,NOT NULL约束表示在表中创建记录时这些字段不可为空: 146 147```SQL 148sqlite>create table COMPANY( 149 ID INT PRIMARY KEY NOT NULL, 150 NAME TEXT NOT NULL, 151 AGE INT NOT NULL, 152 ADDRESS CHAR(50), 153 SALARY REAL 154); 155``` 156 157### 查询表 158 159通过SQLite命令`.tables`命令验证表是否创建成功,该命令用于列出附加数据库中的所有表。 160 161```SQLite 162sqlite>.tables 163COMPANY 164``` 165 166在此处可查看到刚创建的表COMPANY。 167 168通过SQLite命令`.schema`命令可获取表的完整信息,具体如下: 169 170```SQLite 171sqlite>.schema COMPANY 172CREATE TABLE COMPANY( 173 ID INT PRIMARY KEY NOT NULL, 174 NAME TEXT NOT NULL, 175 AGE INT NOT NULL, 176 ADDRESS CHAR(50), 177 SALARY REAL 178); 179``` 180 181### 删除表 182 183SQL语句`DROP TABLE`语句用于删除表定义及其关联的所有数据、索引、触发器、约束和权限规范。 184 185示例:若数据库中已存在 `COMPANY` 表,可通过以下操作将其删除: 186 187```SQLite 188sqlite>DROP TABLE COMPANY; 189``` 190 191执行后,使用 `.tables` 命令将无法查询到 `COMPANY` 表,显示结果为空即表示删除成功。 192 193```SQLite 194sqlite>.tables 195``` 196 197### 插入数据 198 199- 在 sqlite> 提示符下,输入以下SQL语句插入单条数据: 200 201 ```sql 202 INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY) VALUES (1, '张三', 28, '北京市朝阳区', 20000.5); 203 ``` 204 205 通过SQL语句`SELECT * FROM 表的名称`可获取表的完整信息,具体如下: 206 207 ```sql 208 sqlite> SELECT * FROM COMPANY; 209 1|张三|28|北京市朝阳区|20000.5 210 ``` 211 212 213- 输入以下SQL语句`INSERT INTO COMPANY(字段)values()`语句插入多条数据: 214 215 ```sql 216 sqlite> INSERT INTO COMPANY(ID, NAME, AGE, ADDRESS, SALARY) 217 ...> VALUES 218 ...> (3, '王五', 25, '广州市天河区', 18000.75), 219 ...> (4, '赵六', 40, '深圳市南山区', 30000.25); 220 ``` 221 222 通过SQL语句`SELECT * FROM 表的名称`查询所有数据,具体如下: 223 224 ```sql 225 sqlite> SELECT * FROM COMPANY; 226 1|张三|28|北京市朝阳区|20000.5 227 3|王五|25|广州市天河区|18000.75 228 4|赵六|40|深圳市南山区|30000.25 229 ``` 230 231### 查询数据 232 233在sqlite>提示符下,可通过` SELECT`查询数据,支持以下几种数据查询: 234 235- 可通过SQL语句`SELECT * FROM 表的名称`查询所有数据 236 237 ```sql 238 sqlite> SELECT * FROM COMPANY; 239 1|张三|28|北京市朝阳区|20000.5 240 3|王五|25|广州市天河区|18000.75 241 4|赵六|40|深圳市南山区|30000.25 242 ``` 243 244- 可通过SQL语句`SELECT 指定字段, 指定字段 FROM 表的名称`查询指定字段的数据 245 246 ```sql 247 sqlite> SELECT name, age FROM COMPANY; 248 张三|28 249 王五|25 250 赵六|40 251 ``` 252 253- 可通过SQL语句`SELECT * FROM 表的名称 WHERE 指定字段 > 30;`指定条件查询 254 255 ```sql 256 sqlite> SELECT * FROM COMPANY WHERE age > 30; 257 4|赵六|40|深圳市南山区|30000.25 258 ``` 259 260- 可通过SQL语句`SELECT * FROM 表的名称 ORDER BY 指定字段 ASC;`指定字段排序查询 261 262 ```sql 263 sqlite>SELECT * FROM COMPANY ORDER BY age ASC; 264 3|王五|25|广州市天河区|18000.75 265 1|张三|28|北京市朝阳区|20000.5 266 4|赵六|40|深圳市南山区|30000.25 267 ``` 268 269### 更新数据 270 271在sqlite>提示符下,可通过SQL语句`UPDATE 表名称 SET age = 31 WHERE name = '张三';`语句插入单条数据 272 273```sql 274sqlite>UPDATE COMPANY SET age = 31 WHERE name = '张三'; 275sqlite>SELECT * FROM COMPANY; 2761|张三|31|北京市朝阳区|20000.5 2773|王五|25|广州市天河区|18000.75 2784|赵六|40|深圳市南山区|30000.25 279``` 280 281### 删除数据 282 283在sqlite>提示符下,可通过SQL语句`DELETE FROM 表名称 WHERE name = '王五';`语句删除数据 284 285```sql 286sqlite> DELETE FROM COMPANY WHERE name = '王五'; 287sqlite> SELECT * FROM COMPANY; 2881|张三|28|北京市朝阳区|20000.5 2894|赵六|40|深圳市南山区|30000.25 290``` 291 292## 相关参考 293 294[SQLite官方网站](https://SQLite.org/docs.html)提供了丰富的示例代码,包括创建数据库、创建表、插入数据和查询数据等操作,开发者可以进行参考和查看。 295 296## 常见问题 297 298### 查询结果为空时的问题处理 299 300在实际的数据库操作中,有时会遇到查询结果为空的情况,这是因为表中没有数据。 301 302为了避免这种情况,需确保已在表中插入相关数据,再进行查询操作。 303 304### 如何删除字符 305使用Ctrl+BackSpace删除单个字符,使用Ctrl+U删除全部字符。