SQLiteManager
https://github.com/misato/SQLiteManager4iOS
本人以前从事过嵌入式开发,后来转职为iOS开发,即使如此,也绝不想去碰C语言级别的面向过程的 sqlite3 来操作数据库,做高级语言开发还去折腾面向过程的东西,一个小小的nil没判断好就导致程序崩溃, 这就是 sqlite3 APIs 给你带来的问题,只有封装成面向对象的接口才有可能会去用.有一个封装得挺好的 FMDB 是不二的选择,但这个 SQLiteManager 属于轻量级封装,满足了最最基本的需求,但是,他是在开了ARC的情形下使用的,也就是说,没开ARC后会各种泄露......
上面的链接可以下载源码,我修改了源码,适用于我自己,提供如下:
SQLiteManager.h
#import <Foundation/Foundation.h> #import "sqlite3.h" enum errorCodes { kDBNotExists, kDBFailAtOpen, kDBFailAtCreate, kDBErrorQuery, kDBFailAtClose }; @interface SQLiteManager : NSObject { sqlite3 *db; // The SQLite db reference NSString *databaseName; // The database name } - (id)initWithDatabaseNamed:(NSString *)name; // SQLite Operations - (NSError *) openDatabase; - (NSError *) doQuery:(NSString *)sql; - (NSError *)doUpdateQuery:(NSString *)sql withParams:(NSArray *)params; - (NSArray *) getRowsForQuery:(NSString *)sql; - (NSError *) closeDatabase; - (NSInteger)getLastInsertRowID; - (NSString *)getDatabaseDump; @end
SQLiteManager.m
#import "SQLiteManager.h" #define FOLDER_PATH @"/Library/Caches/YOU_FOLDER_NAME" // Private methods @interface SQLiteManager (Private) - (NSString *)getDatabasePath; - (NSError *)createDBErrorWithDescription:(NSString*)description andCode:(int)code; @end @implementation SQLiteManager #pragma mark Init & Dealloc /** * Init method. * Use this method to initialise the object, instead of just "init". * * @param name the name of the database to manage. * * @return the SQLiteManager object initialised. */ - (id)initWithDatabaseNamed:(NSString *)name; { self = [super init]; if (self != nil) { databaseName = [[NSString alloc] initWithString:name]; db = nil; } return self; } #pragma mark SQLite Operations /** * Open or create a SQLite3 database. * * If the db exists, then is opened and ready to use. If not exists then is created and opened. * * @return nil if everything was ok, an NSError in other case. * */ - (NSError *) openDatabase { NSError *error = nil; NSString *databasePath = [self getDatabasePath]; NSLog(@"%@", databasePath); const char *dbpath = [databasePath UTF8String]; int result = sqlite3_open(dbpath, &db); if (result != SQLITE_OK) { const char *errorMsg = sqlite3_errmsg(db); NSString *errorStr = [NSString stringWithFormat:@"The database could not be opened: %@",[NSString stringWithCString:errorMsg encoding:NSUTF8StringEncoding]]; error = [self createDBErrorWithDescription:errorStr andCode:kDBFailAtOpen]; } return error; } /** * Does an SQL query. * * You should use this method for everything but SELECT statements. * * @param sql the sql statement. * * @return nil if everything was ok, NSError in other case. */ - (NSError *)doQuery:(NSString *)sql { NSError *openError = nil; NSError *errorQuery = nil; //Check if database is open and ready. if (db == nil) { openError = [self openDatabase]; } if (openError == nil) { sqlite3_stmt *statement; const