iOS学习——数据库操作(SQLite)

SQLite (http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库。SQLite最初的设计目标是用于嵌入式系统,它占用资源非常少,在嵌入式设备中,只需要几百K的内存就够了,目前应用于Android、iOS、Windows Phone等智能手机。iOS 使用时SQLite,只需要加入 libsqlite3.dylib 依赖以及引入 sqlite3.h 头文件即可。

在这里我还是要推荐下我自己建的iOS开发学习群:680565220,群里都是学ios开发的,如果你正在学习ios ,小编欢迎你加入,今天分享的这个案例已经上传到群文件,大家都是软件开发党,不定期分享干货(只有iOS软件开发相关的),包括我自己整理的一份2018最新的iOS进阶资料和高级开发教程

          数据库操作包含打开数据库、创建表,表的增、删、改、查。下面代码给出了数据库操作。

         创建并打开数据库:

[cpp] view plain copy

-(BOOL) openDB{  

//获取数据库路径  

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  

    NSString *documents = [paths objectAtIndex:0];  

    NSString *database_path = [documents stringByAppendingPathComponent:DBNAME];  


//如果数据库存在,则用sqlite3_open直接打开(不要担心,如果数据库不存在sqlite3_open会自动创建)  

//打开数据库,这里的[path UTF8String]是将NSString转换为C字符串,因为SQLite3是采用可移植的C(而不是  

//Objective-C)编写的,它不知道什么是NSString.  

if (sqlite3_open([database_path UTF8String], &db) == SQLITE_OK) {  

return YES;  

}else{  

return NO;  

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

        sqlite3_close(db);  

    }  

}  

         iOS中没有提供创建数据库的命令,当使用sqlite3_open时,如果数据库文件不存在会自行创建数据库,如果存在会打开数据库。打开数据库后就可以创建表并操作表内容了,iOS中的sqlite3使用sqlite3_exec来创建表、插入表内容、修改表内容、删除表内容等操作,使用sqlite3_prepare_v2来查询表。下面给给出了sqlite3_exec的封装:

[cpp] view plain copy

-(void)execSql:(NSString *)sql  

{      

if ([self openDB]) {  

char *err;  

if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {  

NSLog(@"数据库操作数据失败!");  

}else{  

NSLog(@"%@",sql);  

        }  

        sqlite3_close(db);  

    }      

}  

        创建表:

[cpp] view plain copy

NSString *sqlCreateTable =  [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS '%@' ('%@' INTEGER PRIMARY KEY AUTOINCREMENT, '%@' TEXT, '%@' INTEGER, '%@' TEXT)",TABLENAME,ID,NAME,AGE,ADDRESS];  

    [self execSql:sqlCreateTable];  

        插入数据:

[cpp] view plain copy

-(void) insertData{  

    NSString *insertSql1= [NSString stringWithFormat:  

@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",  

TABLENAME, NAME, AGE, ADDRESS, @"张三", @"13", @"济南"];  

    [self execSql:insertSql1];  


    NSString *insertSql2 = [NSString stringWithFormat:  

@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",  

TABLENAME, NAME, AGE, ADDRESS, @"李四", @"12", @"济南"];  

    [self execSql:insertSql2];  


}  

         修改表:

[cpp] view plain copy

-(void) updateData{  

    NSString *updateSql = [NSString stringWithFormat:  

@"UPDATE '%@' SET '%@' = '%@' WHERE '%@' = '%@'",  

TABLENAME,   AGE,  @"15" ,AGE,  @"13"];  

    [self execSql:updateSql];  

}  

         删除表内容:

[cpp] view plain copy

-(void) deleteData{  

    NSString *sdeleteSql = [NSString stringWithFormat:  

@"delete from %@ where %@ = '%@'",  

TABLENAME, NAME, @"张三"];  

    [self execSql:sdeleteSql];  

}  

上面实现了表内容的增、改、删,下面实现表内容查询。

[cpp] view plain copy

-(void) selectData{  


    [self openDB];  

    NSString *sqlQuery = [NSString stringWithFormat:  

@"SELECT * FROM %@",TABLENAME];  

    sqlite3_stmt * statement;  


if (sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK) {  


//查询结果集中一条一条的遍历所有的记录,这里的数字对应的是列值,注意这里的列值  


while (sqlite3_step(statement) == SQLITE_ROW) {  

char *name = (char*)sqlite3_column_text(statement, 1);  

            NSString *nsNameStr = [[NSString alloc]initWithUTF8String:name];  


int age = sqlite3_column_int(statement, 2);  


char *address = (char*)sqlite3_column_text(statement, 3);  

            NSString *nsAddressStr = [[NSString alloc]initWithUTF8String:address];  


NSLog(@"name:%@  age:%d  address:%@",nsNameStr,age, nsAddressStr);  

        }  

}else{  

NSLog(@"select error:%@",sqlQuery);  


    }  

    sqlite3_close(db);  

}  

好了,这就是全部了,iOS中数据库操作的类封装的并不太好用,希望大家尽量封装自己的类,。

Demo下载

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

推荐阅读更多精彩内容