FMDB_and_Sqlite3

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 }

 

原文地址:https://www.cnblogs.com/longtaozi/p/3838837.html