时间:2021-07-01 10:21:17 帮助过:2人阅读
1 #import <Foundation/Foundation.h> 2 3 @interface DataBaseHandle : NSObject 4 5 // 把这个类写成单例,方便外部使用 6 + (DataBaseHandle *)shareDataBaseHandle; 7 8 // 打开数据库 9 - (void)openDB; 10 11 // 关闭数据库 12 - (void)closeDB; 13 14 // 创建表 15 - (void)createTable; 16 17 // 插入数据 18 - (void)insertName:(NSString *)name 19 gender:(NSString *)gender 20 age:(NSInteger)age; 21 22 // 通过uid去更新数据 23 - (void)updateWithUID:(NSInteger)uid; 24 25 // 根据uid删除数据 26 - (void)deleteWithUID:(NSInteger)uid; 27 28 // 查找所有数据 29 - (void)searchAll; 30 31 // 根据姓名查找相关数据 32 - (void)searchWithName:(NSString *)name; 33 34 @end
DataBaseHandle.m
1 #import "DataBaseHandle.h" 2 // 引入数据库操作的头文件 3 #import <sqlite3.h> 4 5 @interface DataBaseHandle () 6 7 // 数据库的存储路径 8 @property (nonatomic, copy) NSString *dbPath; 9 10 @end 11 12 13 static DataBaseHandle *dataBase = nil; 14 15 @implementation DataBaseHandle 16 17 18 + (DataBaseHandle *)shareDataBaseHandle { 19 20 if (dataBase == nil) { 21 22 @synchronized(dataBase) { 23 dataBase = [[DataBaseHandle alloc] init]; 24 } 25 } 26 return dataBase; 27 } 28 29 30 // 懒加载 31 - (NSString *)dbPath { 32 33 if (!_dbPath) { 34 35 // 需求:路径存储在Documents文件夹下,数据库文件为person.sqlite 36 NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 37 38 _dbPath = [documentPath stringByAppendingPathComponent:@"person.sqlite"]; 39 40 } 41 return _dbPath; 42 } 43 44 45 // 好多地方都会使用到数据库,所以初始化一个数据库的静态变量 46 static sqlite3 *db = nil; 47 48 - (void)openDB { 49 50 // 接收打开的结果 51 // 第一个参数:filename代表数据库的存储路径 52 // 第二个参数:二级指针,数据库地址 53 int result = sqlite3_open([self.dbPath UTF8String], &db); 54 55 // result是个枚举值,有很多种情况 56 if (result == SQLITE_OK) { 57 NSLog(@"数据库打开成功"); 58 } else { 59 NSLog(@"数据库打开失败"); 60 } 61 62 } 63 64 65 - (void)closeDB { 66 67 int result = sqlite3_close(db); 68 69 if (result == SQLITE_OK) { 70 NSLog(@"关闭成功"); 71 } else { 72 NSLog(@"关闭失败"); 73 } 74 } 75 76 77 // 创建表 78 - (void)createTable { 79 80 // 创建一个person表,字段:uid Integer类型 主键自增 不能为空, name text类型, gender text类型, age Integer类型 81 82 NSString *createStr = @"create table if not exists person (uid integer primary key autoincrement not null, name text, gender text, age integer)"; 83 84 // 第一个参数:数据库 85 // 第二个参数:sql语句,需要进行编码 86 // 第三个参数:结果回调的一个函数 87 // 第四个参数:回调函数的一个参数 88 // 第五个参数:错误信息 89 int result = sqlite3_exec(db, [createStr UTF8String], NULL, NULL, NULL); 90 91 if (result == SQLITE_OK) { 92 NSLog(@"创建表成功"); 93 } else { 94 NSLog(@"创建表失败"); 95 } 96 97 // 打印数据库路径,检查表是否创建成功 98 NSLog(@"%@", _dbPath); 99 } 100 101 102 // 插入数据 103 - (void)insertName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age { 104 105 // 当values不确定的情况下,使用?代替,稍后会进行其值的绑定过程 106 NSString *insertStr = @"insert into person(name, gender, age) values (?, ?, ?)"; 107 108 // 预执行语句 109 // 第一个参数:数据库 110 // 第二个参数:sql语句 111 // 第三个参数:有正负之分,例如:如果为1,代表只往后读一个字节;如果为负值(一般写-1),遇到特殊符号才会结束读取(\000, u000) 112 // 第四个参数:伴随指针,会随着数据库的相关操作确定其中?的值 113 // 第五个参数:取值的时候如果取的不全,剩下的值都存在这里 114 115 // 伴随指针 116 sqlite3_stmt *stmt = nil; 117 118 int result = sqlite3_prepare(db, [insertStr UTF8String], -1, &stmt, NULL); 119 120 121 // 判断执行结果 122 if (result == SQLITE_OK) { 123 124 // 在操作成功的方法里进行?值的一些绑定设置 125 // 第一个参数:伴随指针 126 // 第二个参数:?的位置,从1开始 127 // 第三个参数:表示要插入的值 128 // 第四个参数:有正负之分,例如:如果为1,代表只往后读一个字节;如果为负值(一般写-1),遇到特殊符号才会结束读取(\000, u000) 129 // 第五个参数:回调函数 130 131 sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL); 132 sqlite3_bind_text(stmt, 2, gender.UTF8String, -1, NULL); 133 sqlite3_bind_int64(stmt, 3, age); 134 135 // sql语句执行完毕 136 // 执行伴随指针,根据伴随指针的情况判定是否插入成功(SQLITE_DONE代表伴随指针执行成功) 137 if (sqlite3_step(stmt) == SQLITE_DONE) { 138 NSLog(@"插入成功"); 139 } else { 140 NSLog(@"插入失败"); 141 } 142 143 } else { 144 145 NSLog(@"result = %d", result); 146 } 147 148 // 一定要释放伴随指针 149 sqlite3_finalize(stmt); 150 151 } 152 153 154 // 更新 155 - (void)updateWithUID:(NSInteger)uid { 156 157 NSString *updateStr = @"update person set name = ‘高月‘ where uid = ?"; 158 159 // 伴随指针 160 sqlite3_stmt *stmt = nil; 161 162 int result = sqlite3_prepare(db, updateStr.UTF8String, -1, &stmt, NULL); 163 164 if (result == SQLITE_OK) { 165 166 sqlite3_bind_int64(stmt, 1, uid); 167 168 if (sqlite3_step(stmt) == SQLITE_DONE) { 169 NSLog(@"更新数据成功"); 170 } else { 171 NSLog(@"更新数据失败"); 172 } 173 174 } else { 175 NSLog(@"result = %d", result); 176 } 177 178 sqlite3_finalize(stmt); 179 } 180 181 182 // 根据uid删除数据 183 - (void)deleteWithUID:(NSInteger)uid { 184 185 NSString *deleteStr = [NSString stringWithFormat:@"delete from person where uid = %ld", uid]; 186 187 int result = sqlite3_exec(db, deleteStr.UTF8String, NULL, NULL, NULL); 188 189 if (result == SQLITE_OK) { 190 191 NSLog(@"删除成功"); 192 } else { 193 194 NSLog(@"删除失败"); 195 } 196 } 197 198 199 // 查询所有 200 - (void)searchAll { 201 202 NSString *searchAllStr = @"select *from person"; 203 204 205 sqlite3_stmt *stmt = nil; 206 // 预执行 207 int result = sqlite3_prepare(db, searchAllStr.UTF8String, -1, &stmt, NULL); 208 209 if (result == SQLITE_OK) { 210 211 // 查询数据的时候,当不知道有多少次的时候使用while循环 212 // sqlite3_step(stmt) == SQLITE_ROW代表逐行执行数据 213 while (sqlite3_step(stmt) == SQLITE_ROW) { 214 // 第一个参数:伴随指针 215 // 第二个参数:代表这个字段的位置【只有带?的是从1开始,其余所有的都是从0开始的】 216 int uid = sqlite3_column_int(stmt, 0); 217 NSLog(@"uid = %d", uid); 218 219 // 在OC代码中要使用C语言的相关内容,应该使用UTF——8 220 NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)]; 221 NSLog(@"name = %@", name); 222 223 NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)]; 224 NSLog(@"gender = %@", gender); 225 226 int age = sqlite3_column_int(stmt, 3); 227 NSLog(@"age = %d", age); 228 } 229 230 } else { 231 NSLog(@"result = %d", result); 232 } 233 234 // 释放伴随指针 235 sqlite3_finalize(stmt); 236 } 237 238 239 // 根据姓名查找 240 - (void)searchWithName:(NSString *)name { 241 242 NSString *searchStr = @"select uid, gender, age from person where name = ?"; 243 244 sqlite3_stmt *stmt = nil; 245 246 int result = sqlite3_prepare(db, searchStr.UTF8String, -1, &stmt, NULL); 247 248 if (result == SQLITE_OK) { 249 sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL); 250 251 while (sqlite3_step(stmt) == SQLITE_ROW) { 252 253 int uid = sqlite3_column_int(stmt, 0); 254 NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)]; 255 int age = sqlite3_column_int(stmt, 2); 256 257 NSLog(@"uid = %d, gender = %@, age = %d", uid, gender, age); 258 } 259 260 } else { 261 NSLog(@"result = %d", result); 262 } 263 264 // 释放伴随指针 265 sqlite3_finalize(stmt); 266 } 267 268 @end
ViewController.m
1 #import "ViewController.h" 2 #import "DataBaseHandle.h" 3 4 @interface ViewController () 5 6 @end 7 8 @implementation ViewController 9 10 - (void)viewDidLoad { 11 [super viewDidLoad]; 12 13 DataBaseHandle *dataBaseHandle = [DataBaseHandle shareDataBaseHandle]; 14 15 // 打开数据库 16 [dataBaseHandle openDB]; 17 18 // 创建表 19 [dataBaseHandle createTable]; 20 21 // 插入数据 22 [dataBaseHandle insertName:@"圆圆" gender:@"美女" age:20]; 23 24 // 更新数据 25 [dataBaseHandle updateWithUID:1]; 26 27 // 查询所有数据 28 [dataBaseHandle searchAll]; 29 30 // 根据姓名查找 31 [dataBaseHandle searchWithName:@"高月"]; 32 33 // 根据uid删除 34 // [dataBaseHandle deleteWithUID:2]; 35 36 } 37 38 @end
SQL语句的简单使用
标签: