• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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删除全部字符。