iPhone里面内置了sqlite3数据库,因此我们可以使用sqlite3来存储数据。
在Mac终端创建数据库:

这样就创建了一个名为test.sqlite的数据库。

接着我们创建一张stu表:

 

下面介绍以代码方式操纵数据库的步骤:
1.打开数据库。
2.创建sql语句。
3.将sql语句转化为sqlite能识别的语句。
4.执行语句。
5.销毁语句。
6.关闭数据库。

 

准备工作:在Xcode中创建一个项目,并把上面创建的数据库test.sqlite复制到项目中,添加libsqlite3.0.dylib这个FrameWork。
创建一个实体类(与数据库中的表对应)Student。

 Student.h
1
#import <Foundation/Foundation.h> 2 3 @interface Student : NSObject 4 5 @property (nonatomic, retain) NSString *name; 6 @property (nonatomic) int age; 7 8 - (id)initWithName:(NSString *)name age:(int)age; 9 10 @end
 Student.m
1
#import "Student.h" 2 3 @implementation Student 4 5 @synthesize name = _name; 6 @synthesize age = _age; 7 8 - (id)initWithName:(NSString *)name age:(int)age 9 { 10 if ((self = [super init])) { 11 self.name = name; 12 self.age = age; 13 } 14 return self; 15 } 16 17 - (void)dealloc 18 { 19 [self.name release]; 20 self.name = nil; 21 [super dealloc]; 22 } 23 24 @end

 

创建一个用于操作数据库的类DBUtil:

 DBUtil.h
1
#import <Foundation/Foundation.h> 2 #import <sqlite3.h> 3 #import "Student.h" 4 5 @interface DBUtil : NSObject { 6 sqlite3 *database; 7 } 8 9 + (id)getInstance; //获得该类的一个实例 10 - (NSArray *)queryAllStudent; //查询stu表的所有学生信息 11 - (void)insertAStudent:(Student *)stu; //插入一个学生信息 12 13 @end
 DBUtil.m
1
#import "DBUtil.h" 2 3 #define DATABASE @"test" 4 #define TYPE @"sqlite" 5 #define TABLE @"stu" 6 7 @implementation DBUtil 8 9 static DBUtil *_dbUtil = nil; 10 11 + (id)getInstance 12 { 13 if (_dbUtil == nil) { 14 _dbUtil = [[DBUtil alloc] init]; 15 } 16 return _dbUtil; 17 } 18 19 #pragma mark - Lifecycle 20 21 - (id)init 22 { 23 if ((self = [super init])) { 24 //获得数据库的路径 25 NSString *path = [[NSBundle mainBundle] pathForResource:DATABASE ofType:TYPE]; 26 //打开数据库,打开失败则输出错误信息 27 if (sqlite3_open([path UTF8String], &database) != SQLITE_OK) { 28 NSLog(@"failed to open database"); 29 } 30 } 31 return self; 32 } 33 34 - (void)dealloc 35 { 36 //关闭数据库 37 sqlite3_close(database); 38 [super init]; 39 } 40 41 #pragma mark - Database Operations 42 43 - (NSArray *)queryAllStudent 44 { 45 NSMutableArray *result = nil; 46 47 //sql语句 48 NSString *sql = [NSString stringWithFormat:@"select * from %@", TABLE]; 49 50 sqlite3_stmt *statement; 51 //将sql语句转化为数据库能识别的语句 52 if (sqlite3_prepare_v2(database, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) { 53 54 result = [[[NSMutableArray alloc] init] autorelease]; 55 56 //执行sql语句 57 while (sqlite3_step(statement) == SQLITE_ROW) { 58 char *nameChars = (char *)sqlite3_column_text(statement, 1); 59 int age = sqlite3_column_int(statement, 2); 60 NSString *name = [NSString stringWithUTF8String:nameChars]; 61 Student *student = [[Student alloc] initWithName:name age:age]; 62 63 [result addObject:student]; 64 65 [student release]; 66 } 67 } 68 //销毁statement 69 sqlite3_finalize(statement); 70 71 return result; 72 } 73 74 - (void)insertAStudent:(Student *)stu 75 { 76 //sql语句,使用占位符 77 NSString *sql = [NSString stringWithFormat:@"insert into %@ values(?, ?)", TABLE]; 78 79 sqlite3_stmt *statement; 80 //将sql语句转化为数据库能识别的语句 81 if (sqlite3_prepare_v2(database, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) { 82 //绑定占位符 83 sqlite3_bind_text(statement, 0, [stu.name UTF8String], -1, nil); 84 sqlite3_bind_int(statement, 1, stu.age); 85 86 //执行语句,失败时输出错误信息 87 if (sqlite3_step(statement) != SQLITE_OK) { 88 NSLog(@"failed to insert data"); 89 } 90 } 91 //销毁statement 92 sqlite3_finalize(statement); 93 } 94 95 @end

在类初始化时调用sqlite_open函数打开数据库,在类实例被销毁时调用sqlite3_close函数关闭数据库。

在- (NSArray *)queryAllStudent方法中可以看到,操作数据库的一般步骤是:
1.创建sql语句。
2.将sql语句转化为sqlite能识别的语句。
3.执行语句。
4.销毁语句。

 

测试程序:

 1 //创建两个Student实例
 2     Student *stu1 = [[Student alloc] initWithName:@"xiaoming" age:10];
 3     Student *stu2 = [[Student alloc] initWithName:@"xiaohong" age:9];
 4     
 5     //得到一个DBUtil的实例
 6     DBUtil *dbUtil = [DBUtil getInstance];
 7     //向表中插入stu1,stu2
 8     [dbUtil insertAStudent:stu1];
 9     [dbUtil insertAStudent:stu2];
10     
11     [stu1 release];
12     [stu2 release];
13     
14     //查询表记录
15     NSArray *stuInfos = [dbUtil queryAllStudent];
16     for (Student *stu in stuInfos) {
17         NSLog(@"name:%@  age:%d", stu.name, stu.age);
18     }

 

运行结果:

 

注意:该项目的数据库存储在main bundle中,这意味着我们的数据库是readonly。但本例中我们还是可以往数据库的表中插入记录,是因为这个项目是在虚拟机上运行的,真机上是不允许修改bundle里面的文件的。我们可以先把数据库从bundle中拷贝到程序的Document文件夹中,然后再对数据库进行操作。