FMDB提供了用Objective-c封装的访问sqlite3的方法,避免了在用Objective-c编程中夹杂C风格的代码(不是说不能使用,而是夹杂在一块代码风格不一致)。
https://github.com/ccgus/fmdb
https://github.com/ccgus/fmdb
#import "FMDatabase.h"
#import "FMDatabaseAdditions.h"
@class FMDatabase;
@interface SqliteInterface : NSObject {
NSString *dbRealPath;
FMDatabase *dbo;
}
@property (nonatomic, retain) NSString *dbRealPath;
@property (nonatomic, retain) FMDatabase *dbo;
+ (SqliteInterface *)sharedSqliteInterface;
- (void) connectDB;
- (void) closeDB;
- (void) setupDB : (NSString *)dbFileName;
@end
/
SqliteInterface.m
#import "SqliteInterface.h"
#import "CommonDefines.h"
@implementation SqliteInterface
@synthesize dbRealPath, dbo;
static SqliteInterface *sharedSqliteInterface;
+ (SqliteInterface *)sharedSqliteInterface
{
if (!sharedSqliteInterface) {
sharedSqliteInterface = [[SqliteInterface alloc] init];
}
return sharedSqliteInterface;
}
- (void) connectDB
{
if (dbo == nil) {
dbo = [[FMDatabase alloc] initWithPath:dbRealPath];
if (! [dbo open]) {
NSLog(@"Could not open database.");
}
}else {
NSLog(@"Database has already opened.");
}
}
- (void) closeDB
{
[dbo close];
BR_RELEASE(dbo);
}
- (void) setupDB:(NSString *)dbFileName
{
if (dbFileName == nil) {
return;
}
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *err;
dbRealPath = [documentsPath stringByAppendingString:[NSString stringWithFormat:@"/%@",dbFileName]];
if (![fileManager fileExistsAtPath:dbRealPath]) {
NSString *dbSrcPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:dbFileName];
BOOL copySuccess = [fileManager copyItemAtPath:dbSrcPath toPath:dbRealPath error:&err];
if (!copySuccess) {
NSLog(@"Failed to copy database '%@'.", [err localizedDescription]);
}
}
NSLog(@"dbRealPath:%@",dbRealPath);
}
@end
AppDelege.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[[SqliteInterface sharedSqliteInterface] setupDB: @"xxxxx.sqlite"];
[[SqliteInterface sharedSqliteInterface] connectDB];
}
///
最后,记得加入libsqlite3.dylib。然后加入对应的object和Model来对数据库操作。
#import "MarkedPageModel.h"
#import "SqliteInterface.h"
#import "CommonDefines.h"
@implementation MarkedPageModel
- (NSMutableArray *)getMarkedPages
{
FMDatabase *dbo = [SqliteInterface sharedSqliteInterface].dbo;
NSMutableArray *resultArray = nil;
NSString *selectSql = @"SELECT * FROM markedPage";
FMResultSet *rs = [dbo executeQuery:selectSql];
while ([rs next]) {
if (resultArray == nil) {
resultArray = [[[NSMutableArray alloc] init] autorelease];
}
MarkedPageObject *markedPageObject = [[MarkedPageObject alloc] init];
markedPageObject.markedPage = [rs intForColumn:@"markedPage"];
markedPageObject.markedTime = [rs stringForColumn:@"markedTime"];
markedPageObject.isMarked = [rs boolForColumn:@"isMarked"];
[resultArray addObject:markedPageObject];
BR_RELEASE(markedPageObject);
}
[rs close];
return resultArray;
}
- (BOOL)AddMarkedPage:(int)page
MarkedTime:(NSString *)time
isMarked: (BOOL)marked
{
FMDatabase *dbo = [SqliteInterface sharedSqliteInterface].dbo;
NSString *selectSql = @"INSERT INTO markedPage (markedPage,markedTime,isMarked) VALUES (?,?,?)";
return [dbo executeUpdate:selectSql
withArgumentsInArray:[NSArray arrayWithObjects:
[NSNumber numberWithInt:page], time, [NSNumber numberWithBool:marked],nil]];
}
- (BOOL)deleteMarkedPage:(int)page
{
FMDatabase *dbo = [[SqliteInterface sharedSqliteInterface] dbo];
NSString *deleteSql = @"DELETE FROM markedPage WHERE markedPage = ?";
return [dbo executeUpdate:deleteSql withArgumentsInArray:[NSArray arrayWithObjects:
[NSNumber numberWithInt:page], nil]];
}
@end