iOS Sqlite 数据库

什么是数据库

数据库(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就是释放存放错误信息的内存空间。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容