博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发之SQLite3
阅读量:6220 次
发布时间:2019-06-21

本文共 4941 字,大约阅读时间需要 16 分钟。

hot3.png

SQLite3是一款开源的嵌入式关系型数据库,可移植性好、易使用、内存开销小

SQLite3是无类型的,意味着可以保存任何类型的数据到任意表的任意字段中。比如下列的创表语句是合法的:
CREATE TABLE t_person(name, age);
为了保证可读性,建议还是把字段类型加上:
CREATE TABLE t_person(name text, age integer);
SQLite3常用的5种数据类型:text、integer、float、boolean、blob
在iOS中要使用SQLite3,需要添加库文件:libsqlite3.dylib并导入主头文件,这是一个C语言的库

 
 
创建数据库(sqlite3_opendb)单步执行操作(sqlite3_exec)创建数据表数据操作插入数据更新数据删除数据查询操作sqlite3_prepare_v2检查sql的合法性sqlite3_step逐行获取查询结果sqlite3_coloum_xxx获取对应类型的内容sqlite3_finalize释放stmt
在Firefox中打开sqlite3(如果没有,选择工具->附加组件,添加即可)新建sqlite3数据库,Contacts,建立一个members表,字段 id,integer,主键,自增;name,varchar;email,varchar,null;birthday,datetime,null。向表中添加一些数据:
二、新建Empty Appliation,添加一个HomeViewController,和一个组件libsqlite3.dylib,来支持对sqlite3的连接,关闭,增删改查等操作。1. HomeViewController.h代码:#import 
#import "sqlite3.h"@interface HomeViewController : UIViewController{ //声明一个sqlite3数据库
sqlite3 *db;
}
//数据库文件的路径。一般在沙箱的Documents里边操作 - (NSString *)filePath;
@end 2. HomeViewController.m代码: #import "HomeViewController.h"@interface HomeViewController ()@end@implementation HomeViewController//该方法用于返回数据库在Documents文件夹中的全路径信息 - (NSString *)filePath{    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    NSString *documentsDir = [paths objectAtIndex:0];    return [documentsDir stringByAppendingPathComponent:@"Contacts.sqlite"];}//打开数据库的方法 - (void)openDB{    if (sqlite3_open([[self filePath] UTF8String], &db) != SQLITE_OK) {        sqlite3_close(db);        NSAssert(0, @"数据库打开失败。");    }}//插入数据方法- (void)insertRecordIntoTableName:(NSString *)tableName                       withField1:(NSString *)field1 field1Value:(NSString *)field1Value                        andField2:(NSString *)field2 field2Value:(NSString *)field2Value                        andField3:(NSString *)field3 field3Value:(NSString *)field3Value{/*方法1:经典方法    NSString *sql = [NSString stringWithFormat:@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES('%@', '%@', '%@')", tableName, field1, field2, field3, field1Value, field2Value, field3Value];    char *err;    if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {        sqlite3_close(db);        NSAssert(0, @"插入数据错误!");    }    */   //方法2:变量的绑定方法      NSString *sql = [NSString stringWithFormat:@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES (?, ?, ?)",tableName, field1, field2, field3];        sqlite3_stmt *statement;        if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) {        sqlite3_bind_text(statement, 1, [field1Value UTF8String], -1,NULL);        sqlite3_bind_text(statement, 2, [field2Value UTF8String], -1,NULL);        sqlite3_bind_text(statement, 3, [field3Value UTF8String], -1,NULL);    }    if (sqlite3_step(statement) != SQLITE_DONE) {        NSAssert(0, @"插入数据失败!");        sqlite3_finalize(statement);    }                                } //查询数据- (void)getAllContacts{    NSString *sql = @"SELECT * FROM members";    sqlite3_stmt *statement;        if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) {        while (sqlite3_step(statement) == SQLITE_ROW) {                        char *name = (char *)sqlite3_column_text(statement, 0);            NSString *nameStr = [[NSString alloc] initWithUTF8String:name];                        char *email = (char *)sqlite3_column_text(statement, 1);            NSString *emailStr = [[NSString alloc] initWithUTF8String:email];                        char *birthday = (char *)sqlite3_column_text(statement, 2);            NSString *birthdayStr = [[NSString alloc] initWithUTF8String:birthday];                        NSString *info = [[NSString alloc] initWithFormat:@"%@ - %@ - %@",                              nameStr, emailStr, birthdayStr];                        NSLog(info);                        [nameStr release];            [emailStr release];            [birthdayStr release];            [info release];        }        sqlite3_finalize(statement);    }}- (void)viewDidLoad{    [self openDB];       [self insertRecordIntoTableName:@"members" withField1:@"name" field1Value:@"李1" andField2:@"email" field2Value:@"df@qq.com" andField3:@"birthday" field3Value:@"12-45-78"];        [self insertRecordIntoTableName:@"members" withField1:@"name" field1Value:@"李2" andField2:@"email" field2Value:@"df@qq.com" andField3:@"birthday" field3Value:@"12-45-78"];        [self insertRecordIntoTableName:@"members" withField1:@"name" field1Value:@"李3" andField2:@"email" field2Value:@"df@qq.com" andField3:@"birthday" field3Value:@"12-45-78"];                [self getAllContacts];        sqlite3_close(db);        [super viewDidLoad];}@end插入数据后的效果:
查询的效果:

三、小结:

  1.数据查询:sqlite3_exec()函数执行sql语句,在没有返回值的情况下(比如创建表格、插入记录、删除记录等操作中)很好用。

                 也会用到sqlite3_stat结构、sqlite3_prepare_v2()函数、sqlte3_step()函数和sqlite3_finalize()函数。

       查询分三个阶段:准备阶段:sqlite3_stat、sqlite3_prepare_v2()

     执行阶段:sqlte3_step()

     终止阶段: sqlite3_finalize()

2.附表:

转载于:https://my.oschina.net/khakiloveyty/blog/398901

你可能感兴趣的文章
Java一次性查询几十万 几百万数据解决办法
查看>>
Windows 10 RTM版已正式结束官方支持
查看>>
近两年大数据运用在地产领域增长率达38%
查看>>
超过6000台Redis数据库被恶意程序感染
查看>>
《PostgreSQL服务器编程》一一2.2 开发者的可用性
查看>>
通过增加代码覆盖率提高单元测试的质量
查看>>
大数据时代新闻生产的新变分析
查看>>
国家电网公司使用OpenStack降低IT成本 避免被厂商锁定
查看>>
性能测试流程各阶段的工作
查看>>
美国国家情报总监手机和个人电邮被黑
查看>>
遂宁让“智慧城市”融入绿色经济发张
查看>>
智慧城市发展物流产业仓储机器人推动力
查看>>
淘宝bug管理系统
查看>>
重新配置OpenFire数据库
查看>>
《高性能科学与工程计算》——1.6 向量处理器
查看>>
《高可用架构·中国初创故事(第3期)》一1.3 不愿透露信息
查看>>
《NX-OS与Cisco Nexus交换技术:下一代数据中心架构(第2版)》一导读
查看>>
《超越平凡的平面设计:怎样做好版式(第1卷)》—第1章1.1节 如何设计新闻简报...
查看>>
安卓应用漏洞检查工具 QARK
查看>>
《MATLAB/Simulink系统仿真超级学习手册》——1.2 MATLAB简介
查看>>