SQLite3在存储和检索大量数据方面非常有效。它还能进行复杂的聚合,与使用对象执行这些操作相比,获得结果的速度更快。
关于"SQLite"的发音,大多数正式文档将其读为“Ess-Queue-Ell-Light”。
下面我们开始新建一个工程:SQLite3Demo(源码:SQLite3源码)。工程目录如下:
在访问SQLite3时要通过一个过程API,此API提供了很多C函数调用的接口。要使用此API,需要将应用程序链接到一个名为libsqlite3.dylib的动态库。在Xcode4.5版本,添加方法如下图所示(其它版本可百度,or谷歌):
点击上图中Linked Frameworks and Libraries下面的‘+’号,
这里注意别选错了,务必选中libsqlite3.dylib,它是始终指向最新版本的SQLite3库的别名。
先把界面画好(这个很简单,就不上代码了),界面如下:
现在我们来创建一个数据库,在MyViewController.h中添加如下代码:
#import <UIKit/UIKit.h>#import <sqlite3.h>#define kFilename @"data.sqlite3"@interface MyViewController : UIViewController{ sqlite3 *database;}-(NSString *)dataFilePath;@end
在.m文件中添加对应的实现代码(已添加相应的注释):
#import "MyViewController.h"@interface MyViewController ()@end@implementation MyViewController- (void)viewDidLoad{ [super viewDidLoad]; self.view.backgroundColor = [UIColor underPageBackgroundColor]; //打开数据库,若不存在,则创建它,否则打开它。 if (sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK) { sqlite3_close(database); }}-(NSString *)dataFilePath{ /*常量NSDocumentDirectory表明我们正在查到Document目录的路径。 第二个常量NSUserDomainMask表明我们将搜索限制于我们应用程序的沙河。*/ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; return [documentsDirectory stringByAppendingPathComponent:kFilename];}
可以先运行一下,然后去Document目录下,可以看到名为data.sqlite3的文件,表明数据库创建成功。
然后创建一个表Student,Student包含了三个字段:studentId,name,achieve.代码与注释如下:
//创建表 char *errorMsg; //sql语句也可以用c来写,比如-(void)saveData函数中的updata语句,注意比较两者的不同 //sql语句写好后可以把语句复制到数据库中去执行一下,看看写的是否正确。 NSString *createSql = @"create table if not exists Student(studentID integer primary key, name text,achieve text)"; if (sqlite3_exec(database, [createSql UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) { sqlite3_close(database); NSAssert1(0, @"error create table:%s", errorMsg); }
每次登录以后,你需要显示保存的数据,这就需要查询:
//查询 NSString *query = @"select * from Student"; sqlite3_stmt *statement ; if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) { while (sqlite3_step(statement)==SQLITE_ROW) { //注意计数,取值从零开始 NSInteger studentId = sqlite3_column_int(statement, 0); NSString *name = [self char2String:(char *)sqlite3_column_text(statement, 1)] ; NSString *achieve = [self char2String:(char *)sqlite3_column_text(statement, 2)] ; studentIDField.text = [NSString stringWithFormat:@"%d",studentId]; nameField.text = name; achievementField.text = achieve; } }
输入数据:学号20130202,姓名shenjx,成绩125,完成之后点击保存,执行以下保存动作:
-(void)saveData{ char *errorMsg = nil; char *update = "insert or replace into Student(studentId,name,achieve) values(?,?,?)"; sqlite3_stmt *stmt; if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) { //注意计数,绑定参数从1开始计数 sqlite3_bind_int(stmt, 1, [studentIDField.text intValue]); sqlite3_bind_text(stmt, 2, [nameField.text UTF8String], -1, NULL); sqlite3_bind_text(stmt, 3, [achievementField.text UTF8String], -1, NULL); } if (sqlite3_step(stmt) != SQLITE_DONE) { NSAssert1(0, @"error create table:%s", errorMsg); sqlite3_finalize(stmt); } sqlite3_close(database);}
再次运行程序,可以看到数据与上次输入的一致:
存