1 SQLite支持的数据类型
INTEGER 有符号整型
REAL 浮点型
TEXT 字符型类型,采用UTF-8、UTF-16编码
VERCHAR CHAR CLOB 大二进制对象类型,能够存放任何二进制数据
FLOAT DOUBLE 转换成为REAL
NUMERIC 转换为INTEGER或者REAL类型
没有布尔类型数据 可以用0和1来代替
没有日期和时间类型数据 存储在TEXT或REAL类型中
2 SQLite语句
(1)创建数据表
指令:create table 表名(字段1, 字段2,...);
示例:create tabel USER(uid,name, age);
(2)条件创建:如果不存在则创建
指令:create table if not exists 表名(字段1, 字段2,...);
示例:create table if not exists USER(uid,name,age);
(3)删除表
指令:drop table 表名;
示例:drop table USER;
(4)插入
指令:insert table 表名(字段1,字段2,...) values(值1,值2,...);
示例:insert table USER(sex,address) values(女,北京);
(5)查询
指令:select 字段 from 表名;
示例:select (uid,name) from USER;
select * from USER;
(6)修改
指令:update 表名 set 字段 = ‘新值’ where 条件
示例:update USER set age = 21 where uid = 1001
3 创建数据库
(1) 使用sqlite3_open函数打开数据库
(2) 使用sqlite3_exec函数执行Create Table语句
(3) 使用sqlite3_close函数关闭数据库
4 查询数据
(1) 使用sqlite_prepare_v2函数预处理SQL语句
(2) 使用sqlite_bind_text函数绑定参数
(3) 使用sqlite3_step函数执行SQL语句,遍历结果集
(4) 使用sqlite3_column_text等函数提取字段数据
#import <Foundation/Foundation.h> #import <sqlite3.h> #import "Student.h" @interface StudentManager : NSObject { sqlite3 *db; } + (instancetype)sharedInstance; // 查询 - (Student *)searchWithUid:(Student *)student; // 插入 - (int)insertStudent:(Student *)student; @end #import "StudentManager.h" #define kNameFile (@"Student.sqlite") @implementation StudentManager + (instancetype)sharedInstance { static StudentManager *instance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[self alloc] init]; [instance createDataBaseTabelIfNeeded]; }); return instance; } - (NSString *)applicationDocumentsDiractory { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentPath = [paths firstObject]; NSString *filePath = [documentPath stringByAppendingString:kNameFile]; return filePath; } /* 创建数据库 1 使用sqlite3_open函数打开数据库 2 使用sqlite3_exec函数执行Create Table语句 3 使用sqlite3_close函数关闭数据库 */ - (void)createDataBaseTabelIfNeeded { NSString *writablePath = [self applicationDocumentsDiractory]; NSLog(@"数据库的地址是:%@", writablePath); // 打开数据库 /* 第一个参数:数据库文件所在的完整路径 第二个参数:数据库 DataBase对象 */ if (sqlite3_open([writablePath UTF8String], &db) != SQLITE_OK) { //数据库打开失败 sqlite3_close(db); NSAssert(NO, @"数据库打开失败"); } else { char *error; NSString *createSQL = [NSString stringWithFormat:@"create table if not exists Student(uid TEXT primary key,name TEXT);"]; /* 第一个参数:数据库 第二个参数:sql语句 第三个参数:回调函数 第四个参数:回调所传的参数 第五个参数:error */ if (sqlite3_exec(db, [createSQL UTF8String], NULL, NULL, &error) != SQLITE_OK) { // 语句执行失败 sqlite3_close(db); NSAssert(NO, @"语句执行失败 %s", error); } else { sqlite3_close(db); } } } /* 查询数据 1 使用sqlite_prepare_v2函数预处理SQL语句 2 使用sqlite_bind_text函数绑定参数 3 使用sqlite3_step函数执行SQL语句,遍历结果集 4 使用sqlite3_column_text等函数提取字段数据 */ - (Student *)searchWithUid:(Student *)student { NSString *path = [self applicationDocumentsDiractory]; if(sqlite3_open([path UTF8String], &db) != SQLITE_OK) { //数据库打开失败 sqlite3_close(db); NSAssert(NO, @"数据库打开失败"); } else { NSString *sql = @"select uid,name from Student where uid = ? "; sqlite3_stmt *statement; /* 使用sqlite_prepare_v2函数预处理SQL语句 第一个参数:数据库 第二个参数:SQL语句 第三个参数:执行语句的长度 -1表示全部长度 第四个参数:语句对象 第五个参数:没有执行语句的部分 NULL */ if(sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, NULL) == SQLITE_OK) { // 按主键查询数据库 NSString *uid = student.uid; NSString *name = student.name; /* 使用sqlite_bind_text函数绑定参数 第一个参数:语句对象 第二个参数:参数开始执行的序号 第三个参数:我们要绑定的值 第四个参数:绑定的字符串的长度 第五个参数:指针 NULL */ sqlite3_bind_text(statement, 1, [uid UTF8String], -1, NULL); sqlite3_bind_text(statement, 2, [name UTF8String], -1, NULL); /* 使用sqlite3_step函数执行SQL语句,遍历结果集 y偶一个返回值 SQLITE_ROW常量表示查出来了 */ if(sqlite3_step(statement) == SQLITE_ROW) { /* 使用sqlite3_column_text等函数提取字段数据 第一个参数:语句对象 第二个参数:字段索引 */ char *uid = (char *)sqlite3_column_text(statement, 0); NSString *uidStr = [NSString stringWithUTF8String:uid]; char *name = (char *)sqlite3_column_text(statement, 1); NSString *nameStr = [NSString stringWithUTF8String:name]; Student *s = [[Student alloc] init]; s.uid = uidStr; s.name = nameStr; sqlite3_finalize(statement); sqlite3_close(db); return s; } } sqlite3_finalize(statement); sqlite3_close(db); } return nil; } - (int)insertStudent:(Student *)student { NSString *path = [self applicationDocumentsDiractory]; if(sqlite3_open([path UTF8String], &db) != SQLITE_OK) { //数据库打开失败 sqlite3_close(db); NSAssert(NO, @"数据库打开失败"); } else { NSString *sql = @"INSERT OR REPLACE INTO Student (uid, name) VALUES (?, ?)"; sqlite3_stmt *statement; if(sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, NULL) == SQLITE_OK) { sqlite3_bind_text(statement, 1, [student.uid UTF8String], -1, NULL); sqlite3_bind_text(statement, 2, [student.name UTF8String], -1, NULL); if (sqlite3_step(statement) != SQLITE_DONE) { //插入数据失败 sqlite3_close(db); NSAssert(NO, @"插入数据失败"); } sqlite3_finalize(statement); sqlite3_close(db); } } return 0; } @end