iOS Sqlite 数据库

作者: 三秋树下 | 来源:发表于2016-04-28 19:19 被阅读646次

    什么是数据库

    数据库(Database)是按照数据结构来组织、存储和管理数据的仓库

    数据库有哪些

    关系型数据库

    对象型数据库

    主要关系型数据库:

    PC端:Oracle、MySQL、SQL Server、Access、DB2、Sybase

    嵌入式\移动客户端:SQLite

    什么是 Sqlite 数据库

    SQLite是一款轻型的嵌入式数据库,主流的移动客户端包括大多数安卓手机和部分的苹果手机都会使用这种轻量级的数据库

    SQLite与许多其它数据库管理系统不同,它不是一个客户端/服务器结构的数据库引擎,而是被集成在用户程序中。

    SQLite库链接到程序中,并成为它的一个组成部分。这个库也可被动态链接。应用程序经由编程语言内的直接API调用来使用SQlite的功能,这在减少数据库访问延迟上有积极作用,因为在一个单一进程中的函数调用比跨进程通信更有效率。SQLite将整个数据库,包括定义、表、索引以及数据本身,作为一个单独的、可跨平台使用的文件存储在主机中。它采用了在写入数据时将整个数据库文件加锁的简单设计。尽管写操作只能串行进行,但SQLite的读操作可以多任务同时进行。

    它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等 ,SQLite第一个Alpha版本诞生于2000年5月。 至今已经有14个年头,SQLite也迎来了一个版本 SQLite 3已经发布。-来自SQLite维基百科

    主键  primary key

    // integer类型的id作为t_student表的主键

    create  table t_student (id integer primary key,name text);

    //主键字段:只要声明为primary key,就说明是一个主键字段

    外键约束

    利用外键约束可以用来建立表与表之间的联系

    外键的一般情况是:一张表的某个字段,引用着另一张表的主键字段

    SQLite的特性

    1. ACID事务

    ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability). 原子性意味着数据库中的事务执行是作为原子。即不可再分,整个语句要么执行,要么不执行。一致性指数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。例如对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNTS表中Tom和Jack的存款总额为2000元。事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

    2. 零配置 – 无需安装和管理配置

    3.储存在单一磁盘文件中的一个完整的数据库

    特性总结:

    sqlite数据库是一种轻量级数据库,被集成到用户程序中

    占用资源非常的低,在嵌入式设备中,占用内存很低而查询效率很高,因此广泛应用在各种移动客户端中;

    简单,轻巧的足够小(C语言API ,4.43M)

    快(比大部分的普通数据库都快)

    支持的数据库大小至2TB

    SQLite 数据类型介绍

    每个存储在 SQLite 数据库中的值都具有以下存储类之一:

    null( NULL )              值是一个 NULL 值。

    integer( INTEGER )    值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。

    real( REAL )                值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。

    text (TEXT)                值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。

    blob( BLOB)                值是一个 blob 数据,完全根据它的输入存储。

    sqlite 的方法简介

    sqlite3     *db, 数据库句柄,跟文件句柄FILE很类似

    sqlite3_open(),  打开数据库,没有数据库时创建。

    sqlite3_exec(),  执行非查询的sql语句

    Sqlite3_step(), 在调用sqlite3_prepare后,使用这个函数在记录集中移动。

    Sqlite3_close(), 关闭数据库文件

    sqlite3_stmt      *stmt, 这个相当于ODBC的Command对象,用于保存编译好的SQL语句

    sqlite3_column_text(), 取text类型的数据。

    sqlite3_column_blob(),取blob类型的数据

    sqlite3_column_int(), 取int类型的数据


    如何在iOS中使用sqlite?

    第一步 sqlite.h文件的引入

    首先是打开和关闭数据库,打开和创建数据库都是sqlite3_open函数,如果filename已经创建那就是打开。

    NSString *filename;//数据库文件路径

    sqlite3 *database; //sqlite3数据库句柄的指针

    //打开数据库

    - (int) open{

    int rc=sqlite3_open([filename UTF8String], &database);

    if (rc) {

    sqlite3_close(database);

    NSLog(@"open database failed");

    }

    return rc;

    }

    - (void) close{//关闭数据库

    if (database!=NULL) {

    sqlite3_close(database);

    }

    }

    执行查询

    [self open];

    // 查

    strsql = "select * from users";

    // SQLITE_API int sqlite3_prepare_v2(

    // sqlite3 *db, /* Database handle */

    // const char *zSql, /* SQL statement*/

    // int nByte, /* 结果集的最大长度。*/

    // sqlite3_stmt **ppStmt, /* OUT: 结果集 */

    // const char **pzTail /* OUT:指向结果集没有用到的内存部分的指针。 */

    // );

    sqlite3_stmt* rc;//陈述式句柄

    if (sqlite3_prepare_v2(db, strsql, -1, &rc, NULL)!=SQLITE_OK) {

    }

    // sqlite3_step讲结果集数据指针指向下一个元素。

    // 这个函数的返回值如果是SQLITE_ROW就表示我们的结果集里面有数据。

    // 否则我们的结果集就是空的。

    while (sqlite3_step(rc)==SQLITE_ROW) {

    // sqlite3_column系列函数。一般有两个输入参数。第一个是结果集指针,第二是数据所在列的序号。

    // 比如我们现在用的sqlite3_column_int和sqlite3_column_text。

    printf("id:%d | username:%s | password:%s \n",sqlite3_column_int(rc,              0),sqlite3_column_text(rc, 1),sqlite3_column_text(rc, 2));

    }

    // 查完后一定要释放结果集。

    sqlite3_finalize(rc);

    [self close];

    增,改,删除,都用 sqlite3_exec函数

    //执行 insert,update,delete 等非查询SQL语句

    - (int)executeNonQuery:(NSString *)sql error:(NSError **)error {

    int rc;

    char *errmsg;

    rc = [self open];

    if (rc) {

    //错误处理

    if (error != NULL) {

    NSDictionary *eDict =

    [NSDictionary dictionaryWithObject:@"open database failed"

    forKey:NSLocalizedDescriptionKey];

    *error =

    [NSError errorWithDomain:kSqliteErrorDomain code:rc userInfo:eDict];

    }

    return rc;

    }

    rc = sqlite3_exec(database, [sql UTF8String], NULL, NULL, &errmsg);

    if (rc != SQLITE_OK) {

    if (error != NULL) {

    NSDictionary *eDict =

    [NSDictionary dictionaryWithObject:@"exec sql error"

    forKey:NSLocalizedDescriptionKey];

    *error =

    [NSError errorWithDomain:kSqliteErrorDomain code:rc userInfo:eDict];

    }

    NSLog(@"%s", errmsg);

    sqlite3_free(errmsg);

    }

    [self close];

    return rc;

    }

    上面函数中sqlite3_free就是释放存放错误信息的内存空间。

    相关文章

      网友评论

      • 牵线小丑:你好,想请教你个问题:

        我在测试 SQLite3 并发读取数据,但测试结果发现:并发读取比单线程读取还耗时(单线程 5000 条耗时 12 秒左右,2500 条 6 秒左右,而两个线程各读取 2500 条,总共耗时 18 秒左右)。而安卓那边试了一下,发现是正常的。这可能是什么原因导致的?

      本文标题:iOS Sqlite 数据库

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