美文网首页
FMDB源码解读

FMDB源码解读

作者: China架构师 | 来源:发表于2022-09-18 18:14 被阅读0次

    FMDB提供的事务,分专用事务和延期事务

    // 专用事务
    - (void)inTransaction:(__attribute__((noescape)) void (^)(FMDatabase *db, BOOL *rollback))block;
    
    // 延期事务
    - (void)inDeferredTransaction:(__attribute__((noescape)) void (^)(FMDatabase *db, BOOL *rollback))block;
    

    开始专用事务

    BOOL b = [self executeUpdate:@"begin exclusive transaction"];
    

    开始延期事务

    BOOL b = [self executeUpdate:@"begin deferred transaction"];
    

    回滚

    BOOL b = [self executeUpdate:@"rollback transaction"];
    

    提交

    BOOL b =  [self executeUpdate:@"commit transaction"];
    
    // 359关闭数据库
    SQLITE_API int sqlite3_close(sqlite3*);
    
    /// 单步查询执行接口
    SQLITE_API int sqlite3_exec(
      sqlite3*,                                  /* An open database */
      const char *sql,                           /* SQL to be evaluated */
      int (*callback)(void*,int,char**,char**),  /* 回调函数 */
      void *,                                    /* 回调的第一个参数 */
      char **errmsg                              /* 错误信息 */
    );
    
    // 2478获取最后一次插入的行id
    SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*);
    
    // 2633用来打断长时间运行的查询
    SQLITE_API void sqlite3_interrupt(sqlite3*);
    
    // 3634初始化sqlite3
    SQLITE_API int sqlite3_open_v2(
      const char *filename,   /* 数据库文件路径 (UTF-8编码) */
      sqlite3 **ppDb,         /* 输出SQLite数据库管理 */
      int flags,              /* 标记 */
      const char *zVfs        /* Name of VFS module to use */
    );
    
    // 3886
    SQLITE_API const char *sqlite3_errmsg(sqlite3*);
    
    /* 3916这个对象的一个实例表示一个已经被编译成二进制表单并且准备去评估的SQL语句了。
    ** 把每个SQL语句想象成一个独立的电脑程序。原始的SQL文本时源码。一个准备好的语句对象就是编译完的对象代码。所有SQL在执行之前,必须被转换成准备好的语句。
    ** 
    */
    typedef struct sqlite3_stmt sqlite3_stmt;
    // 4388
    typedef struct sqlite3_value sqlite3_value;
    
    /// 4544绑定二进制数据
    /// @param uid 语句
    /// @param “?”的索引,从1开始
    /// @param 二进制数据的起始指针
    /// @param 二进制数据的长度
    /// @param 析构回调函数,一般默认为空
    SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
    SQLITE_API int sqlite3_bind_blob64(sqlite3_stmt*, int, const void*, sqlite3_uint64, 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,void(*)(void*));
    SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
    
    // 4584获取SQL绑定参数的数量
    SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*);
    
    // 4656获取语句的列表数
    SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt);
    // 4685获取列名
    SQLITE_API const char *sqlite3_column_name(sqlite3_stmt*, int N);
    SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N);
    
    
    // 4715
    SQLITE_API int sqlite3_prepare_v2(
      sqlite3 *db,            /* 数据库管理 */
      const char *zSql,       /* SQL 语句, UTF-8 编码的 */
      int nByte,              /* Maximum length of zSql in bytes. */
      sqlite3_stmt **ppStmt,  /* 输出语句管理 */
      const char **pzTail     /* OUT: Pointer to unused portion of zSql */
    );
    
    // 4852 执行SQL语句
    SQLITE_API int sqlite3_step(sqlite3_stmt*);
    // 4873获取语句的列表数
    SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
    

    列的类型

    // 4896整型,对应于[NSNumber numberWithLongLong:value]]
    #define SQLITE_INTEGER  1
    // 浮点型,对应于[NSNumber numberWithDouble:value]]
    #define SQLITE_FLOAT    2
    // 对应于NSData
    #define SQLITE_BLOB     4
    // 空,对应于NSNull
    #define SQLITE_NULL     5
    // 文本,对应于NSString
    #ifdef SQLITE_TEXT
    # undef SQLITE_TEXT
    #else
    # define SQLITE_TEXT     3
    #endif
    #define SQLITE3_TEXT     3
    

    获取某行的某列的值

    // 5116
    SQLITE_API const void *sqlite3_column_blob(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 sqlite3_value *sqlite3_column_value(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 int sqlite3_column_type(sqlite3_stmt*, int iCol);
    
    // 5125获取列的类型
    SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol);
    
    // 5153销毁语句
    SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);
    // 5180重置语句
    SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt);
    
    // 5305
    SQLITE_API int sqlite3_create_function(
      sqlite3 *db,
      const char *zFunctionName,
      int nArg,
      int eTextRep,
      void *pApp,
      void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
      void (*xStep)(sqlite3_context*,int,sqlite3_value**),
      void (*xFinal)(sqlite3_context*)
    );
    

    相关文章

      网友评论

          本文标题:FMDB源码解读

          本文链接:https://www.haomeiwen.com/subject/wezyortx.html