如果想在ios本地存储复杂的数据结构,sqlite是不错的选择。 使用sqlite,首先需要在项目中引入类库libsqlite3 引入之后,开始写dao类,操作数据库,下面是代码示例: dao.h
(void)createEditableCopyOfDatabaseIfNeeded;//插入菜肴的方法- (int) create: (Cai *)model;//删除菜肴的方法- (int) remove: (Cai *)model;//修改菜肴的方法//- (int) modify: (Cai *)model;//查询所有数据的方法- (NSMutableArray *) findAll;//按照分类id查询数据的方法- (NSMutableArray *) findByClassId: (Cai *)model;@end
dao.m文件
#import "CaiDao.h"@implementation CaiDaostatic CaiDao *sharedManager = nil;+ (CaiDao*)sharedManager{ static dispatch_once_t once; dispatch_once(&once, ^{ sharedManager = [[self alloc] init]; [sharedManager createEditableCopyOfDatabaseIfNeeded]; }); return sharedManager;}- (NSString *)applicationDocumentsDirectoryFile{ NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *path = [documentDirectory stringByAppendingPathComponent:DBFILE_NAME]; return path;}- (void)createEditableCopyOfDatabaseIfNeeded { NSString *writableDBPath = [self applicationDocumentsDirectoryFile]; if (sqlite3_open([writableDBPath UTF8String], &db) != SQLITE_OK){ sqlite3_close(db); NSAssert(NO, @"数据库打开失败..."); } else{ char *err; NSString *createSQL = [NSString stringWithFormat:@"create table if not exists Cai (id text primary key, foodName text, classId text);"]; if(sqlite3_exec(db, [createSQL UTF8String], nil, nil, &err) != SQLITE_OK){ sqlite3_close(db); NSAssert(NO, @"建表失败, %s", err); } sqlite3_close(db); }}//插入菜肴-(int) create:(Cai *)model{ NSString *path = [self applicationDocumentsDirectoryFile]; if (sqlite3_open([path UTF8String], &db) != SQLITE_OK) { sqlite3_close(db); NSAssert(NO,@"数据库打开失败。"); } else { NSString *sqlStr = @"INSERT OR REPLACE INTO cai (id, foodName, classId) VALUES (?,?,?)"; sqlite3_stmt *statement; //预处理过程 if (sqlite3_prepare_v2(db, [sqlStr UTF8String], -1, &statement, nil) == SQLITE_OK) { //绑定参数开始 sqlite3_bind_text(statement, 1, [model.id UTF8String], -1, nil); sqlite3_bind_text(statement, 2, [model.foodName UTF8String], -1, nil); sqlite3_bind_text(statement, 3, [model.classId UTF8String], -1, nil); //执行插入 if (sqlite3_step(statement) != SQLITE_DONE) { NSAssert(NO, @"插入数据失败。"); } }else { NSAssert1(0,@"Error:%s",sqlite3_errmsg(db)); } sqlite3_finalize(statement); sqlite3_close(db); } return 0;}//根据菜肴种类id查询菜肴列表- (NSMutableArray *) findByClassId:(Cai *)model{ NSString *path = [self applicationDocumentsDirectoryFile]; NSMutableArray *listData = [[NSMutableArray alloc] init]; if (sqlite3_open([path UTF8String], &db) != SQLITE_OK){ sqlite3_close(db); NSAssert(NO, @"数据库打开失败..."); } else{ NSString *qsql = @"select id, foodName, classId from cai where classId = ?"; sqlite3_stmt * statement; //预处理过程 if(sqlite3_prepare_v2(db, [qsql UTF8String], -1, &statement, nil) == SQLITE_OK){ //准备参数 NSString *classid = model.classId; //绑定参数开始 sqlite3_bind_text(statement, 1, [classid UTF8String], -1, nil); //执行 while (sqlite3_step(statement) == SQLITE_ROW){ char *cai_id = (char *) sqlite3_column_text(statement, 0); NSString *caiId = [[NSString alloc] initWithUTF8String:cai_id]; char *food_name = (char *) sqlite3_column_text(statement, 1); NSString *foodName = [[NSString alloc] initWithUTF8String:food_name]; char *class_id = (char *) sqlite3_column_text(statement, 2); NSString *classId = [[NSString alloc] initWithUTF8String:class_id]; Cai *cai = [[Cai alloc] init]; cai.id = caiId; cai.foodName = foodName; cai.classId = classId; [listData addObject:cai]; } } sqlite3_finalize(statement); sqlite3_close(db); } return listData;}//查询所有菜肴列表- (NSMutableArray *) findAll{ NSString *path = [self applicationDocumentsDirectoryFile]; NSMutableArray *listData = [[NSMutableArray alloc] init]; if (sqlite3_open([path UTF8String], &db) != SQLITE_OK){ sqlite3_close(db); NSAssert(NO, @"数据库打开失败..."); } else{ NSString *qsql = @"select id, foodName, classId from cai"; sqlite3_stmt * statement; //预处理过程 if(sqlite3_prepare_v2(db, [qsql UTF8String], -1, &statement, nil) == SQLITE_OK){ //执行 while (sqlite3_step(statement) == SQLITE_ROW){ char *cai_id = (char *) sqlite3_column_text(statement, 0); NSString *caiId = [[NSString alloc] initWithUTF8String:cai_id]; char *food_name = (char *) sqlite3_column_text(statement, 1); NSString *foodName = [[NSString alloc] initWithUTF8String:food_name]; char *class_id = (char *) sqlite3_column_text(statement, 2); NSString *classId = [[NSString alloc] initWithUTF8String:class_id]; Cai *cai = [[Cai alloc] init]; cai.id = caiId; cai.foodName = foodName; cai.classId = classId; [listData addObject:cai]; } } sqlite3_finalize(statement); sqlite3_close(db); } return listData;}@end
其中用到的model Cai类:
#import@interface Cai : NSObject@property NSString *id;@property NSString *foodName;@property NSString *classId;@property NSString *price;@property NSString *foodPinyin;@property NSString *sujima;@end
在需要插入数据或者取出数据的地方这样写:
CaiDao *dao = [CaiDao sharedManager]; Cai *cai = [[Cai alloc] init]; cai.id = @"111"; cai.foodName = @"红烧排骨"; cai.classId = @"recai"; [dao create:cai]; NSMutableArray *array = [dao findAll]; for(Cai *c in array) { [[[Utils alloc] init] showAlert:c.foodName :self]; }
大功告成!