ui学习笔记---第十五天数据库
数据库的使用
常见的数据库有MySQL SQL Server SQLite Oralce等
在iOS开发中通常使用SQLite数据库,这是一个轻量级的数据库,可以在火狐浏览器的工具中创建一个SQLite数据库,并创建表
(1)数据记录筛选:
sql="select * from 数据表 where 字段名=字段值 orderby 字段名 [desc] "
sql="select * from 数据表 where 字段名 like '%字段值%' orderby 字段名 [desc]"
sql="select top10 * from 数据表 where 字段名 orderby 字段名[desc]"
sql="select * from 数据表 where 字段名 in('值1','值2','值3')"
sql="select * from 数据表 where 字段名 between 值1 and 值 2"
(2)更新数据记录:
sql="update 数据表 set 字段名=字段值 where 条件表达式"
sql="update 数据表 set 字段1=值1,字段2=值2……字段n=值n where 条件表达式"
(3)删除数据记录:
sql="delete from 数据表 where 条件表达式"
sql="delete from 数据表 "(将数据表所有记录删除)
(4)添加数据记录:
sql="insert into 数据表(字段1,字段2,字段3…) values(值1,值2,值3…)"
sql="insert into 目标数据表 select * from 源数据表"(把源数据表的记录添加到目标数据表)
建立数据库类DB (DB.h DB.m)
其中有两个方法 打开数据库方法和关闭数据库方法
//DB.h #import <Foundation/Foundation.h> #import <sqlite3.h> @interface DB : NSObject //打开数据库 + (sqlite3 *)open; //关闭数据库 + (void)close; @end //DB.m #import "DB.h" #define kDocuments [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] @implementation DB //打开数据库 //创建一个sqlite3的静态变量 static sqlite3 *db = nil; + (sqlite3 *)open { //db不为空,不用再打开db了 if (db != nil) { return db; } //在documents文件夹内建一个Students.sqlite文件路径 NSString *filePath = [kDocuments stringByAppendingPathComponent:@"Students.sqlite"]; //包路径 NSString *file = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"sqlite"]; //创建一个文件管理器 NSFileManager *fileManager =[NSFileManager defaultManager]; //使用文件控制器把包路径数据库拷贝到documents文件夹内 if ([fileManager fileExistsAtPath:filePath]==NO) { //判断documents是否已经存在Students.sqlite文件 ,不存在就拷贝 [fileManager copyItemAtPath:file toPath:filePath error:nil]; } //sqlite3自带的打开数据库方法 filePath从oc字符串转换为c字符串,调用UTF8String方法 sqlite3_open([filePath UTF8String], &db); NSLog(@"%@",filePath); return db; } //关闭数据库 + (void)close { //调用sqlite3自己方法关闭数据库 sqlite3_close(db); //db置为空 db = nil; } @end
数据管理类StudentManager (StudentManager.h StudentManager.m)
//StudentManager.h #import <Foundation/Foundation.h> @interface StudentManager : NSObject //- (void)insertName:(NSString *)name Age:(NSString *)age; - (void)insertName:(NSString *)name Age:(NSInteger)age; //- (void)select; - (void)delete:(NSString *)name; - (void)print; - (void)update:(NSString *)sex age:(int)age sID:(int)sID; - (void)updateAge:(NSInteger)age ID:(NSInteger)number; @end //StudentManager.m#import "StudentManager.h" #import "DB.h" @implementation StudentManager //- (void)insertName:(NSString *)name Age:(NSString *)age //{ // //打开数据库 // sqlite3 *db = [DB open]; // // //执行插入操作(向表中插入数据) // //stmt 用于存放 执行结果(例如,select 查询到得结果) // sqlite3_stmt *stmt = nil; // //flag 用于检测 prepare 的结果 // NSString *sql = [NSString stringWithFormat:@"insert into 'BJS140523'(sName,sAge) values (\"%@\",%@)",name,age ]; // int flag = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil); // NSLog(@"%d",flag); // if (flag == SQLITE_OK) { // //执行stmt, 如果SQL是select,sqlite3_step就是获取查到的结果 // //如果SQL是insert 或者update或者delete sqlite3_step就是执行SQL // sqlite3_step(stmt); // } // //释放SQL执行过程中开辟的内存(释放资源) // sqlite3_finalize(stmt); // // //关闭数据库 //// [DB close]; //} - (void)insertName:(NSString *)name Age:(NSInteger)age { //打开数据库 sqlite3 *db = [DB open]; //执行插入操作(向表中插入数据) //stmt 用于存放 执行结果(例如,select 查询到得结果) sqlite3_stmt *stmt = nil; //flag 用于检测 prepare 的结果 NSString *sql = [NSString stringWithFormat:@"insert into 'BJS140523'(sName,sAge) values (\"%@\",%d)",name,age ]; int flag = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil); NSLog(@"%d",flag); if (flag == SQLITE_OK) { //执行stmt, 如果SQL是select,sqlite3_step就是获取查到的结果 //如果SQL是insert 或者update或者delete sqlite3_step就是执行SQL sqlite3_step(stmt); } //释放SQL执行过程中开辟的内存(释放资源) sqlite3_finalize(stmt); //关闭数据库 // [DB close]; } //- (void)select //{ // sqlite3 *db = [DB open]; //} - (void)delete:(NSString *)name { sqlite3 *db = [DB open]; sqlite3_stmt *stmt = nil; NSString *sql = [NSString stringWithFormat:@"delete from 'BJS140523' where sName = \"%@\"",name]; int flog = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil); NSLog(@"%d",flog); if (flog == SQLITE_OK) { sqlite3_step(stmt); } sqlite3_finalize(stmt); } - (void)print { //打开数据库 sqlite3 *db = [DB open]; //执行查询 sqlite3_stmt *stmt = nil; int flog = sqlite3_prepare_v2(db, "select * from 'BJS140523'", -1, &stmt, nil); if (flog == SQLITE_OK) { //定义可变数组 //如果取到数据,执行while,如果取不到数据,while的条件就是假 while (sqlite3_step(stmt) == SQLITE_ROW) { //列的编号从0开始 int sID = sqlite3_column_int(stmt, 0); const unsigned char *sName = sqlite3_column_text(stmt, 1); int sAge = sqlite3_column_int(stmt, 2); const unsigned char *sSex = sqlite3_column_text(stmt, 3); NSString *name = [NSString stringWithUTF8String:(const char *)sName]; NSString *sex = [NSString stringWithUTF8String:(const char *)sSex]; NSLog(@"%d %@ %d %@",sID,name,sAge,sex); //创建学生对象 //添加到数组中 //学生对象release } sqlite3_finalize(stmt); } //关闭数据库 // [DB close]; } - (void)update:(NSString *)sex age:(int)age sID:(int)sID { //打开数据库 sqlite3 *db = [DB open]; //执行更新 sqlite3_stmt *stmt = nil; int flog = sqlite3_prepare_v2(db, "update BJS140523 set sSex = ?,sAge = ? where sID = ?", -1, &stmt, nil); if (flog == SQLITE_OK) { //问号是从1开始的 sqlite3_bind_text(stmt, 1, [sex UTF8String], -1, NULL); sqlite3_bind_int(stmt, 2, age); sqlite3_bind_int(stmt, 3, sID); sqlite3_step(stmt); } sqlite3_finalize(stmt); //关闭数据库 // [DB close]; } - (void)updateAge:(NSInteger)age ID:(NSInteger)number { //打开数据库 sqlite3 *db = [DB open]; //执行更新 sqlite3_stmt *stmt = nil; NSString *sql = [NSString stringWithFormat:@"update BJS140523 set sAge = %d where sID = %d",age,number]; int flog = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil); if (flog == SQLITE_OK) { sqlite3_step(stmt); } sqlite3_finalize(stmt); // sqlite3_exec(<#sqlite3 *#>, <#const char *sql#>, <#int (*callback)(void *, int, char **, char **)#>, <#void *#>, <#char **errmsg#>) //关闭数据库 // [DB class]; } @end