FMDB的使用,sqlite3语法简略
引入头文件
#import "FMDatabase.h”,
导入系统库:libsqlite3.0.dylib
1 FMDB的使用,sqlite3语法简略 2 引入头文件 3 #import "FMDatabase.h”, 4 导入系统库:libsqlite3.0.dylib 5 6 7 1.首先给数据库存放找一个路径: 8 //获取数据库文件路径 9 #define kDataBaseName @"database.sqlite3" 10 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 11 NSString *documentsDirectory = [paths objectAtIndex:0]; 12 _dbPath = [documentsDirectory stringByAppendingPathComponent:kDataBaseName]; 13 ——————或者可以使用下面这个简单点的 14 NSString *filePath = NSHomeDirectory(); 15 filePath = [filePath stringByAppendingPathComponent:@"Library/Caches"]; 16 _dbPath = [filePath stringByAppendingPathComponent: kDataBaseName]; 17 ——————— 18 2.有了数据库文件路径后,可以创建数据库了: 19 (1)、看看FMDB的方法: 20 _myDB = [FMDatabase databaseWithPath:_dbPath];//初始FMDatabase的其它信息 21 if ([_myDB open]) { //创建和打开一个数据库文件。 22 NSLog(@"数据库文件已经创建"); 23 [self createCharSave_table];//再该数据库文件中创建表格。 24 }else{ 25 NSLog(@"创建数据库失败!"); 26 } 27 /*在上面的几行代码中,真正创建并打开一个数据库的代码是[_myDB open]而在FMDatabase中执行方法是sqlite3的方法,FMDB将原生的方法封装成它的一部分。下面来看看使用原生sqlite3创建数据库的语法:*/ 28 (2)、直接使用sqlite3代开或者创建数据库,(选择一种方式) 29 sqlite3 *database; 30 if (sqlite3_open([_dbPath UTF8String], &database)!=SQLITE_OK) { 31 sqlite3_close(database); 32 NSAssert(0,@"打开数据库失败!"); 33 }else{ 34 printf("sub :%s ",[_dbPath UTF8String]); 35 } 36 ———————— 37 3.前面创建并打开了数据库,接下来创建一个关系表格: 38 (1)、sql执行语句字符串: 39 _table =@“sqlTable”; 40 NSString *creatSQLStr = [NSString stringWithFormat:@"create table if not exists %@(id integer,char text,time text)",_table];//大写小写无所谓的。也可以这样: 41 NSString * creatSQLStr = @"CREATE TABLE IF NOT EXISTS sqlTable(TAG INTEGER PRIMARY KEY,char TEXT,time TEXT)”; 42 (2)、FMDB在数据库中创建表格 43 if ([_myDB executeUpdate: creatSQLStr]){ 44 NSLog(@"创建%@成功",_table); 45 }else{ 46 NSLog(@"创建%@失败!",_table); 47 [_myDB close];//如果创建失败,不会再使用它了,所以选择关闭数据库 48 } 49 (1)、sqlite3创建数据库表格 50 char *errorMsg; 51 if (sqlite3_exec(database, [creatSQLStr UTF8String], NULL, NULL, &errorMsg)!=SQLITE_OK) { 52 sqlite3_close(database); //如果创建失败,选择光比数据库 53 NSAssert(0, @"创建数据库表格错误:%s",errorMsg); 54 } 55 ———————— 56 4.执行查询语句,从数据库指定表格中查询数据: 57 (1)、FMDB下得查询代码示例: 58 -(NSArray *)takeOutItemsFromTable:(NSString *)tableName 59 { 60 NSString *table; 61 if (tableName) { 62 table = tableName; 63 }else{ 64 table = _table; 65 } 66 NSString *sql = [NSString stringWithFormat:@"select * from %@",table]; 67 FMResultSet *rs = [_myDB executeQuery:sql]; 68 NSMutableArray *resultArr = [NSMutableArray arrayWithCapacity:0]; 69 while ([rs next]) { 70 int _id = [rs intForColumn:@"id”];//注意存储的形式integer的 71 NSString *charOne = [rs stringForColumn:@"char"]; 72 NSString *timeOne = [rs stringForColumn:@"time"]; 73 NSArray *itemArr = [NSArray arrayWithObjects:[NSNumber numberWithInt:_id],charOne,timeOne, nil]; 74 [resultArr addObject:itemArr]; 75 } 76 return resultArr;//得到记录存放再json数据中 77 } 78 (2)、直接使用sqlite3 查询代码示例: 79 - (NSArray *)queryTable 80 { 81 const char *selectSql=@"SELECT TAG,char,time FROM dataTable ORDER BY TAG"; 82 sqlite3_stmt *statement; 83 NSMutableArray *muArray = [NSMutableArray array]; 84 85 if (sqlite3_prepare_v2(database, selectSql, -1, &statement, nil)==SQLITE_OK) 86 { 87 while (sqlite3_step(statement)==SQLITE_ROW)//SQLITE_OK SQLITE_ROW 88 { 89 int tag=sqlite3_column_int(statement, 0);// 90 91 NSString *charOne=[[NSString alloc] initWithCString:(char *)sqlite3_column_text(statement, 1) encoding:NSUTF8StringEncoding]; 92 93 NSString *timeOne = [[NSString alloc] initWithCString:(char *)sqlite3_column_text(statement, 2) encoding:NSUTF8StringEncoding]; 94 95 NSArray *arrOne = [NSArray arrayWithObjects:[NSNumber numberWithInt:tag],charOne,timeOne, nil]; 96 [muArray addObject:arrOne]; 97 } 98 sqlite3_finalize(statement);//called to delete a [prepared statement]. 99 } 100 sqlite3_close(database);//关闭数据库 101 return muArray; 102 } 103 5.执行数据插入操作,将数据插入数据库表格: 104 (1)、FMDB框架API插入表格数据 105 #pragma mark - 判断数据库中是否已经存在该项 106 -(BOOL)existItem_baseChar:(NSString *)fontChar 107 { 108 NSString *sql = [NSString stringWithFormat:@"select count(*) from %@ where char=?",_table]; 109 FMResultSet *rs = [_myDB executeQuery:sql,fontChar]; 110 while ([rs next]) { 111 return [rs intForColumnIndex:0]; 112 } 113 return NO; 114 } 115 #pragma mark - 添加数据在数据库的表格中 116 -(void)insertItem_Char:(NSString *)fontChar and_Time:(NSString *)time 117 { 118 if ([self existItem_baseChar:fontChar]) { 119 NSLog(@"要插入数据%@已经存在表中",fontChar); 120 return; 121 } 122 NSString *inertSql = [NSString stringWithFormat:@"insert into %@(char,time) values(?,?)",_table]; 123 if ([_myDB executeUpdate:inertSql,fontChar,time]) { 124 NSLog(@"数据:%@ 插入成功!",fontChar); 125 }else{ 126 NSLog(@"插入数据失败! %@",[_myDB lastErrorMessage]); 127 } 128 } 129 (2)、直接使用sqlite3插入数据 130 -(void)insertItem:(NSString *)charOne andTime:(NSString *)timeOne { 131 sqlite3_stmt *stmt; 132 char *errorMsg = NULL; 133 if(SQLITE_OK == sqlite3_prepare_v2(database, "INSERT INTO dataTable (tag,char,time) VALUES (?,?,?)", -1, &stmt, &errorMsg)){ 134 //将上面的三个?绑定 135 sqlite3_bind_int(stmt, 1, time(NULL));//放回当前的时间(s)将当前时间绑定 136 sqlite3_bind_text(stmt, 2, [charOne UTF8String], -1, NULL); 137 sqlite3_bind_text(stmt, 3, [timeOne UTF8String], -1, NULL); 138 } 139 if(SQLITE_DONE!=sqlite3_step(stmt)){ 140 NSAssert(0, @"跟新数据库表dataTable出错:%s",errorMsg); 141 } 142 sqlite3_finalize(stmt); 143 sqlite3_close(database); 144 } 145 6.从数据库表中进行修改数据,删除数据: 146 (1)、FMDB进行删除操作 147 -(void)deleteItem_baseChar:(NSString *)fontChar 148 { 149 if (![self existItem_baseChar:fontChar]) { 150 printf("要删除的数据不存在表中 "); 151 return; 152 } 153 NSString *sql = [NSString stringWithFormat:@"delete from %@ where char=?",_table]; 154 if ([_myDB executeUpdate:sql,fontChar]) { 155 printf("删除数据%s成功! ",[fontChar UTF8String]); 156 }else{ 157 NSLog(@"删除%@数据失败! %@ ",fontChar,[_myDB lastErrorMessage]); 158 } 159 } 160 (2)、sqlite3的计数,删除,修改table数据的操作: 161 -(void) updateItemBy:(int)tag withChar:(NSString *)newChar time:(NSString *) newTime { 162 sqlite3_stmt *stmt; 163 const char *errorMsg = NULL; 164 if(SQLITE_OK == sqlite3_prepare_v2(database, "UPDATE dataTable SET tag=?,time=? WHERE char=?", -1, &stmt, &errorMsg)){ 165 sqlite3_bind_int(stmt, 1, tag); 166 sqlite3_bind_text(stmt, 2, [newChar UTF8String], -1, NULL); 167 sqlite3_bind_text(stmt, 3, [newTime UTF8String], -1, NULL); 168 } 169 if(SQLITE_DONE!=sqlite3_step(stmt)){ 170 NSAssert(0, @"更新数据库表dataTable出错:%s",errorMsg); 171 } 172 sqlite3_finalize(stmt); 173 sqlite3_close(database); 174 } 175 —————————— 176 -(void) deleteItemByChar:(NSString *)charOne { 177 sqlite3_stmt *stmt; 178 const char *errorMsg = NULL; 179 if(SQLITE_OK == sqlite3_prepare_v2(database, "DELETE FROM dataTable WHERE char=?", -1, &stmt, &errorMsg)){ 180 sqlite3_bind_text(stmt, 2,[charOne UTF8String],-1,NULL); 181 } 182 if(SQLITE_DONE!=sqlite3_step(stmt)){ 183 NSAssert(0, @"更新数据库表dataTable出错:%s",errorMsg); 184 } 185 sqlite3_finalize(stmt); 186 sqlite3_close(database); 187 } 188 ——————————— 189 - (int) count { 190 sqlite3_stmt *stmt; 191 int result = sqlite3_prepare_v2(database, "SELECT COUNT(*) FROM dataTable", -1, &stmt, NULL); 192 if (result == SQLITE_OK) { 193 if (SQLITE_ROW == sqlite3_step(stmt)) { 194 int count = sqlite3_column_int(stmt, 0); 195 sqlite3_finalize(stmt); 196 return count; 197 } 198 } else { 199 NSLog(@"count failed with code:%d", result); 200 } 201 sqlite3_finalize(stmt); 202 return 0; 203 }