问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用SQLite,Android上SQLite的最佳实践

发布网友 发布时间:2022-04-21 02:41

我来回答

1个回答

热心网友 时间:2022-06-17 12:19

  SQLite3是目前最新的SQLite版本。可以从网站上下载SQLite3的源代码(本书使用的版本是sqlite-3.6.12.tar.gz)。
  解压缩后进入sqlite-3.6.12的根目录,首先命令“./configure”生成Makefile文件,接着运行命令“make”对源代码进行编译,最后运行命令“make install”安装SQLite3。安装完毕后,可以运行命令sqlite3查看SQLite3是否能正常运行,如下所示:
  [root@localhost ~]# sqlite3
  SQLite version 3.6.12
  Enter ".help" for instructions
  Enter SQL statements terminated with a ";"
  sqlite>
  可以看到,SQLite3启动后会停留在提示符sqlite>处,等待用户输入SQL语句。
  在使用SQLite3前需要先了解下SQLite3支持的数据类型。SQLite3支持的基本数据类型主要有以下几类:
  NULL
  NUMERIC
  INTEGER
  REAL
  TEXT
  SQLite3会自动把其他数据类型转换成以上5类基本数据类型,转换规则如下所示:
  char、clob、test、varchar—> TEXT
  integer—>INTEGER
  real、double、float—> REAL
  blob—>NULL
  其余数据类型都转变成NUMERIC
  下面通过一个实例来演示SQLite3的使用方法。
  新建一个数据库
  新建数据库test.db(使用.db后缀是为了标识数据库文件)。在test.db中新建一个表test_table,该表具有name,、sex、age三列。SQLite3的具体操作如下所示:
  [root@localhost home]# sqlite3 test.db
  SQLite version 3.6.12
  Enter ".help" for instructions
  Enter SQL statements terminated with a ";"
  sqlite> create table test_table(name, sex, age);
  如果数据库test.db已经存在,则命令“sqlite3 test.db”会在当前目录下打开test.db。如果数据库test.db不存在,则命令“sqlite3 test.db”会在当前目录下新建数据库test.db。为了提高效率,SQLite3并不会马上创建test.db,而是等到第一个表创建完成后才会在物理上创建数据库。
  由于SQLite3能根据插入数据的实际类型动态改变列的类型,所以在create语句中并不要求给出列的类型。
  创建索引
  为了加快表的查询速度,往往在主键上添加索引。如下所示的是在name列上添加索引的过程。
  sqlite> create index test_index on test_table(name);
  操作数据
  如下所示的是在test_table中进行数据的插入、更新、删除操作:
  sqlite> insert into test_table values ('xiaoming', 'male', 20);
  sqlite> insert into test_table values ('xiaohong', 'female', 18);
  sqlite> select * from test_table;
  xiaoming|male|20
  xiaohong|female|18
  sqlite> update test_table set age=19 where name = 'xiaohong';
  sqlite> select * from test_table;
  xiaoming|male|20
  xiaohong|female|19
  sqlite> delete from test_table where name = 'xiaoming';
  sqlite> select * from test_table;
  xiaohong|female|19
  批量操作数据库
  如下所示的是在test_table中连续插入两条记录:
  sqlite> begin;
  sqlite> insert into test_table values ('xiaoxue', 'female', 18);
  sqlite> insert into test_table values ('xiaoliu', 'male', 20);
  sqlite> commit;
  sqlite> select * from test_table;
  xiaohong|female|19
  xiaoxue|male|18
  xiaoliu|male|20
  运行命令commit后,才会把插入的数据写入数据库中。
  数据库的导入导出
  如下所示的是把test.db导出到sql文件中:
  [root@localhost home]# sqlite3 test.db ".mp" > test.sql;
  test.sql文件的内容如下所示:
  BEGIN TRANSACTION;
  CREATE TABLE test_table(name, sex, age);
  INSERT INTO "test_table" VALUES('xiaohong','female',19);
  CREATE INDEX test_index on test_table(name);
  COMMIT;
  如下所示的是导入test.sql文件(导入前删除原有的test.db):
  [root@localhost home]# sqlite3 test.db < test.sql;
  通过对test.sql文件的导入导出,可以实现数据库文件的备份。
  11.2.2 SQLite3的C接口
  以上介绍的是SQLite3数据库的命令操作方式。在实际使用中,一般都是应用程序需要对数据库进行访问。为此,SQLite3提供了各种编程语言的使用接口(本书介绍C语言接口)。SQLite3具有几十个C接口,下面介绍一些常用的C接口。
  sqlite_open
  作用:打开SQLite3数据库
  原型:int sqlite3_open(const char *dbname, sqlite3 **db)
  参数:
  dbname:数据库的名称;
  db:数据库的句柄;
  sqlite_colse
  作用:关闭SQLite3数据库
  原型:int sqlite_close(sqlite3 *db)
  例如:
  test.c:
  #include <stdio.h>
  #include <sqlite3.h>

  static sqlite3 *db=NULL;

  int main()
  {
  int rc;
  rc= sqlite3_open("test.db", &db);

  if(rc)
  {
  printf("can't open database!\n");
  }
  else
  {
  printf("open database success!\n");
  }

  sqlite3_close(db);
  return 0;
  }
  运行命令“gcc –o test test.c –lsqlite3”进行编译,运行test的结果如下所示:
  [root@localhost home]# open database success!
  sqlite_exec
  作用:执行SQL语句
  原型:int sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void*,int,char**,char**), void *, char **errmsg)
  参数:
  db:数据库;
  sql:SQL语句;
  callback:回滚;
  errmsg:错误信息
  例如:
  test.c:
  #include <stdio.h>
  #include <sqlite3.h>

  static sqlite3 *db=NULL;
  static char *errmsg=NULL;

  int main()
  {
  int rc;

  rc = sqlite3_open("test.db", &db);
  rc = sqlite3_exec(db,"insert into test_table values('bao', 'male', 24)", 0, 0, &errmsg);

  if(rc)
  {
  printf("exec fail!\n");
  }
  else
  {
  printf("exec success!\n");
  }

  sqlite3_close(db);
  return 0;
  }
  编译完成后,运行test的结果如下所示:
  [root@localhost home]# ./test
  exec success!
  [root@localhost home]# sqlite3 test.db
  SQLite version 3.6.11
  Enter ".help" for instructions
  Enter SQL statements terminated with a ";"
  sqlite> select * from test_table;
  bao|male|24
  sqlite3_get_table
  作用:执行SQL查询
  原型:int sqlite3_get_table(sqlite3 *db, const char *zSql, char ***pazResult, int *pnRow, int *pnColumn, char **pzErrmsg)
  参数:
  db:数据库;
  zSql:SQL语句;
  pazResult:查询结果集;
  pnRow:结果集的行数;
  pnColumn:结果集的列数;
  errmsg:错误信息;
  sqlite3_free_table
  作用:注销结果集
  原型:void sqlite3_free_table(char **result)
  参数:
  result:结果集;
  例如:
  test.c:
  #include <stdio.h>
  #include <sqlite3.h>

  static sqlite3 *db=NULL;
  static char **Result=NULL;
  static char *errmsg=NULL;

  int main()
  {
  int rc, i, j;
  int nrow;
  int ncolumn;

  rc= sqlite3_open("test.db", &db);
  rc= sqlite3_get_table(db, "select * from test_table", &Result, &nrow, &ncolumn,
  &errmsg);

  if(rc)
  {
  printf("query fail!\n");
  }
  else
  {
  printf("query success!\n");
  for(i = 1; i <= nrow; i++)
  {
  for(j = 0; j < ncolumn; j++)
  {
  printf("%s | ", Result[i * ncolumn + j]);
  }
  printf("\n");
  }
  }

  sqlite3_free_table(Result);
  sqlite3_close(db);
  return 0;
  }
  编译完成后,运行test的结果如下所示:
  [root@localhost home]# ./test
  query success!
  xiaohong | female | 19 |
  xiaoxue | female | 18 |
  xiaoliu | male | 20 |
  bao | male | 24 |
  sqlite3_prepare
  作用:把SQL语句编译成字节码,由后面的执行函数去执行
  原型:int sqlite3_prepare(sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **stmt, const char **pTail)
  参数:
  db:数据库;
  zSql:SQL语句;
  nByte:SQL语句的最大字节数;
  stmt:Statement句柄;
  pTail:SQL语句无用部分的指针;
  sqlite3_step
  作用:步步执行SQL语句字节码
  原型:int sqlite3_step (sqlite3_stmt *)
  例如:
  test.c:
  #include <stdio.h>
  #include <sqlite3.h>

  static sqlite3 *db=NULL;
  static sqlite3_stmt *stmt=NULL;

  int main()
  {
  int rc, i, j;
  int ncolumn;

  rc= sqlite3_open("test.db", &db);
  rc=sqlite3_prepare(db,"select * from test_table",-1,&stmt,0);

  if(rc)
  {
  printf("query fail!\n");
  }
  else
  {
  printf("query success!\n");
  rc=sqlite3_step(stmt);
  ncolumn=sqlite3_column_count(stmt);
  while(rc==SQLITE_ROW)
  {
  for(i=0; i<2; i++)
  {
  printf("%s | ", sqlite3_column_text(stmt,i));
  }
  printf("\n");
  rc=sqlite3_step(stmt);
  }
  }

  sqlite3_finalize(stmt);
  sqlite3_close(db);
  return 0;
  }
  编译完成后,运行test的结果如下所示:
  [root@localhost home]# ./test
  query success!
  xiaohong | female | 19 |
  xiaoxue | female | 18 |
  xiaoliu | male | 20 |
  bao | male | 24 |
  在程序中访问SQLite3数据库时,要注意C API的接口定义和数据类型是否正确,否则会得到错误的访问结果。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 黑龙江债权转让合同纠纷该怎样取证 安徽债权转让合同纠纷应该怎么样取证 android上如何使用sqlite数据库 在Android应用程序中使用SQLite数据库以及怎么用 android怎么连接sqlite数据库?。 如何在android中使用sqlite数据库 android怎么操作sqlite数据库 android 关于连接 sqlite问题 android怎么连接sqlite数据库? 怎么设置页眉随章节名变化啊 插入页眉如何使页次自动变 页眉页脚为什么改一个全改了? 设置页眉页脚怎么使改动一个其余自动更新 页眉页脚里的旧内容怎么全部替换新内容 404 Not Found 璇烽棶钥冮泤镐濋渶瑕侀佩涓&#xFFFD;殑姣曚笟璇佷功鍚楋紵 怎么更改全部页眉页脚?? Microsoft Office Word 中,页眉怎么批量变化? 在Office2010中,如何为论文添加自动更新章节的页眉 word页眉中的页码怎么自动更新 怎么用PS软件把脸上的斑点去掉? 如何炒干黄豆好吃。 android 怎么查看sqlite数据库 android系统sqlite数据库文件怎么打开 如何解解析android的sqlite数据库的数据 安卓怎么使用sqlite数据库实例 android连接sqlite数据库,怎么查询数据库里面的数据 关于android SQLite的问题 android sqlite 对sqlite有哪些优化 android sqlite数据库的更新 android sqlite框架哪个好 oppo主题商店怎么自己设计主题 oppo手机主题商店 OPPO 主题商店里的主题皮肤购买后是不是永久的? 怎么在oppo主题商店里制作主题或字体? 苹果xr怎么设置其他铃声 切洋葱该怎样避免流泪 怎样切洋葱不刺眼? 如何在切洋葱时让眼睛不被熏到? 如何避免切洋葱流眼泪? 切洋葱时候很冲眼睛,怎么避免呢? 切洋葱时,怎样避免辣到眼睛?