1 #import "ViewController.h"
2 #import <sqlite3.h>//导入数据库头文件
3
4 @interface ViewController ()
5 {
6 sqlite3 *db;
7 }
8 @end
9
10 @implementation ViewController
11
12 - (void)viewDidLoad {
13 [super viewDidLoad];
14 /*
15 1、 Sqlite数据类型:NULL. 空值、INTEGER. 整型、REAL.浮点型、TEXT.文本类型、BLOB. 二进制类型,用来存储文件,比如图片
16 2、 使用sqlite3需要先导入libsqlite3.dylib并导入主头文件
17 3、 设置数据库文件存放路径,如沙盒的Doucuments文件夹内
18 */
19 sqlite3_close(db);
20 //一般会把数据库文件放入沙盒,所以需要先设定存放路径
21 NSString *pathString = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject ] stringByAppendingPathComponent:@"mySql.sqlite"];
/*
SQLITE_API int SQLITE_STDCALL sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
*/
22 //sqlite3_open方法,打开数据库文件,第一个参数代表数据库文件的路径,注意需要调用UTF8String方法将NSString转换成C的字符串格式,第二个参数代表数据库对象,该方法如果返回0(SQLITE_OK),代表数据库代开成功,如果该路径没有数据库文件,则先创建再打开,否则直接打开
23 int res = sqlite3_open([pathString UTF8String], &db);
24 //创建数据库表
25 //数据库表创建语句:create table if not exists(如果表不存在) Student(表名,自己定义) (该括好放要保存的信息:字段名 字段格式,多个字段之间用逗号隔开)
26 NSString *s = @"create table if not exists Student(name TEXT,age INTEGER)";//如果数据库中没有Student表,则创建该表,包含 字符串形式的name和整型的age
27 //执行数据库语句: 第一个参数代表执行的数据库对象,也就是打开的数据库,第二个参数代表执行语句,后面三个直接给NULL即可
28 sqlite3_exec(db, [s UTF8String], NULL, NULL, NULL);
/*
SQLITE_API int SQLITE_STDCALL sqlite3_exec(
sqlite3*, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
*/
29 NSLog(@"%@******%d",pathString,res);
30 /********数据库增加数据********/
31 //sql插入语句:insert into Student(表名) (要进行保存的字段名,名字之间用逗号隔开) values(要保存的实际数据,多个数据用逗号隔开,注意:此处数据要与前面的字段名保持一致,且如果是TEXT类型,需要用单引号引起来)
32 NSString *insertSql = @"insert into Student (name,age) values('刘冠',21)";
33 //执行插入语句
34 sqlite3_exec(db, [insertSql UTF8String], NULL, NULL, NULL);
35
36 NSString *insertSql1 = @"insert into Student (name,age) values('王峰',23)";
37 //执行插入语句
38 sqlite3_exec(db, [insertSql1 UTF8String], NULL, NULL, NULL);
39
40 NSString *insertSql2 = @"insert into Student (name,age) values('李龙',19)";
41 //执行插入语句
42 sqlite3_exec(db, [insertSql2 UTF8String], NULL, NULL, NULL);
43 /***********删除操作**********/
44 //sql删除语句: delete(关键字) from Student(表名) where(条件关键字) name(字段名) = ‘李龙’(要删除数据的条件,如果是TEXT,用单引号引起来)
45 NSString *delSql = @"delete from Student where name = '李龙'";
46 sqlite3_exec(db, [delSql UTF8String], NULL, NULL, NULL);
47 //全部删除
48 // NSString *delAll = @"delete from Student";
49 // sqlite3_exec(db, [delAll UTF8String], NULL, NULL, NULL);
50 //改(更新)
51 //sql更新语句:update(关键字) Student(表名) set(关键字,赋值) age(字段名) = 25(要更改的值,如果要更新多个字段,则用逗号隔开) where(条件关键字) rowid(字段名) = 2(要改的行,从1开始)
52 NSString *updateSql = @"update Student set age = 25, name = '刘冠冠' where rowid = 2";
53 sqlite3_exec(db, [updateSql UTF8String], NULL, NULL, NULL);
54 // //查询
55 // //查询语句
56 // //查询所有:select(关键字) * from Student(表名)
57 // NSString *querySql = @"select * from Student";
58 // sqlite3_stmt *_stmt = nil;//用于存放查询结果
59 // int rest1 = sqlite3_prepare(db, [querySql UTF8String], -1, &_stmt, NULL);//检查sql语句的合法性,如果合法则直接运行,返回结果为0
/*
SQLITE_API int SQLITE_STDCALL sqlite3_prepare(
sqlite3 *db, /* Database handle */
const char *zSql, /* SQL statement, UTF-8 encoded */
int nByte, /* Maximum length of zSql in bytes. */
sqlite3_stmt **ppStmt, /* OUT: Statement handle */
const char **pzTail /* OUT: Pointer to unused portion of zSql */
);
*/ 60 // if(rest1 == SQLITE_OK) 61 // { 62 // //遍历结果集_stmt,如果sqlite3_step返回100,代表有查询结果,先取出第一条,然后再指向下一条,直到sqlite3_step返回101,代表遍历结束
//SQLITE_API int SQLITE_STDCALL sqlite3_step(sqlite3_stmt*);
63 // while (SQLITE_ROW == sqlite3_step(_stmt)) { 64 // //取出单行结果中的某一列,从0开始 65 // const unsigned char *s = sqlite3_column_text(_stmt, 0);
//SQLITE_API const unsigned char *SQLITE_STDCALL sqlite3_column_text(sqlite3_stmt*, int iCol);column纵列
SQLITE_API const void *SQLITE_STDCALL sqlite3_column_blob(sqlite3_stmt*, int iCol);
SQLITE_API int SQLITE_STDCALL sqlite3_column_bytes(sqlite3_stmt*, int iCol);
SQLITE_API int SQLITE_STDCALL sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
SQLITE_API double SQLITE_STDCALL sqlite3_column_double(sqlite3_stmt*, int iCol);
SQLITE_API int SQLITE_STDCALL sqlite3_column_int(sqlite3_stmt*, int iCol);
SQLITE_API sqlite3_int64 SQLITE_STDCALL sqlite3_column_int64(sqlite3_stmt*, int iCol);
SQLITE_API const unsigned char *SQLITE_STDCALL sqlite3_column_text(sqlite3_stmt*, int iCol);
SQLITE_API const void *SQLITE_STDCALL sqlite3_column_text16(sqlite3_stmt*, int iCol);
SQLITE_API int SQLITE_STDCALL sqlite3_column_type(sqlite3_stmt*, int iCol);
SQLITE_API sqlite3_value *SQLITE_STDCALL sqlite3_column_value(sqlite3_stmt*, int iCol);
66 // //将查询结果转换成oc字符串
67 // NSString *name = [NSString stringWithUTF8String:(const char *)s];
68 // NSLog(@"结果:%@",name);
69 // }
70 // }
71 //查询符合条件的结果
72 NSString *querySql1 = @"select * from Student where age < 23";
73 sqlite3_stmt *_stmt1 = nil;//用于存放查询结果
//推荐在现在任何的程序中都使用sqlite3_prepare_v2这个函数,sqlite3_prepare只是用于前向兼容
74 int res2 = sqlite3_prepare(db, [querySql1 UTF8String], -1, &_stmt1, NULL);//检查sql语句的合法性,如果合法则直接运行,返回结果为0
75 if (res2 == 0) {
76 //遍历结果集_stmt,如果sqlite3_step返回100,代表有查询结果,先取出第一条,然后再指向下一条,直到sqlite3_step返回101,代表遍历结束
77 while (SQLITE_ROW == sqlite3_step(_stmt1)) {
78 //取出单行结果中的某一列,从0开始
79 const unsigned char *s = sqlite3_column_text(_stmt1, 0);
80 //将查询结果转换成oc字符串
81 NSString *name = [NSString stringWithUTF8String:(const char *)s];
82
83 NSLog(@"--结果:%@",name);
84 }
85 }
86 sqlite3_close(db);//关闭数据库
87
88 }