1 #import "ViewController.h"
2 #import <sqlite3.h>
3 #import "DataBaseManager.h"
4 @interface ViewController ()
5
6 @end
7
8 @implementation ViewController
9
10 - (void)viewDidLoad {
11 [super viewDidLoad];
12 /*
13 //获取documents的路径
14 NSString *doctmentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
15 //创建数据库路径
16 NSString *sqlPath = [doctmentsPath stringByAppendingPathComponent:@"student.sqlite"];
17
18 //打开数据库,将文件路径转化为char类型的,二阶指针是指针的地址
19 //数据库指针sqlite3
20 #warning 二阶指针 db
21 sqlite3 *db = nil;
22 NSLog(@"%p",db);
23 sqlite3_open(sqlPath.UTF8String, &db);
24 NSLog(@"%p",db);
25
26 //创建stu表,包含字段s_id,s_name,s_age
27 NSString *sqlStr = @"create table if not exists stu (s_id integer primary key,s_name text ,s_age integer)";
28 //通过result接受执行结果
29 int result = sqlite3_exec(db, sqlStr.UTF8String, NULL, NULL, NULL);
30
31 NSLog(@"%@",result == SQLITE_OK ? @"建表成功":@"建表失败");
32 NSLog(@"%@",sqlPath);
33
34 //插入数据insert into
35 NSString *insertSql = @"insert into stu (s_name,s_age) values ('zhangsan',20)";
36 int resultInsert = sqlite3_exec(db, insertSql.UTF8String, NULL, NULL, NULL);
37 NSLog(@"%@",resultInsert == SQLITE_OK ? @"插入成功":@"插入失败");
38
39 //更改数据
40 NSString *upSql = @"update stu set s_age = 100 where s_age = 20";
41 int resultUpData = sqlite3_exec(db, upSql.UTF8String, NULL, NULL, NULL);
42 NSLog(@"%@",resultUpData == SQLITE_OK ? @"更改成功":@"更改失败");
43
44 //删除数据
45
46 NSString *deleteSql = @"delete from stu";
47 int deleteResult = sqlite3_exec(db, deleteSql.UTF8String, NULL, NULL, NULL);
48 NSLog(@"%@",deleteResult == SQLITE_OK ? @"删除成功":@"删除失败");
49
50 //关闭数据库
51 int closeResult = sqlite3_close(db);
52 NSLog(@"%@",closeResult == SQLITE_OK ? @"关闭成功":@"关闭失败");
53 */
54
55
56 DataBaseManager *dbManager = [DataBaseManager shareInstance];
57 //使用自定义DataBaseManager,进行数据库操作
58 //打开数据库
59 [dbManager openDB];
60 //创建表
61 [dbManager createTable];
62 [dbManager insertName:@"张全蛋" Age:20];
63
64 NSArray *stuArray =[dbManager selectAll];
65 NSLog(@"%@",stuArray);
66 NSArray *nameArray = [dbManager selectWithName:@"张全蛋"];
67 NSLog(@"张全蛋%@",nameArray);
68 [dbManager closeDBm];
69
70
71 }
1 #import <Foundation/Foundation.h>
2
3 @interface DataBaseManager : NSObject
4 //单例
5 +(instancetype)shareInstance;
6 //打开数据库
7 -(void)openDB;
8 //创建表
9 -(void)createTable;
10 //插入数据
11 -(void)insertName:(NSString *)name Age:(NSInteger) age;
12 //删除数据
13 -(void)deleteWithName:(NSString *)name;
14 //更新数据
15 -(void)updateTable;
16 //查询数据
17 -(NSArray *)selectAll;
18 -(NSArray *)selectWithName:(NSString *)name;
19 //关闭数据库
20 -(void)closeDBm;
21 @end
1 #import "DataBaseManager.h"
2 #import <sqlite3.h>
3 @interface DataBaseManager()
4 //数据库路径
5 @property (nonatomic,copy)NSString *sqlPath;
6
7 @end
8
9 @implementation DataBaseManager
10 //单例
11 +(instancetype)shareInstance
12 {
13 static DataBaseManager *manager = nil;
14 //两种方式创建单例
15 //1.这种方式在工程的整个生命周期只被执行一次,一直到工程关闭被释放
16 static dispatch_once_t onceToken;
17 dispatch_once(&onceToken,^{
18 manager = [[DataBaseManager alloc] init];
19 });
20 // //2.第二种方法
21 // if (manager == nil) {
22 // manager = [[DataBaseManager alloc] init];
23 // }
24 return manager;
25 }
26 //重写getter方法
27 -(NSString *)sqlPath
28 {
29 //if判断避免每次都进行创建
30 if (_sqlPath == nil) {
31 _sqlPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"student.sqlite"];
32 }
33 return _sqlPath;
34 }
35 //由于数据库的表指针全局都要用,所以定义为全局变量
36 static sqlite3 *db = nil;
37 //打开数据库
38 -(void)openDB
39 {
40 #warning 如果sqlPath写成实例变量的形式则不会走getter方法,
41 int result = sqlite3_open(self.sqlPath.UTF8String, &db);
42 NSLog(@"%@",result == SQLITE_OK ?@"打开成功":@"打开失败");
43 }
44 //创建表
45 -(void)createTable
46 {
47 //创建表的SQL
48 #warning 要把类型放前边,约束放后边 如果把主键约束放前边,integer放后边会出错.
49 NSString *sqlString = @"create table if not exists stu(s_id integer primary key autoincrement,s_name text,s_age integer)";
50 //执行SQL
51 int result = sqlite3_exec(db, sqlString.UTF8String, NULL, NULL, NULL);
52 NSLog(@"%@", result == SQLITE_OK ?@"建表成功": @"建表失败");
53 }
54 //插入数据
55 -(void)insertName:(NSString *)name Age:(NSInteger) age;
56 {
57 NSString *sqlString = [NSString stringWithFormat:@"insert into stu (s_name,s_age) values ('%@','%ld')",name,age];
58 int result = sqlite3_exec(db, sqlString.UTF8String, NULL, NULL, NULL);
59 NSLog(@"%@", result == SQLITE_OK ?@"插入成功": @"插入失败");
60 }
61 //删除数据
62 -(void)deleteWithName:(NSString *)name
63 {
64 NSString *sqlString = [NSString stringWithFormat:@"delete from stu where s_name = '%@'",name];
65 int result = sqlite3_exec(db, sqlString.UTF8String, NULL, NULL, NULL);
66 NSLog(@"%@", result == SQLITE_OK ?@"删除成功": @"删除失败");
67 }
68 //更新数据
69 -(void)updateTable
70 {
71 NSString *sqlString = @"updata stu set s_age = 10 ";
72 int result = sqlite3_exec(db, sqlString.UTF8String, NULL, NULL, NULL);
73 NSLog(@"%@", result == SQLITE_OK ?@"更新成功": @"更新失败");
74
75 }
76
77 //查询数据
78 -(NSArray *)selectAll
79 {
80 NSMutableArray *array =[NSMutableArray new];
81 //查询SQL语句
82 NSString *sqlString = @"select * from stu";
83 //执行查询
84
85 //stmt伴随指针
86 sqlite3_stmt *stmt = nil;
87 //先创建伴随指针,再进行预执行,stmt指向的是step将要执行的语句
88 int result = sqlite3_prepare(db, sqlString.UTF8String, -1, &stmt, NULL);
89 if (result == SQLITE_OK) {
90 //预执行成功,条件循环取出所有数据
91 while (sqlite3_step(stmt) == SQLITE_ROW) {
92 //第二个参数是指第几列
93 NSInteger s_id = sqlite3_column_int(stmt, 0);
94 //NSString *name = [NSString stringWithUTF8String:sqlite3_column_text(stmt, 1)];
95 //上面的写法报黄,下面的写法没问题
96 NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
97
98 NSInteger age = sqlite3_column_int(stmt, 2);
99 //由于s_id,age不是对象类型的,所以需要用@()这种形式强转
100 NSDictionary *studentDic = [NSDictionary dictionaryWithObjectsAndKeys:@(s_id),@"s_id",name,@"s_name",@(age),@"s_age", nil];
101 [array addObject:studentDic];
102 }
103 //释放伴随指针
104 sqlite3_finalize(stmt);
105 //返回数组
106 return array;
107 }
108
109 return nil;
110 }
111 -(NSArray *)selectWithName:(NSString *)name
112 {
113 NSMutableArray *array = [NSMutableArray array];
114 //SQL语句
115 NSString *sqlString = @"select * from stu where s_name = ?";
116 //预执行
117 //伴随指针
118 sqlite3_stmt *stmt = nil;
119 int result = sqlite3_prepare(db, sqlString.UTF8String, -1, &stmt, NULL);
120 if (result == SQLITE_OK) {
121 //预执行成功,绑定参数 bind
122 //sqlite3_column查询获得数据,列数从0开始
123 //第二个参数:sqilit3_bind_绑定参数,表示参数所在的列,第三个参数是绑定的参数
124 sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
125 while (sqlite3_step(stmt) == SQLITE_ROW) {
126 //第二个参数是指第几列
127 NSInteger s_id = sqlite3_column_int(stmt, 0);
128 //NSString *name = [NSString stringWithUTF8String:sqlite3_column_text(stmt, 1)];
129 //上面的写法报黄,下面的写法没问题
130 NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
131
132 NSInteger age = sqlite3_column_int(stmt, 2);
133 //由于s_id,age不是对象类型的,所以需要用@()这种形式强转
134 NSDictionary *studentDic = [NSDictionary dictionaryWithObjectsAndKeys:@(s_id),@"s_id",name,@"s_name",@(age),@"s_age", nil];
135 [array addObject:studentDic];
136 }
137
138 }
139 //释放伴随指针
140 sqlite3_finalize(stmt);
141 return array;
142 }
143 //关闭数据库
144 -(void)closeDBm
145 {
146 int result = sqlite3_close(db);
147 NSLog(@"%@", result == SQLITE_OK ?@"关闭成功": @"关闭失败");
148
149 }
150 @end