iOS:面向对象的思想使用sqlite数据库
*_db自己定义一个sqlite3的成员变量.进行增删改查时要用
NSString *sqlStr = @"INSERT OR REPLACE INTO note (cdate,content) VALUES (?,?)";
sqlite3_stmt *statement;
//预处理过程,产生结果集
if (sqlite3_prepare_v2(db, [sqlStr UTF8String], -1, &statement,
NULL) == SQLITE_OK)
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *nsdate = [dateFormatter stringFromDate:model.date];
//绑定参数开始
sqlite3_bind_text(statement, 1, [nsdate UTF8String], -1, NULL); sqlite3_bind_text(statement, 2, [model.content UTF8String],
-1, NULL);
//执行插入
if (sqlite3_step(statement) != SQLITE_DONE)
{
NSAssert(NO, @"插入数据失败。"); }
}
}
//清理结果集,防止内存泄露
sqlite3_finalize(statement);
单例模式:(这里主要用来保证初始化的数据库是唯一的,只要创建了一次,那么它就不会被再创建)
+ (NoteDAO*)sharedManager
{
static dispatch_once_t once;
dispatch_once(&once, ^{
sharedManager = [[self alloc] init];
[sharedManager createEditableCopyOfDatabaseIfNeeded]; }
);
return sharedManager;
}
举例代码如下:
Student.h
1 #import <Foundation/Foundation.h> 2 3 @interface Student : NSObject 4 @property (assign,nonatomic)NSInteger ID; 5 @property (copy,nonatomic)NSString *name; 6 @property (assign,nonatomic)NSInteger age; 7 @property (assign,nonatomic)char gender; 8 @property (assign,nonatomic)float math; 9 @property (assign,nonatomic)float english; 10 @property (assign,nonatomic)float chinese; 11 @end
Student.m
1 #import "Student.h" 2 3 @implementation Student 4 -(NSString*)description 5 { 6 return [NSString stringWithFormat:@"ID:%ld,name:%@,age:%ld,gender:%c,math:%.2lf,english:%.2lf,chinese:%.2lf",_ID,_name,_age,_gender,_math,_english,_chinese]; 7 } 8 @end
StudentDAO.h(对每一个实体类的数据库封装起来,就采用这种XXXDAO.h/m的命名风格)
1 #import <Foundation/Foundation.h> 2 #import <sqlite3.h> 3 @class Student; 4 @interface StudentDAO : NSObject 5 { 6 sqlite3 *_db; 7 } 8 //单例的方法 9 +(StudentDAO*)shareManager; 10 11 //初始化数据库:创建表,添加数据 12 -(void)initDb; 13 14 //添加学生记录 15 -(BOOL)addStudent:(Student *)stu; 16 17 //删除学生记录 18 -(BOOL)deleteStudentByName:(NSString *)name; 19 20 //修改学生记录 21 -(BOOL)updateStudnet:(Student*)stu; 22 23 //查询学生记录 24 //1.查询全部 25 -(NSArray *)queryStudentAll; 26 //2.查询符合条件的 27 -(Student *)queryStudentByName:(NSString*)name; 28 29 @end
StudentDAO.m
1 #import "StudentDAO.h" 2 #import "Student.h" 3 4 5 static StudentDAO *instance = nil; 6 @implementation StudentDAO 7 8 //对象只创建一次 9 +(StudentDAO*)shareManager 10 { 11 static dispatch_once_t once; 12 dispatch_once(&once, ^{ 13 //只执行一次 14 instance = [StudentDAO new]; 15 16 [instance initDb]; 17 }); 18 19 return instance; 20 } 21 22 //执行不返回结果集的sql语句 23 -(BOOL)execSql:(NSString *)sql 24 { 25 char *errmsg = NULL; 26 //增删改操作 27 sqlite3_exec(_db, [sql UTF8String], NULL, NULL, &errmsg); 28 29 if(errmsg) 30 { 31 return NO; 32 } 33 else 34 { 35 return YES; 36 } 37 } 38 //创建数据库文件路径 39 -(NSString*)pathForDB 40 { 41 NSArray *dirs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 42 NSString *documentPath = [dirs lastObject]; 43 44 //NSLog(@"%@",documentPath); 45 46 return [documentPath stringByAppendingPathComponent:@"student.db"]; 47 } 48 49 //初始化数据库:创建表,添加数据 50 -(void)initDb 51 { 52 //打开数据库 53 //sqlite3_open(fileName.UTF8String,&_db);打开或创建一个数据 54 //*_db自己定义一个sqlite3的成员变量.进行增删改查时要用 55 if(sqlite3_open([[self pathForDB] UTF8String], &_db) == SQLITE_OK) 56 { 57 //创建学生表 58 if([self execSql:@"create table student (id integer primary key autoincrement,name text,age integer,gender integer,math real,english real,chinese real)"]) 59 { 60 //表中添加测试数据 61 for(int i=0; i<5; i++) 62 { 63 Student *stu = [Student new]; 64 stu.name = [NSString stringWithFormat:@"stu%d",i+1]; 65 stu.age = 20+i; 66 stu.gender = 'M'; 67 stu.math = 80+i; 68 stu.english = 90+i; 69 stu.chinese = 80+i; 70 71 [self addStudent:stu]; 72 } 73 } 74 //关闭数据库 75 sqlite3_close(_db); 76 } 77 } 78 79 //添加学生记录 80 -(BOOL)addStudent:(Student *)stu 81 { 82 NSString *insertSql = @"insert into student (name,age,gender,math,english,chinese) values(?,?,?,?,?,?)"; 83 84 //打开数据库 85 if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK) 86 { 87 //准备结果集 88 //提取数据一次一条 89 sqlite3_stmt *Pstmt = NULL; 90 //查询前准备,看是否正确 91 if(sqlite3_prepare_v2(_db, [insertSql UTF8String], -1, &Pstmt, NULL) == SQLITE_OK) 92 { 93 //绑定参数 94 sqlite3_bind_text(Pstmt, 1, [stu.name UTF8String], -1, NULL); 95 sqlite3_bind_int(Pstmt, 2, (int)stu.age); 96 sqlite3_bind_int(Pstmt, 3, stu.gender); 97 sqlite3_bind_double(Pstmt, 4, stu.math); 98 sqlite3_bind_double(Pstmt, 5, stu.english); 99 sqlite3_bind_double(Pstmt, 6, stu.chinese); 100 101 //执行SQL语句 102 if(sqlite3_step(Pstmt) == SQLITE_DONE) 103 { 104 return YES; 105 } 106 } 107 //清理结果集 108 sqlite3_finalize(Pstmt); 109 110 //关闭数据库 111 sqlite3_close(_db); 112 } 113 return NO; 114 } 115 116 //删除学生记录 117 -(BOOL)deleteStudentByName:(NSString *)name 118 { 119 NSString *sql = @"delete from student where name = ?"; 120 121 //打开数据库 122 if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK) 123 { 124 //准备结果集 125 sqlite3_stmt *Pstmt = NULL; 126 if(sqlite3_prepare_v2(_db, [sql UTF8String], -1, &Pstmt, NULL)== SQLITE_OK) 127 { 128 //绑定参数 129 sqlite3_bind_text(Pstmt, 1, [name UTF8String], -1, NULL); 130 131 132 //执行SQL语句 133 if(sqlite3_step(Pstmt) == SQLITE_DONE) 134 { 135 return YES; 136 } 137 } 138 //清理结果集 139 sqlite3_finalize(Pstmt); 140 141 //关闭数据库 142 sqlite3_close(_db); 143 } 144 return NO; 145 } 146 147 //修改学生记录 148 -(BOOL)updateStudnet:(Student*)stu 149 { 150 NSString *sql = @"update student set math = ? where name = ?"; 151 152 //打开数据库 153 if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK) 154 { 155 //准备结果集 156 sqlite3_stmt *Pstmt = NULL; 157 if(sqlite3_prepare_v2(_db, [sql UTF8String], -1, &Pstmt, NULL) == SQLITE_OK) 158 { 159 //绑定参数 160 sqlite3_bind_double(Pstmt,1,stu.math); 161 sqlite3_bind_text(Pstmt, 2, [stu.name UTF8String], -1, NULL); 162 163 //执行SQL语句 164 if(sqlite3_step(Pstmt) == SQLITE_DONE) 165 { 166 return YES; 167 } 168 } 169 //清理结果集 170 sqlite3_finalize(Pstmt); 171 172 //关闭数据库 173 sqlite3_close(_db); 174 } 175 return NO; 176 } 177 178 //查询学生记录 179 //1.查询全部 180 -(NSArray *)queryStudentAll 181 { 182 NSMutableArray *arrayM = [NSMutableArray array]; 183 184 //打开数据库 185 if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK) 186 { 187 //准备结果集 188 sqlite3_stmt *Pstmt = NULL; 189 if(sqlite3_prepare_v2(_db, "select * from student", -1, &Pstmt, NULL) == SQLITE_OK) 190 { 191 //遍历结果集 192 while (sqlite3_step(Pstmt) == SQLITE_ROW) 193 { 194 Student *stu = [Student new]; 195 196 stu.ID = sqlite3_column_int(Pstmt, 0); 197 stu.name = [NSString stringWithFormat:@"%s",sqlite3_column_text(Pstmt, 1)]; 198 stu.age = sqlite3_column_int(Pstmt, 2); 199 stu.gender = sqlite3_column_int(Pstmt, 3); 200 stu.math = sqlite3_column_double(Pstmt, 4); 201 stu.english = sqlite3_column_double(Pstmt, 5); 202 stu.chinese = sqlite3_column_double(Pstmt, 6); 203 204 [arrayM addObject:stu]; 205 } 206 } 207 //清理结果集 208 sqlite3_finalize(Pstmt); 209 210 //关闭数据库 211 sqlite3_close(_db); 212 } 213 return arrayM; 214 } 215 //2.查询符合条件的 216 -(Student *)queryStudentByName:(NSString*)name 217 { 218 Student *stu; 219 NSString *sql = @"select * from student where name = ?"; 220 221 //打开数据库 222 if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK) 223 { 224 //准备结果集 225 sqlite3_stmt *Pstmt = NULL; 226 if(sqlite3_prepare_v2(_db, [sql UTF8String], -1, &Pstmt, NULL) == SQLITE_OK) 227 { 228 //绑定参数 229 sqlite3_bind_text(Pstmt, 1, [name UTF8String], -1, NULL); 230 231 //执行SQL语句 232 if(sqlite3_step(Pstmt) == SQLITE_ROW) 233 { 234 stu = [Student new]; 235 236 stu.ID = sqlite3_column_int(Pstmt, 0); 237 stu.name = [NSString stringWithFormat:@"%s",sqlite3_column_text(Pstmt, 1)]; 238 stu.age = sqlite3_column_int(Pstmt, 2); 239 stu.gender = sqlite3_column_int(Pstmt, 3); 240 stu.math = sqlite3_column_double(Pstmt, 4); 241 stu.english = sqlite3_column_double(Pstmt, 5); 242 stu.chinese = sqlite3_column_double(Pstmt, 6); 243 } 244 } 245 246 //清理结果集 247 sqlite3_finalize(Pstmt); 248 249 //关闭数据库 250 sqlite3_close(_db); 251 } 252 return stu;; 253 } 254 @end
ViewController.m
1 #import "ViewController.h" 2 #import "Student.h" 3 #import "StudentDAO.h" 4 5 @interface ViewController () 6 7 @end 8 9 @implementation ViewController 10 11 - (void)viewDidLoad { 12 [super viewDidLoad]; 13 //测试stuDAO 14 //创建单例对象 15 StudentDAO *stuDAO = [StudentDAO shareManager]; 16 17 18 //查询所有的记录 19 NSArray *students = [stuDAO queryStudentAll]; 20 NSLog(@"%@",students); 21 22 //删除一条记录 23 [stuDAO deleteStudentByName:@"stu3"]; 24 25 //修改记录 26 Student *stu = [Student new]; 27 stu.name = @"stu4"; 28 stu.math = 94.5f; 29 [stuDAO updateStudnet:stu]; 30 31 32 //通过名字查询学生 33 Student *stu2 = [stuDAO queryStudentByName:@"stu5"]; 34 NSLog(@"%@",stu2); 35 36 //查询所有的记录 37 students = [stuDAO queryStudentAll]; 38 NSLog(@"%@",students); 39 } 40 @end