SQL

 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

 

posted @ 2016-03-11 20:14  恒远也  阅读(213)  评论(0编辑  收藏  举报