iOS开发之SQLite3
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 <UIKit/UIKit.h> #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:@"[email protected]" andField3:@"birthday" field3Value:@"12-45-78"]; [self insertRecordIntoTableName:@"members" withField1:@"name" field1Value:@"李2" andField2:@"email" field2Value:@"[email protected]" andField3:@"birthday" field3Value:@"12-45-78"]; [self insertRecordIntoTableName:@"members" withField1:@"name" field1Value:@"李3" andField2:@"email" field2Value:@"[email protected]" 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.附表:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。