FMDB iphone數據庫

FMDB提供了用Objective-c封裝的訪問sqlite3的方法,避免了在用Objective-c編程中夾雜C風格的代碼(不是說不能使用,而是夾雜在一塊代碼風格不一致)。
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章