标签:
|SQLite3简介
SQLite3只是一个轻型的嵌入式数据库引擎,占用资源非常低,处理速度比Mysql还快,专门用于移动设备上进行适量的数据存取,它只是一个文件,不需要服务器进程。
常用术语:表(table)、字段(column,列,属性)、记录(row,record)。
|SQL(structured query language)语句
特点:不区分大小写,每条语句后加";"结尾。
关键字:select、insert、update、delete、from、creat、where、desc、order、by、group、table、alter、view、index等,数据库中不能使用关键字命名表和字段。
数据定义语句(DDL:Data Definition Language)
CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);
DROP TABLE IF EXISTS t_person;
数据操作语句(DML:Data Manipulation language)
INSERT INTO t_person (name, age) VALUES (‘大明‘, 22);
UPDATE t_person SET name = ‘小明‘, age = 10; // 把表中name字段的值全部改成小明,age字段的值全部改成10。
UPDATE t_person SET age = 12 WHERE name = ‘小明‘; // 把表中name字段值是小明的age值改为12。
DELETE FROM t_person; // 删除表中的所有记录。
DELETE FROM t_person WHERE age = 25; // 删除表中字段age等于25的这条记录。
DELETE FROM t_person WHERE age > 12 AND age < 15; // 删除表中年龄大于12且小于15的记录。
数据查询语句(DQL:Data Query Language)
SELECT name, age FROM t_person WHERE age < 80;
SELECT * FROM t_person WHERE age < 80;
SELECT name, age nianling FROM t_person ren WHERE ren.age > 80 AND nianling < 90;
SELECT count(name) FROM t_person ren WHERE ren.age > 80;
SELECT count(*) FROM t_person ren WHERE ren.age > 80;
SELECT * FROM t_person WHERE age < 100 ORDER BY age DESC, name ASC; // 先按年龄降序,再按名字升序。
SELECT * FROM t_person WHERE age < 100 ORDER BY age DESC, name ASC LIMIT 3, 5; // 先筛选,后排序,再分页。
SELECT * FROM t_person WHERE name like ‘%明%‘;
存储类型:integer(整型)、real(浮点型)、text(文本字符串)、blob(二进制数据)。
实际上SQLite是无类型的,建表时声明的类型是为了方便程序员之间的交流,是一种良好的编程规范。
字段约束:
CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL UNIQUE, age integer NOT NULL DEFAULT 30);
外键:利用外键约束可以用来建立表与表之间的联系,一般是一张表的某个字段,引用着另一张表的主键的字段。
CREATE TABLE IF NOT EXISTS t_class (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL UNIQUE);
CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL, class_id integer NOT NULL, CONSTRAINT fk_student_class FOREIGN KEY (class_id) REFERENCES t_class(id));
SELECT t.name t_name, t.age t_age, tc.name c_name FROM t_student t, t_class tc WHERE t.class_id = tc.id; // 查询所有学生对应的班级
SELECT * FROM t_student WHERE class_id = (SELECT id FROM t_class WHERE name = ‘四班‘); // 查询四班的所有学生
|SQLite3的使用
1、导入libsqlite3.dylib库,包含头文件#import <sqlite3.h>。
2、打开或者创建数据库。
1 sqlite3 *sq = NULL; // 一个打开的数据库实例
2 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"test.sqlite"];
3
4 // 根据文件路径打开数据库,如果不存在,则会创建一个新的数据库。
5 // 数据库文件的路径必须以C字符串(而非NSString)传入。
6 int result = sqlite3_open(path.UTF8String, &sq);
7 if (result == SQLITE_OK) {
8 self.sq = sq;
9 NSLog(@"打开数据成功");
10 const char *sql = "CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);";
11 char *errmsg = NULL; // 用来存储错误信息
12 // 可以执行任何SQL语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据。
13 result = sqlite3_exec(self.sq, sql, NULL, NULL, &errmsg);
14 if (result == SQLITE_OK) {
15 NSLog(@"创表成功");
16 } else {
17 NSLog(@"创表失败:%@", [NSString stringWithUTF8String:errmsg]);
18 }
19 } else {
20 NSLog(@"打开数据库失败");
21 }
3、执行不返回数据的SQL语句。
1 const char *sql = "CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);";
2 char *errmsg = NULL; // 用来存储错误信息
3 // 可以执行任何SQL语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据。
4 result = sqlite3_exec(self.sq, sql, NULL, NULL, &errmsg);
5 if (result == SQLITE_OK) {
6 NSLog(@"创表成功");
7 } else {
8 NSLog(@"创表失败:%s", errmsg);
9 }
1 NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_person (name, age) VALUES (‘%@‘, %d);", @"夏明", 22];
2 char *errmsg = NULL;
3 int result = sqlite3_exec(self.sq, sql.UTF8String, NULL, NULL, &errmsg);
4 if (result == SQLITE_OK) {
5 NSLog(@"添加数据成功");
6 } else {
7 NSLog(@"添加数据失败:%s", errmsg);
8 }
4、执行返回数据的SQL语句(查)。
1 // 进行查询前的准备工作
2 const char *sql = "SELECT name, age FROM t_person WHERE age < 30;";
3 sqlite3_stmt *stmt = NULL; // 用来取数据的
4 // -1代表系统会自动计算SQL语句的长度
5 if (sqlite3_prepare_v2(self.sq, sql, -1, &stmt, nil) == SQLITE_OK) {
6 NSLog(@"查询语句没问题");
7 // 每调一次sqlite3_step()函数,stmt就会指向下一条记录
8 while(sqlite3_step(stmt) == SQLITE_ROW) {
9 // 取出第0列字段的值
10 const unsigned char *name = sqlite3_column_text(stmt, 0);
11 // 取出第1列字段的值
12 int age = sqlite3_column_int(stmt, 1);
13 NSLog(@"name = %s, age = %d", name, age);
14 }
15 } else {
16 NSLog(@"查询语句有问题");
17 }
5、关闭数据库:sqlite3_close(db)。
|总结
1.打开数据库
int sqlite3_open(
const char *filename, // 数据库的文件路径
sqlite3 **ppDb // 数据库实例
);
2.执行任何SQL语句
int sqlite3_exec(
sqlite3*, // 一个打开的数据库实例
const char *sql, // 需要执行的SQL语句
int (*callback)(void*,int,char**,char**), // SQL语句执行完毕后的回调
void *, // 回调函数的第1个参数
char **errmsg // 错误信息
);
3.检查SQL语句的合法性(查询前的准备)
int sqlite3_prepare_v2(
sqlite3 *db, // 数据库实例
const char *zSql, // 需要检查的SQL语句
int nByte, // SQL语句的最大字节长度
sqlite3_stmt **ppStmt, // sqlite3_stmt实例,用来获得数据库数据
const char **pzTail
);
4.查询一行数据
int sqlite3_step(sqlite3_stmt*); // 如果查询到一行数据,就会返回SQLITE_ROW
5.利用stmt获得某一字段的值(字段的下标从0开始)
double sqlite3_column_double(sqlite3_stmt*, int iCol); // 浮点数据
int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型数据
sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 长整型数据
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二进制文本数据
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); // 字符串数据
标签:
原文地址:http://www.cnblogs.com/hankkk/p/5782321.html