FMDB源码解读

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*)
);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前篇:Sqlite 的简单了解 FMDB 对 SQLite3 的C函数做了面向对象的封装:针对数据库提供了增删查改...
    苏沫离阅读 1,408评论 0 2
  • FMDB主要有以下几个类: (1)FMDatabase:代表一个单独的SQLite操作实例,数据库通过它增删改查操...
    hui8685291阅读 781评论 0 3
  • 1、简述: FMDB是iOS平台的SQLite数据库框架,是对libsqlite3框架的封装 FMDB以OC的方式...
    阳明AI阅读 311评论 0 3
  • 一、iOS沙盒机制 iOS的每个应用都有属于自己的存储空间,即沙盒应用只能访问自己的沙盒,不可访问其他区域。 沙盒...
    片片碎阅读 840评论 0 1
  • 一、什么是FMDB FMDB是iOS平台的SQLite数据库的框架 FMDB是以OC的形式封装了SQLite的C语...
    随风飘荡的小逗逼阅读 3,258评论 0 1