SQLite在linux下的安装

下载 sqlite-3.3.6.tar.gz
解压并拷贝至你想要安装到的目录下,我选择的是/usr/local/sqlite-3.3.6
接着在终端里:
# cd /usr/local/sqlite-3.3.6
# ./configure
# make
# make install
# make doc

make
的时候提示错误
../sqlite-3.3.6/src/tclsqlite.c: In function `DbUpdateHandler':
../sqlite-3.3.6/src/tclsqlite.c:333: warning: passing arg 3 of `Tcl_ListObjAppendElement' makes pointer from integer without a cast
……
这个都是tcl 相关的错误, 可以先安装ActiveTcl 以解决. 假如你不需要tcl 支持, 那么这个错误可以这样避免:
# ./configure --disable-tcl --prefix=/usr/local/sqlite-3.3.6
# make
如果提示没有可以编译的文件,则是第一次make 时已经执行过了,接着下面做就可以了;如果此次是第一次编译,应该不会再提示出错了
# make install
# make doc

测试是否安装成功
# cd /usr/lcoal/sqlite-3.3.6
# ./sqlite3 text.db //
这也是进入数据库的方法

如果安装成功,会出现下面这样的信息
SQLite version 3.3.6
Enter ".help" for instructions
sqlite>
接下来就可以自由操作啦,和在windows 下是一样的啦。

二、 SQLite 基本操作

如以下操作:创建表、插入、查询:

sqlite>createtabletbl1(onevarchar(10),twosmallint);
sqlite>insertintotbl1values('hello!',10);
sqlite>insertintotbl1values('goodbye',20);
sqlite>select*fromtbl1;
hello!|10
goodbye|20
sqlite>

注意每句SQL 语句后一定要有分号 semicolon

Special commands to sqlite3

sqlite>.help

.databasesListnamesandfilesofattacheddatabases
.exitExitthisprogram

.outputFILENAMESendoutputtoFILENAME
.outputstdoutSendoutputtothescreen

.tables List the tables

参考文件:A command-line access program for sqlite databases//www.sqlite.org

三、C/C++SQLite 编程

参考文件:A introduction to the sqlite c/c++ interface

找到安装SQLite 的路径:

我们的 sqlite3 的库文件目录是: /usr/local/sqlite3/lib // 我的机子安装目录文件名是 sqlite-3.3.6
可执行文件 sqlite3 的目录是:
/usr/local/sqlite3/bin
头文件 sqlite3.h 的目录是: /usr/local/sqlite3/include

编译指南 现在编译: [root@localhost dada]# gcc c3.c -o c3

opendbsqlite.c:11:21: sqlite3.h: 没有那个文件或目录
opendbsqlite.c: In function `main':
opendbsqlite.c:19: `sqlite3' undeclared (first use in this function) //
这是由于没有找到头文件的原因

/tmp/ccTkItnN.o(.text+0x2b): In function `main':
: undefined reference to `sqlite3_open'
/tmp/ccTkItnN.o(.text+0x45): In function `main': //
这是个没有找到库文件的问题。

可以在 gcc 语句后面加上如下

-lsqlite3 -L/usr/local/sqlite3/lib -I/usr/local/sqlite3/include

指明用到的库文件;为库文件指定路径;为头文件指定路径

继续编译

出现 " error while loading shared libraries " 等错误

我们可以这样解决:
方法一:静态编译

在编译时加上 -static 参数,例如

[root@localhost temp]# gcc c3.c -o c3 -lsqlite3 -L/usr/local/sqlite3/lib -I/usr/local/sqlite3/include –static

静态编译后的文件相对动态编译更大,很容易理解,静态编译把头库文件作为程序的一部分都包含进来了。

方法二:重新配置系统环境变量 LD_LIBRARY_PATH
这时需要指定 libsqlite3.so.0 库文件的路径 , 也就是配置系统环境变量 LD_LIBRARY_PATH

使系统能够找到 libsqlite3.so.0

好了,现在我们来指定系统环境变量 LD_LIBRARY_PATH 的值
shell 下输入:

[root@localhost temp]#
export LD_LIBRARY_PATH=/usr/local/sqlite3/lib:$LD_LIBRARY_PATH
看看现在系统环境设置:
[root@localhost temp]#env

….

LD_LIBRARY_PATH=/usr/local/sqlite3/lib:

….. ( 看到了吧, LD_LIBRARY_PATH 这一行开始就是 sqlite3 的库文件路径: )
去掉 -static, 再编译:

[root@localhost temp]# gcc c3.c -o c3 -lsqlite3 -L/usr/local/sqlite3/lib -I/usr/local/sqlite3/include

我们推荐使用动态编译的方法。
至此编译就不会有什么问题了,另外一点:如果在程序中把# include <sqlite3.h> 写成# include<usr/local/sqlite-3.3.6/include/sqlite3.h>, 这样在编译的时候就不需要 -I/usr/local/sqlite3/include 了。

常用函数

int sqlite3_open(

  const char *filename,  /* Database filename (UTF-8) */ 

  sqlite3 **ppDb  /* OUT: SQLite db handle */ 

);  

int sqlite3_close(sqlite3 *);

int sqlite3_exec(sqlite3*,const char *sql,sqlite3_callback,void *,char **errmsg );

这就是执行一条 sql 语句的函数。

1 个参数不再说了,是前面 open 函数得到的指针。说了是关键数据结构。

2 个参数 const char *sql 是一条 sql 语句,以 /0 结尾。

3 个参数 sqlite3_callback 是回调,当这条语句执行之后, sqlite3 会去调用你提供的这个函数。

4 个参数 void * 是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,这个指针比较重要,可以用来作参数的传递。如果不需要传递指针给回调函数,可以填 NULL 。等下我们再看回调函数的写法,以及这个参数的使用。

5 个参数 char ** errmsg 是错误信息。注意是指针的指针。 sqlite3 里面有很多固定的错误信息。执行 sqlite3_exec 之后,执行失败时可以查阅这个指针(直接 printf(“%s/n”,errmsg) )得到一串字符串信息,这串信息告诉你错在什么地方。 sqlite3_exec 函数通过修改你传入的指针的指针,把你提供的指针指向错误提示信息,这样 sqlite3_exec 函数外面就可以通过这个 char* 得到具体错误提示。

说明:通常, sqlite3_callback 和它后面的 void * 这两个位置都可以填 NULL 。填 NULL 表示你不需要回调。比如你做 insert 操作,做 delete 操作,就没有必要使用回调。而当你做 select 时,就要使用回调,因为 sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。用 select 时也可以用 sqlite3_get_table

查询:

int sqlite3_get_table(

  sqlite3 *db,   /* An open database */ 

  const char *zSql,  /* SQL to be evaluated */ 

  char ***pazResult,  /* Results of the query */ 

  int *pnRow,  /* Number of result rows written here */ 

  int *pnColumn,  /* Number of result columns written here */ 

  char **pzErrmsg  /* Error msg written here */ 

);

void sqlite3_free_table(char **result);  // 释放内存空间

例子程序:

#include <stdio.h>

#include </usr/local/sqlite-3.3.6/include/sqlite3.h>

int main(void){

sqlite3 *db;

char *zErrMsg = 0;

int rc;

rc = sqlite3_open("text.db",&db); // 打开数据库

if( rc ){

fprintf(stderr,"Can't open database: %s/n",sqlite3_errmsg(db));

sqlite3_close(db);

exit(1);

}

else printf("you have opened a sqlite3 database named text.db sucessfully!");

char *sql="create table student(id integer,name varchar(10));"; // 创建表

sqlite3_exec(db,sql,&zErrMsg);

sql="insert into/"student/" values(23,'Lebron');"; 插入记录

sqlite3_exec(db,&zErrMsg);

int nrow = 0,ncolumn = 0;

char **azResult; // 二维数组存放结果

// 查询数据

/*

int sqlite3_get_table(sqlite3*,char***result,int *nrow,int *ncolumn,char **errmsg );

result 中是以数组的形式存放你所查询的数据,首先是表名,再是数据。

nrow,ncolumn 分别为查询语句返回的结果集的行数,列数,没有查到结果时返回 0

*/

sql = "SELECT * FROM student ";

sqlite3_get_table( db,&azResult,&nrow,&ncolumn,&zErrMsg );

int i = 0 ;

printf( "row:%d column=%d /n",nrow,ncolumn );

printf( "/nThe result of querying is : /n" );

for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )

printf( "azResult[%d] = %s/n",i,azResult[i] );

sql = "DELETE FROM student WHERE ID = 1 ;" ; // 删除记录
sqlite3_exec( db,&zErrMsg );

// 释放掉 azResult 的内存空间
sqlite3_free_table( azResult );

sqlite3_close(db); // 关闭数据库

return 0;

}

< 上述代码可以在本机 /root/dada/c3.c 中找到 .>

两点说明:

1 程序会在开头定义 #define _DEBUG_

#ifdef _DEBUG_
printf("zErrMsg = %s /n",zErrMsg);
#endif

如果调试的话,即有 #define _DEBUG_ 就会输出调试的错误信息,否则如果注释掉 #define _DEBUG 就不执行这段代码。

2 rc = sqlite3_open("text.db",&db); 如果 text.db 不存在的话,则是会在 c3 文件同目录下自动生成这样一个同名的数据库。

如何执行一个.db 文件 (通常这个文件不在安装 sqlite 的目录路径下):

# /usr/local/sqlite-3.3.6/bin/sqlite3 text.db //( /usr/local/sqlite-3.3.6/bin/sqlite3 即是程序 )

若出现错误 error:while loading shared libraries 则需要先执行 ---

export LD_LIBRARY_PATH=/usr/local/sqlite-3.3.6/lib:$LD_LIBRARY_PATH

然后就可以进入数据库了: sqlite>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


SQLite架构简单,又有Json计算能力,有时会承担Json文件/RESTful的计算功能,但SQLite不能直接解析Json文件/RESTful,需要用Java代码硬写,或借助第三方类库,最后再拼成insert语句插入数据表,代码非常繁琐,这里就不展示了。参考前面的代码可知,入库的过程比较麻烦,不能只用SQL,还要借助Java或命令行。SPL是现代的数据计算语言,属于简化的面向对象的语言风格,有对象的概念,可以用点号访问属性并进行多步骤计算,但没有继承重载这些内容,不算彻底的面向对象语言。...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。本教程将告诉您如何使用 SQLite 编程,并让你迅速上手。.................................
安卓开发,利用SQLite实现登陆注册功能
相比大多数数据库而言,具有等优势,广泛应用于、等领域。
有时候,一个项目只有一个数据库,比如只有SQLite,或者MySQL数据库,那么我们只需要使用一个固定的数据库即可。但是一个项目如果写好了,有多个用户使用,但是多个用户使用不同的数据库,这个时候,我们就需要把软件设计成可以连接多个数据库的模式,用什么数据库,就配置什么数据库即可。4.Users实体类,这个实体类要和数据库一样的,形成一一对应的关系。11.Sqlite数据库,需要在代码里面创建数据库,建立表,再建立数据。8.我们开启MySQL数据库,然后进行调试,看程序的结果。2.安装SqlSugar。
基于Android的背单词软件,功能强大完整。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。说白了就是使用起来轻便简单,
Android的简单购物车案例
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库...
Qt设计较为美观好看的登录注册界面(包含SQLite数据库以及TCP通信的应用)
SQLite是用C语言开发的跨平台小型数据库,可嵌入其他开发语言,也可在单机执行。SPL是用Java开发的跨平台的数据计算语言,可嵌入Java,可在单机执行,可以数据计算服务的形式被远程调用。两者的代码都是解释执行的。...
新建库.openDATA_BASE;新建表createtableLIST_NAME(DATA);语法:NAME关键字...<用逗号分割>删除表droptableNAME;查看表.schema查看表信息新建数据insertintoLIST_NAMEvalues();语法:CLASS,PARAMETER...,CLASS是类别,PARAMETER是参数<用逗号分割新建的
importsqlite3classDemo01:def__init__(self):self.conn=sqlite3.connect("sql_demo_001.db")self.cursor1=self.conn.cursor()self.cursor1.execute("select*fromtable_001wherename=?andid=?",('ssss&#0
 在客户端配置文件<configuration>节点下,添加:<connectionStrings>      <add name="localdb" connectionString="Data Source=config/local.db;Version=3;UseUTF16Encoding=True;" providerName="System.Data.SQLite.SQLiteFactory"/&g
提到锁就不得不说到死锁的问题,而SQLite也可能出现死锁。下面举个例子:连接1:BEGIN(UNLOCKED)连接1:SELECT...(SHARED)连接1:INSERT...(RESERVED)连接2:BEGIN(UNLOCKED)连接2:SELECT...(SHARED)连接1:COMMIT(PENDING,尝试获取EXCLUSIVE锁,但还有SHARED锁未释放,返回SQLITE_BUSY)连接2:INSERT...
SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。在使用SQLite前,我们先要搞清楚几个概念:表
设计思想————首先要确定有几个页面、和每个页面的大致布局由于是入门,我也是学习了不是很长的时间,所以项目比较low。。。。第一个页面,也就是打开APP的首页面:今天这个博客,先实现添加功能!:首先对主界面进行布局:其中activity_main.xml的代码为<?xmlversion="1.0"encoding="