SQLite3是一款开源的嵌入式关系型数据库,可移植性好,易用性,内存开销小。
SQLite3是无类型的,意味着你可以保存任何类型的数据到任意表的任意字段中。比如下列的创表语句是合法的:
create table t_person(name,age)
为了保证可读性,建议还是把字段类型加上:
create table t_person(name text, age integer);
SQLite3常用的5种数据类型:text 、integer、float 、boolean、blob
---------------------------------
数据类型
{
text 字段
integer 数字
real 浮点
bolb 二进制 可以完整保存数据,例如照片
}
ddl(结构定义 CREATE ALTER DROP)
{
CREATE
CREATE TABLE 表的名字(每个字段的定义 字段名 数据类型...)
CREATE TABLE t_cjb(xiaoming text NOT NULL,
yuwen integer NOT NULL)
}
dml(数据操作 INSERT DELETE UPDATE SELECT)
{
INSERT
INSERT INTO 表名(字段列表) values(值的列表)
INSERT INTO studnet(id,name) VALUES (3,'linf') integer 可以不用''
UPDATE
UPDATE 表名 SET 字段名=值...WHERE 条件
UPDATE studnet SET telnum = '13100000000' WHERE name = 'xiaoming'
DELETE
DELETE FROM 表名 WHERE 条件
DELETE FROM studnet WHERE name = 'xiaoming'
SELECT
SELECT 字段列表 FROM 表名 WHERE 条件 ORDER BY 字段名
SELECT telnum (AS 电话号码) FROM studnet WHERE name = 'xiaoming'
SELECT * FROM studnet WHERE name = 'xiaoming' //显示所有列
SELECT * FROM studnet WHERE name LIKE '张%' //模糊查询,like
SELECT * FROM studnet WHERE age>20 AND age<30 //显示所有列,*
SELECT * FROM studnet WHERE age>20 ORDER BY age //排序,大于20的年龄从小到大排
SELECT * FROM studnet WHERE age>20 ORDER BY age DESC//排序,大于20的年龄从大到小排
统计函数(数据类型为intege real)
SELECT count(*) FROM studnet WHERE age>20 AND age<30 //求个数
SELECT sum(age) FROM studnet //求总数
SELECT avg(age) FROM studnet //求平均数
SELECT *,yuwen+shuxue+yingyu AS sum FROM student //各个列总和
此部分引自:http://my.oschina.net/u/2346786/blog/515540?fromerr=kl04EcAq
------------------------------------
在iOS中使用SQLite3,首先要添加库文件libsqlite3.dylib和导入头文件
创建、打开、关闭数据库
1.创建或打开数据库
首先获取iPhone上sqlite3的数据库文件的地址
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"database_name"];
获取地址后,打开数据库
sqlite3 *db;
int result = sqlite3_open([path UTF8String], &db);
上面的代码解析:sqlite3_open()将根据文件路径打开数据库,如果不存在,则会创建一个新的数据库。如果result等于常量SQLITE_OK,则标示成功打开数据库。
sqlite3 *db;是一个打开的数据库实例
Sqlite3数据库打开时的返回值及其所代表的含义:
数据库访问的路径必须以C字符串传入(而非NSString)
2.关闭数据库:sqlite3_close(db)
3.执行创表语句
char *errorMsg; // 用来存储错误信息
char *sql = "create table if not exists t_person(id integer primary key autoincrement, name text, age integer);";
int result = sqlite3_exec(db, sql, NULL, NULL, &errorMsg);
上述代码解释:sqlite3_exec()可以执行任何SQL语句,比如创建表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据
sqlite3_exec()还可以执行的语句:
开启事务:begin transaction;
回滚事务:rollback;
提交事务:commit;
4.带占位符插入数据
char *sql = "insert into t_person(name, age) values(?, ?);";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) {
sqlite3_bind_text(stmt, 1, "文本字符", -1, NULL);
sqlite3_bind_int(stmt, 2, 27);
}
if (sqlite3_step(stmt) != SQLITE_DONE) {
NSLog(@"插入数据错误");
}
sqlite3_finalize(stmt);
代码解析:
sqlite3_prepare_v2()返回值等于SQLITE_OK,说明数据库SQL语句已经准备成功,没有语法问题
sqlite3_bind_text():大部分绑定函数都只有3个参数
- 第一个参数是:sqlite3_stmt *类型
- 第二个参数是:指占位符的位置,第一个占位符的位置是1,不是0
- 第三个参数是:指占位符要绑定的值
- 第四个参数是:指在第3个参数中所传递数据的长度,对于C字符串,可以传递 -1 代替字符串的长度
- 第五个参数是:一个可选的函数回调,一般用于在语句执行后完成内存清理工作
sqlite_step():执行SQL语句,返回SQLITE_DONE代表成功执行完毕
sqlite_finalize():销毁sqlite3_stmt *对象
5.查询数据
char *sql = "select id,name,age from t_person;";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) {
while (sqlite3_step(stmt) == SQLITE_ROW) {
int _id = sqlite3_column_int(stmt, 0);
char *_name = (char *)sqlite3_column_text(stmt, 1);
NSString *name = [NSString stringWithUTF8String:_name];
int _age = sqlite3_column_int(stmt, 2);
NSLog(@"id=%i, name=%@, age=%i", _id, name, _age);
}
}
sqlite3_finalize(stmt);
代码解析:
sqlite3_step()返回SQLITE_ROW代表遍历到一条新纪录
sqlite3_column_*()用于获取每个字段对应的值,第2个参数是字段的索引,从0开始。
本文介绍的不完善,有兴趣的童鞋可以参考下面的链接!
参考资料:
http://mobile.51cto.com/iphone-392479.htm
http://my.oschina.net/u/2346786/blog/515540
http://www.xuebuyuan.com/2226926.html
http://blog.youkuaiyun.com/huifeidexin_1/article/details/7518179