• 数据库(SQLITE3函数总结): sqlite3_open, sqlite3_exec, slite3_close,sqlite3_prepare_v2,sqlite3_column_text,


                   Sqlite3 的确非常好用。小巧、速度快。近期研究它,有一些收获,这里把我对 sqlite3 的研究列出来,以备忘记。

                  导入SQLLite library并引入头文件.

                   libsqlite3.dylib本身是个链接,在这里它指向libsqlite3.0.dylib。也就是说在这里你加入libsqlite3.dylib和加入libsqlite3.0.dylib事实上是加入了同一个文件,没有差别,那为什么要加入libsqlite3.0.dylib呢?原因在于libsqlite3.dylib是旧版的sqlite3动态库。也就是说假设出现了新的动态库(如:libsqlite3.1.dylib)那libsqlite3.dylib将指向这个新的动态库(libsqlite3.1.dylib)所以建议还是要加入libsqlite3.0.dylib。

       (1) 重要数据结构

    sqlite 里最经常使用到的是 sqlite3 * 类型。

    从数据库打开開始,sqlite就要为这个类型准备好内存。直到数据库关闭,整个过程都须要用到这个类型。当数据库打开时開始,这个类型的变量就代表了你要操作的数据库。以下再具体介绍。


     (2) 打开数据库

    打开数据库链接sqlite3_open使用方法

    原型:

    SQLITE_API int sqlite3_open(
      const char *filename,   /* Database filename (UTF-8) */
      sqlite3 **ppDb          /* OUT: SQLite db handle */
    );
    用这个函数打开数据库操作。

    须要传入两个參数,一是数据库文件名称,比方ZUOYOU1314Students.sqlite. 在iOS中通常是[fileUTF8String]

        NSString * file = [documentsPathstringByAppendingPathComponent:@"ZUOYOU1314Students.sqlite"];

    二是 sqlite3 ** 參数即前面提到的重要数据结构。这个结构底层细节怎样。你不要管它。函数返回值表示操作是否正确,假设是 SQLITE_OK 则表示操作正常。相关的返回值sqlite定义了一些宏。

    具体这些宏的含义能够參考 sqlite3.h 文件。里面有具体定义.

    參考代码例如以下:

    //指向数据库的指针
    static sqlite3 * db = nil;
    
    //打开数据库
    + (sqlite3 *)open
    {
        //推断数据库对象是否打开, 即db 是否有值
        if (db != nil) {
            //db有值, 直接使用,不须要再打开
            return db;
        }
        
    #pragma ------第一次实现了拷贝 第二次须要推断documents里面是否已经有数据库文件
        //先找到documents文档
        NSString * documentsPath = kDocuments;
        //在documents 里面 拼接一个目录
        NSString * file = [documentsPath stringByAppendingPathComponent:@"Students.sqlite"];
        //从包里面取到 叫Students名字 后缀是sqlite的文件
        NSString * bundleFile = [[NSBundle mainBundle]pathForResource:@"Students" ofType:@"sqlite"];
        //创建文件管理器
        NSFileManager * fileManager = [NSFileManager defaultManager];
    
    
        
        //推断文件是否存在
        if ([fileManager fileExistsAtPath:file] == NO) {
            
            //然后把包里的文件复制到documents目录里
            [fileManager copyItemAtPath:bundleFile toPath:file error:nil];
            //UTF8tring 会把C语言 转换为 OC字符串    
        }
        sqlite3_open([file UTF8String], &db);
        
        return db;
    }
    

    (3) 关闭数据库

    原型:
    SQLITE_API int sqlite3_close(sqlite3 *);

    參考代码例如以下:
    /关闭数据库
    + (void)close
    {
        sqlite3_close(db);
        db = nil;    
    }

       (4) SQL语句操作


      (一)  sqlite3_exec:

    原型:

    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 */
    );

    这就是运行一条 sql 语句的函数。

    1个參数不再说了,是前面open函数得到的指针。说了是重要数据结构。

    2个參数const char *sql 是一条 sql 语句。以/0结尾。

    3个參数sqlite3_callback 是回调,当这条语句运行之后,sqlite3会去调用你提供的这个函数。

    4个參数void * 是你所提供的指针,你能够传递不论什么一个指针參数到这里,这个參数终于会传到回调函数里面。假设不须要传递指针给回调函数。能够填NULL。等下我们再看回调函数的写法,以及这个參数的使用。

    5个參数char ** errmsg 是错误信息。

    注意是指针的指针。sqlite3里面有非常多固定的错误信息。

    运行 sqlite3_exec之后,运行失败时能够查阅这个指针(直接 printf(%s/n,errmsg))得到一串字符串信息,这串信息告诉你错在什么地方。sqlite3_exec函数通过改动你传入的指针的指针,把你提供的指针指向错误提示信息,这样sqlite3_exec函数外面就能够通过这个 char*得到详细错误提示。

    说明:通常,sqlite3_callback 和它后面的 void * 这两个位置都能够填 NULL

    NULL表示你不须要回调。比方你做 insert 操作,做 delete 操作,做update 操作,就没有必要使用回调。而当你做 select 时,就要使用回调。由于 sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。

    參考代码例如以下:

    - (void)deleteButton
    {
        //打开数据库
        sqlite3 * db = [DB open];
        //运行删除    
    int falg =  sqlite3_exec(db, "delete from BJS140523 where sName like '坐'", NULL, NULL, nil);
        NSLog(@"444444  falg = %d",falg);
    }



    (二 ) sqlite3_prepare_v2:

    原型:

    SQLITE_API int sqlite3_prepare_v2(
      sqlite3 *db,            /* Database handle */
      const char *zSql,       /* SQL statement, UTF-8 encoded */
      int nByte,              /* Maximum length of zSql in bytes. */
      sqlite3_stmt **ppStmt,  /* OUT: Statement handle */
    <span style="font-family: 'Comic Sans MS';">   const char **pzTail     /* OUT: Pointer to unused portion of zSql */</span>

    參考代码例如以下:

       int flag =sqlite3_prepare_v2(db, "select * from BJS140523 "  , -1, &stmt, nil);






    (三) 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);


    參考代码例如以下:

     int sID = sqlite3_column_int(stmt, 0);//列的编号从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);


    (四)sqlite3_step()


    原型:

    SQLITE_API int sqlite3_step(sqlite3_stmt*);


    參考代码例如以下:

    if (falg == SQLITE_OK) {
            sqlite3_step(stmt);
        }


    (五)sqlite3_finalize()

    原型:

    SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);


    參考代码例如以下:

    sqlite3_finalize(stmt);


    (六) sqlite3_bind_text



    //bind  绑定 

    原型:

    SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
    SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double);
    SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int);
    SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);
    SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int);
    SQLITE_API int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
    SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));
    SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
    SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);
    參考代码例如以下:

        int falg = sqlite3_prepare_v2(db, "update BJS140523 set sSex = ?,sAge = ?

    where sID = ?

    ", -1, &stmt, nil); //绑定 //问号是从 1 開始的 sqlite3_bind_text(stmt,1,[sex UTF8String], -1, NULL); sqlite3_bind_int(stmt, 2, age); sqlite3_bind_int(stmt, 3, sID);
































  • 相关阅读:
    推荐个我在用的免费翻译软件,支持多家翻译API整合
    IDEA小技巧:Markdown里的命令行可以直接运行了
    Java 18 新特性:简单Web服务器 jwebserver
    Spring Authorization Server授权服务器入门
    Spring Security实现基于RBAC的权限表达式动态访问控制
    Intellij IDEA 2022 正式发布,这些功能真不错
    【大话云原生】负载均衡篇小饭馆客流量变大了
    【大话云原生】微服务篇五星级酒店的服务方式
    数据建模软件Chiner,颜值与实用性并存
    【大话云原生】煮饺子与docker、kubernetes之间的关系
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5258589.html
Copyright © 2020-2023  润新知