zoukankan      html  css  js  c++  java
  • sqlite3基础

    要使用sqlite,首先需要添加库文件libsqlite3.dylib。当你搜索libsqlite3关键字时,会发现还有一个libsqlite3.0.dylib的库文件,这里还是建议添加libsqlite3.dylib,原因在于libsqlite3.dylib是一个替身文件,它总是指向最新的sqlite3动态库;假如出现了新的动态库libsqlite3.1.dylib,那么libsqlite3.dylib将指向它,而libsqlite3.0.dylib无法指向。

    在对sqlite数据库进行操作前先声明一个sqlite3类型的对象:

    sqlite3 *db;

    sqlite3_open — 创建并打开一个sqlite数据库

    SQLITE_API int sqlite3_open(
      const char *filename,   /* Database filename (UTF-8) */
      sqlite3 **ppDb          /* OUT: SQLite db handle */
    );

    sqlite3_close关闭一个sqlite数据库

    SQLITE_API int sqlite3_close(sqlite3*);

    示例1:创建并打开sqlite数据库

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsPath = [paths objectAtIndex:0];
    NSLog(@"documentsPath: %@",documentsPath);
    
    NSString *databasePath = [documentsPath stringByAppendingPathComponent:@"personinfo.sqlite"];
    NSLog(@"databasePath: %@",databasePath);
    
    int state = sqlite3_open([databasePath UTF8String], &db);
    NSLog(@"%d",state);
    
    if(state != SQLITE_OK) {
        sqlite3_close(db);
        NSLog(@"数据库打开失败");
    }

    sqlite3_exec执行非查询的sql语句

    SQLITE_API int sqlite3_exec(
      sqlite3*,                                  /* An open database */
      const char *sql,                           /* SQL to be evaluated */
      int (*callback)(void*,int,char**,char**),  /* Callback function */
      void *,                                    /* 1st argument to callback */
      char **errmsg                              /* Error msg written here */
    );

    示例2:执行创建表、插入数据操作

    - (BOOL)execSql:(NSString *)sql {
        char *err;
        if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {
            sqlite3_close(db);
            NSLog(@"execute sql fail!");
            return NO;
        }
        else {
            NSLog(@"execute sql succeed!");
            return YES;
        }
    }
    
    - (IBAction)createTable:(id)sender {
        NSLog(@"button clicked");
        NSString *strSql = @"CREATE TABLE IF NOT EXISTS PERSONINFO (ID INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, address TEXT)";
        
        [self execSql:strSql];
    }
    
    - (IBAction)insertAction:(id)sender {
        NSLog(@"insert action");
        NSString *sql1 = [NSString stringWithFormat:
                          @"INSERT INTO 'PERSONINFO' ('name', 'age', 'address') VALUES ('%@', '%@', '%@')",
                          @"张三", @"23", @"西城区"];
        
        NSString *sql2 = [NSString stringWithFormat:
                          @"INSERT INTO 'PERSONINFO' ('name', 'age', 'address') VALUES ('%@', '%@', '%@')",
                          @"老六", @"20", @"东城区"];
        [self execSql:sql1];
        [self execSql:sql2];
    }

    sqlite3_stmt — 相当于ODBC的command对象,用于保存编译好的sql语句

    sqlite3_prepare_v2 — 这个函数将sql文本转换成一个准备语句(prepared statement)对象,同时返回这个对象的指针。它实际上并不执行这个sql语句,仅仅为执行而准备这个sql语句,也就是说,在调用该函数成功(SQLITE_OK)后,sqlite3_stmt将不再为空对象。

    SQLITE_API int sqlite3_prepare_v2(
      sqlite3 *db,            /* Database handle(数据库指针) */
      const char *zSql,       /* SQL statement, UTF-8 encoded(使用UTF-8编码的SQL语句) */
      int nByte,              /* Maximum length of zSql in bytes.(如果nByte小于0,则函数取出zSql中从开始到第一个0终止符的内容;如果nByte为非负数,那么它就是这个函数能从zSql中读取的最大字节数。如果nBytes为非负数,zSql在第一次遇见/000或u000的时候终止) */
      sqlite3_stmt **ppStmt,  /* OUT: Statement handle(能够使用sqlite3_step()执行的编译好的准备语句的指针,如果错误发生,它被置为NULL,例如输入一个不正确的sql语句。调用过程必须负责在编译好的sql语句完成使用后,调用sqlite3_finalize()删除它。 */
      const char **pzTail     /* OUT: Pointer to unused portion of zSql(当zSql在遇见终止符或者达到设定的nByte结束后,如果还有剩余的内容,那么这些剩余的内容将被存放到pzTail中,不包含终止符) */
    );

    sqlite3_step — 执行由sqlite3_prepare创建的准备语句。当调用后返回SQLITE_ROW,则代表还有更多行,可继续调用sqlite3_step直至返回SQLITE_DONE。对于insert、update或delete语句,也可以用sqlite3_step来执行,但更推荐用sqlite3_exec。

    SQLITE_API int sqlite3_step(sqlite3_stmt*);

    sqlite3_step的返回值取决于创建sqlite3_stmt参数所使用的函数,假如使用老版本的接口sqlite3_prepare()或sqlite3_prepare16(),返回值会是SQLITE_BUSY、SQLITE_DONE SQLITE_ROW SQLITE_ERROR  SQLITE_MISUSE;而v2版本的接口sqlite3_prepare_v2()和sqlite3_prepare16_v2()除了这些值以外,还可能返回扩展状态码。

    sqlite3_reset — 重置一个准备语句(prepared statement)对象到它的初始状态,准备被重新执行。在V3.6.23.1以后,sqlite3_step()将会自动调用sqlite3_reset。

    SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt);

    sqlite3_finalize — 销毁一个准备语句(prepared statement)对象,在需要时执行这个销毁函数以防止内存泄露。在准备语句对象为空指针时调用这个函数也没有什么影响。

    SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);

    示例3:利用sqlite3_step执行更新操作 

    - (IBAction)updateAction:(id)sender {
        NSString *sqlQuery = @"update PERSONINFO set address='成都市' where age='20'";
    
        sqlite3_stmt *statement;
        
        if(sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK) {
            if(sqlite3_step(statement) == SQLITE_DONE) {
                NSLog(@"update succeed");
            }
            else {
                NSLog(@"update failed");
            }
        }
        sqlite3_finalize(statement);
    }

    sqlite3_column — 并不存在sqlite3_column这个函数,它只是一个前缀,下面是相关的具体函数:

    SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
    SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
    SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
    SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol);
    SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol);
    SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);
    SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
    SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
    SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol);
    SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);

    上面的函数用来得到结果集当前行中某一列的值,列索引从0开始。

    示例4:查询并打印出结果集

    - (IBAction)selectAction:(id)sender {
        NSString *sqlQuery = @"SELECT * FROM PERSONINFO";
        sqlite3_stmt *statement;
        
        if (sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK) {
            while (sqlite3_step(statement) == SQLITE_ROW) {
                char *cID = (char*)sqlite3_column_text(statement, 0);
                NSString *strID = [[NSString alloc] initWithUTF8String:cID];
                
                char *cName = (char*)sqlite3_column_text(statement, 1);
                NSString *strName = [[NSString alloc] initWithUTF8String:cName];
                
                int age = sqlite3_column_int(statement, 2);
                
                char *cAddress = (char*)sqlite3_column_text(statement, 3);
                NSString *strAddress = [[NSString alloc] initWithUTF8String:cAddress];
                
                NSLog(@"id:%@  name:%@  age:%d  address:%@",strID, strName, age, strAddress);
            }
        }
        sqlite3_finalize(statement);
    }
  • 相关阅读:
    ICON 收集
    vs2015with_update_3
    文件大全,以后就从这些格式入手fuzz
    诗词
    tools URL 收集
    (四)ORBSLAM运动估计
    (三)ORB特征匹配
    (二)ORB描述子提取源码思路与实现
    (一)ORB描述子提取
    双目立体匹配——归一化互相关(NCC)
  • 原文地址:https://www.cnblogs.com/CoderWayne/p/4803257.html
Copyright © 2011-2022 走看看