在ios使用sqlite的救赎 - FMDB
最近有个项目需要小型资料库,当然首选一定是iOS内建的sqlite,但是因为他是C的lib,使用上是出了名的困难。之前就有听说用sqlite可以使用FMDB这个objective-c wrapper library。果不其然的简单易用,我马上把我使用经验跟大家分享,如果你想马上体验,也可以去抓我的Sample project - MySqlite。
安装FMDB
方法很简单,就跟所有的open source library一样的叁步骤。
1. 首先你要先把 libsqlite3.dylib 加进library
2. 在需要用到FMDB的档案中#import "FMDatabase.h"
3. 把FMDB的.h跟.m加进你的project中
接着就可以开心的使用FMDB
产生Database
基本上就是透过+[FMDatabase databaseWithPath]取产生Database instance。
NSURL *appUrl = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];NSString *dbPath = [[appUrl path] stringByAppendingPathComponent:@"MyDatabase.db"]; FMDatabase* db = [FMDatabase databaseWithPath:dbPath];if (![db open]) { NSLog(@"Could not open db"); }
产生所需table
其实写过sql的应该对接下来的动作都不陌生,都一样就是sql语法啰,详细的请参考sqlite文件
下面的动作是产生一个user的table,并且有uid, name, descritpion叁个column。我们使用IF NOT EXISTS来保证table不存在才会产生table。
if(![db executeUpdate:@"CREATE TABLE IF NOT EXISTS user (uid integer primary key asc autoincrement, name text, description text)"]){ NSLog(@"Could not create table: %@", [db lastErrorMessage]);}
新增record
在FMDB中,它有提供很贴心类似-[NSString stringWithFormat:...]的功能,但是比较不一样的是如果你是字串,它会帮你加上括号,使用上更为便利。
if(![db executeUpdate:@"INSERT INTO user (name, description) VALUES (?,?)", name, description]){ NSLog(@"Could not insert data: %@", [db lastErrorMessage]);}
删除record
一样是下sql语法,这边比较需要注意的是如果你要传进去的是int, double这种基本形态,记得要转换成物件,也就是用+[NSNumber numberWithInt]去转换
if(![_db executeUpdate:@"DELETE FROM user WHERE uid = ?", [NSNumber numberWithInt:uid]]){ NSLog(@"Could not delete data: %@", [db lastErrorMessage]);}
查询资料
在FMDB中有提供另外一个class FMResultSet来存放查询出来的records,透过-[FMResultSet next]来iterate出所有的record
NSMutableArray* items = [NSMutableArray arrayWithCapacity:0];FMResultSet *rs = [db executeQuery:@"SELECT uid, name, description from user"];while ([rs next]) { int uid = [rs intForColumn:@"uid"]; NSString *name = [rs stringForColumn:@"name"]; NSString *description = [rs stringForColumn:@"description"]; [items addObject:[NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:uid], @"uid", name, @"name", description, @"description", nil]];}[rs close];
基本上在其他oo平台中有用过sql的,对于FMDB的设计应该并不陌生,可以说完全不会有太多的困难。而相较于用传统的plist或是archive的方法,我相信不管是效能上或是功能上,Sqlite+FMDB的组合绝对会更有优势。对于中型以上的iOS程式应该会是标准配备。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
