zoukankan      html  css  js  c++  java
  • 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 }

     

  • 相关阅读:
    第15.28节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QTableWidget详解
    PyQt学习随笔:QTableWidget的信号signal简介
    PyQt学习随笔:QTableWidget水平表头horizontalHeader、竖直表头verticalHeader的相关操作方法
    PyQt学习随笔:QTableWidget的selectedRanges、setRangeSelected访问选中矩形范围的方法
    PyQt学习随笔:QTableWidget的visualRow、visualColumn、logicalRow、logicalColumn(可见行、逻辑行、可见列、逻辑列)相关概念及方法探究
    PyQt(Python+Qt)学习随笔:QTableWidget的获取指定位置项的item和itemAt方法
    PyQt(Python+Qt)学习随笔:QTableWidget的findItems和selectedItems搜索项和访问选中项方法
    PyQt(Python+Qt)学习随笔:QTableWidget的takeItem和sortItems方法
    PyQt(Python+Qt)学习随笔:QTableWidget项编辑方法editItem、openPersistentEditor
    PyQt(Python+Qt)学习随笔:QTableWidget设置项的setItem方法
  • 原文地址:https://www.cnblogs.com/longtaozi/p/3838837.html
Copyright © 2011-2022 走看看