美文网首页
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源码解读

    FMDB提供的事务,分专用事务和延期事务 开始专用事务 开始延期事务 回滚 提交 列的类型 获取某行的某列的值

  • iOS - FMDB源码

    FMDB是对SQLite数据库的封装。源码地址[https://github.com/ccgus/fmdb] 源码...

  • FMDB源码系列(二)

    上一篇讲解了FMDB使用的一些宏与Sqlite3错误码,都是FMDB中常用的。这篇我们开始进入源码的解读过程。 F...

  • iOS之FMDB 源码解读

    前篇:Sqlite 的简单了解 FMDB 对 SQLite3 的C函数做了面向对象的封装:针对数据库提供了增删查改...

  • AFN 3.0学习总结(最后的总结 转载)

    AFNetworking 3.0 源码解读 总结(干货)(上) AFNetworking 3.0 源码解读 总结(...

  • spring源码解读网上知识摘要

    spring 启动源码 spring 启动流程源码解读spring 启动注解加载类源码解读springxml 文件...

  • FMDB 源码阅读

    面试的时候被问到了 说FMDB如何是实现数据的安全的,我当时没有去看源码,直接猜测是加了锁,后来发现不是,现在补上...

  • fmdb源码解析

    FMDatabase FMDatabase用来操作数据库,主要接口 FMResultSet 表示执行查询sql返回...

  • FMDB源码分析

    1.关键点再多线程 存储数据的,要通过FMDB Queue 串行队列dispatch_queue_set_sp...

  • FMDB源码解析

    FMDatabase这个类不是线程安全的,如果多个线程同时使用一个FMDatabase对象来存取数据,可能会发生数...

网友评论

      本文标题:FMDB源码解读

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