iOS数据库的使用

作者:flybear_Li

链接:https://www.jianshu.com/p/27bfcb85044a

iOS常用的数据存取方式。1.存文件。2.存NSUserDefault,这种方式是以plist文件存储的,也是持久化的一种。3.数据库。苹果自带的框架是coreData,可以导入sqlite3使用sqlite数据库。还可以使用FMDB,它是对sqlite数据库的封装,开发者不用面对c语言的sqlite开发,使用更加简单.

      sqlite数据库的特点;1.是基于c语言开发的数据库,2.用c语言对数据库执行操作,访问。3.sqlite是动态的数据库类型,即存储的时候是一种类型,使用的时候可以存储为其他类型。4.建立连接之后可以不关闭连接。

     iOS操作sqlite数据库分为以下几步:

1.打开数据库sqlite_open()。如果数据库已经创建,则直接打开,否则创建再打开。打开之后会得到一个sqlite对象,接下来的数据库操作均要对此对象进行操作。

-(void)openDb:(NSString*)daname{

//先取得数据库的路径

NSString*path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) firstObject];

NSString*databasePath = [path stringByAppendingString:daname];

self.database = [FMDatabase databaseWithPath:databasePath];

//再打开或者创建打开数据库

if(SQLITE_OK!=

sqlite3_open([databasePath UTF8String], &self.database)) {

NSLog(@"数据库打开失败");

}

else{

NSLog(@"数据库打开成功");

}

}

在open之前,定义一个单例staticSqliteManager*shareManager;

+(instancetype)shareManager{

if(shareManager==nil) {

shareManager=[[SqliteManageralloc]init];

[shareManageropenDb:kDatabaseName];

}

returnshareManager;

}

2.执行SQL语句,又分为有返回值的语句和无返回值的语句:(1)无返回值的语句:sqlite_exec()直接执行增insert,删remove,改,update操作。

-(void)excuteNonQuery:(NSString*)sql{

char*error;

if(SQLITE_OK!=

sqlite3_exec(_datebase, sql.UTF8String,NULL,NULL, &error)) {

NSLog(@"执行sql语句过程发生错误,错误信息:%s",error);

}

}

(2)有返回值的语句:查enquiry操作。首先通过sqlite_prepare_v2()进行sql语句语法检测,然后通过sqlite_step依次查询每一行的内容,对于每一行的数据可以通过sqlite_column_(列类型)获得对应列的数据,如此反复遍历直至完成。最后,执行释放句柄操作。在ios中对数据的读取每次只能够获取到一行的数据,因此封装这些操作更为方便使用。

-(NSArray*)excuteQuery:(NSString*)sql {

NSMutableArray*array =

[NSMutableArrayarray];

//先检查语法正确性

sqlite3_stmt*stmt;

if(SQLITE_OK==sqlite3_prepare_v2(_datebase, sql.UTF8String, -1, &stmt,NULL)) {

//再单步执行sql语句

while(SQLITE_ROW==sqlite3_step(stmt)) {

intcolumnCount =sqlite3_column_count(stmt);

NSMutableDictionary*dic = [NSMutableDictionarydictionary];

for (int i=0; i

constchar*name =sqlite3_column_name(stmt, i);

const unsignedchar*value =sqlite3_column_text(stmt, i);

dic[[NSString stringWithUTF8String:name]] = [NSString stringWithUTF8String:(constchar*)value];

}

[rows addObject:dic];

}

}

sqlite3_finalize(stmt);

returnrows;

}

FMDB是对sqlite的封装,同时相比简单的封装,考虑到了更多的细节,例如并发安全性处理,如何更好地处理事务等,是企业开发的首选。FMDB的基本使用步骤跟sqlite类似,首先打开数据库,如果数据库不存在,则先创建再打开。数据库已经封装好了类似demo中sqliteManager的两个方法excuteUpdate和excuteQuery,分别用于执行无返回值的更新和有返回值的查询。需要注意的是,如果要调用有格式化的sql语句,用?而不用%@。

如果直接使用FMDB或者直接使用sqlite对数据库进行操作,是线程不安全的。要线程安全可以使用FMDB的FMDB DataQueue线程队列操作数据库。使用databaseQueue不需要打开操作。

Github地址:https://github.com/ccgus/fmdb

考虑到一般使用场景经常涉及到多线程的应用,databaseQueue是更好的选择。

@property(nonatomic)FMDatabaseQueue*databaseQueue;

-(void)openDb:(NSString*)daname{

//先取得数据库的路径

NSString*path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)firstObject];

NSString*databasePath = [pathstringByAppendingString:daname];

self.databaseQueue= [FMDatabaseQueuedatabaseQueueWithPath:databasePath];

}

-(void)excuteNonQuery:(NSString*)sql{

[self.databaseQueueinDatabase:^(FMDatabase*db) {

[dbexecuteUpdate:sql];

}];

}

-(NSArray*)excuteQuery:(NSString*)sql {

NSMutableArray*array =

[NSMutableArrayarray];

[self.databaseQueueinDatabase:^(FMDatabase*db) {

FMResultSet*result = [dbexecuteQuery:sql];

while(result.next) {

NSMutableDictionary*dic = [NSMutableDictionarydictionary];

for(inti=0; i

dic[[resultcolumnNameForIndex:i]]= [resultstringForColumnIndex:i];

}

[arrayaddObject:dic];

}

}];

returnarray;

}

在使用FMDB的同时,还需要掌握一定的常用SQL语句。

常用的SQL语句不外乎围绕增删改查对数据库进行操作。

Sql语言对大小写不敏感。WHERE关键字等效于where

以下是SQL语句常见的基本用法。

SQL select语法:

1.SELECT列名称FROM表名称;SELECT*FROM表名称;

2.在表中,可能会包含重复值,如果仅仅需要列出不同的值用如下方式:SELECT DISTINCT列名称FROM表名称

3.INSERT语句用于向表格中插入新的行。INSERT

INTO表名称VALUES(值1,值2,…)

我们也可以指定插入数据的列的值:INSERT INTO table_name(列1,列2,…)VALUES (值1,值2,…)

4.UPDATE用于修改或者是更新表格中的数据。UPDATE表名称SET列名称=新值WHERE列名称=某值

5.DELETE用于删除表中的行

DELETE FROM表名称WHERE列名称=值

6.WHERE子句如果需要有条件地操作表格中的数据,可以将WHERE子句添加到SELECT语句,DELETE语句等。

例如:SELECT列名称FROM表名称WHERE列运算符值

7.AND和OR运算符:AND和OR可以将WHERE语句中的两个或者多个条件结合起来。

例如:SELECT*FROM persons WHERE FirstName=’Tomas’ AND LastName = ‘Carter’

8.ORDER BY语句:用于根据指定的列对结果集进行排序。DESC关键字是指降序排列

SELECT Company,OrderNumber FROM OrdersORDER BY Company [DESC]

CREATETABLE IF NOT EXISTS user (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL)

[self.dbexecuteUpdate:@"INSERT INTO user (name, age) VALUES (?, ?);", name,@(arc4random_uniform(40))];

[self.dbexecuteUpdate:@"DROP TABLE IF EXISTS user;"];

1- (void)query

2{

3// 1.执行查询语句

4FMResultSet*resultSet = [self.dbexecuteQuery:@"SELECT * FROM user"];

5

6// 2.遍历结果

7while([resultSetnext]) {

8intID = [resultSetintForColumn:@"id"];

9NSString*name = [resultSetstringForColumn:@"name"];

10intage = [resultSetintForColumn:@"age"];

11NSLog(@"%d %@ %d", ID, name, age);

12}

}最后,附上可以进行增删改查简单功能的数据库Demo,下载地址:github.com/flybear123/FMDBDemo.git

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

推荐阅读更多精彩内容