iOS sqlite 簡單封裝使用

歡迎你們關注個人公衆號,我會按期分享一些我在項目中遇到問題的解決辦法和一些iOS實用的技巧,現階段主要是整理出一些基礎的知識記錄下來
git

文章也會同步更新到個人博客:
ppsheep.comgithub

sqlite幾乎在每一個APP編碼都會涉及到,它是一種輕量級的數據庫,在手機端使用起來極其方便,由於SQLite原生的接口都是使用C寫的,不是特別友好,全部有一個強大庫就出現了FMDB,今天咱們基於FMDB來進行二次封裝sql

項目結構

首先來看一下個人項目結構數據庫

封裝思路

數據層的基本封裝思路是:數組

  • 首先咱們須要一個數據庫管理類,這個管理類主要是管理數據庫文件,由於咱們可能會有不少個數據庫文件,須要這樣一個管理類
  • 一個基礎的BaseDBStore,其中主要是咱們須要執行的一些基本的操做,包括增、刪、改、查,而後每一個模塊須要使用到數據庫的時候,他們有單獨的子模塊,是從Base繼承而來

數據庫管理類的實現代碼:ui

#import 
  
  
  

 
  
  #import "FMDB.h" @interface PPSDBManager : NSObject /** * DB隊列 還能夠定義其餘的數據庫 這裏只是一個示例 */ @property (nonatomic, strong) FMDatabaseQueue *commonQueue; + (PPSDBManager *)sharedInstance; /** 建立數據庫文件 @param userId 傳入用戶id @return 數據庫文件地址 */ + (NSString *)dbPath:(NSString *)userId; @end 

 複製代碼

這裏加入了用戶思想,即每一個用戶是一個數據庫文件,這樣好區分,並且每一個用戶能夠擁有不一樣的數據庫文件,這裏只建立了一個,固然還能夠建立不少個編碼

#import "PPSDBManager.h"

static PPSDBManager *manager;
@implementation PPSDBManager

+(PPSDBManager *)sharedInstance{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSString *userID = @"ppsheep";//隨便寫了一個id
        manager = [[PPSDBManager alloc] initWithUserId:userID];
    });
    return manager;
}


/**
 通常的,若是有用戶的APP,這裏就能夠傳入當前用戶的id 用以區分數據庫
 這裏我就隨便寫了
 @param userId 用戶id
 @return 實例
 */
- (instancetype)initWithUserId:(NSString *)userId{
    if (self = [super init]) {
        NSString *commonQueuePath = [PPSDBManager dbPath:userId];
        self.commonQueue = [FMDatabaseQueue databaseQueueWithPath:commonQueuePath];
    }
    return self;
}


/**
 數據庫文件地址

 @return 地址
 */
+ (NSString *)dbPath: (NSString *)userId{
     NSString *path = [NSString stringWithFormat:@"%@/User/%@/Setting/DB/", NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0], userId];
    if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
        //建立數據庫文件
        NSError *error;
        [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error];
        if (error) {
            NSLog(@"建立數據庫文件失敗:%@",path);
        }
    }
    return [path stringByAppendingString:@"common.sqlite3"];
}

@end複製代碼

BaseStoreatom

#import 
  
  
  

 
  
  #import "PPSDBManager.h" @interface PPSDBBaseStore : NSObject // 數據庫操做隊列(從NADBManager中獲取,默認使用commonQueue) @property (nonatomic, weak) FMDatabaseQueue *dbQueue; /** * 表建立 */ - (BOOL)createTable:(NSString*)tableName withSQL:(NSString*)sqlString; /* * 執行帶數組參數的sql語句 (增,刪,改) */ -(BOOL)excuteSQL:(NSString*)sqlString withArrParameter:(NSArray*)arrParameter; /* * 執行帶字典參數的sql語句 (增,刪,改) */ -(BOOL)excuteSQL:(NSString*)sqlString withDicParameter:(NSDictionary*)dicParameter; /* * 執行格式化的sql語句 (增,刪,改) */ - (BOOL)excuteSQL:(NSString *)sqlString,...; /** * 執行查詢指令 */ - (void)excuteQuerySQL:(NSString*)sqlStr resultBlock:(void (^)(FMResultSet * rsSet))resultBlock; @end 

 複製代碼

Base定義的一些基礎的操做,註釋都寫的很清楚,我就不一一解釋了spa

//查詢語句
- (BOOL)excuteSQL:(NSString *)sqlString,...
{
    __block BOOL ok = NO;
    if (self.dbQueue) {
        va_list args;
        va_list *p_args;
        p_args = &args;
        va_start(args, sqlString);
        [self.dbQueue inDatabase:^(FMDatabase *db) {
            ok = [db executeUpdate:sqlString withVAList:*p_args];
        }];
        va_end(args);
    }
    return ok;
}複製代碼

帶參數的查詢方法:code

- (BOOL)excuteSQL:(NSString *)sqlString withArrParameter:(NSArray *)arrParameter
{
    __block BOOL ok = NO;
    if (self.dbQueue) {
        [self.dbQueue inDatabase:^(FMDatabase *db) {
            ok = [db executeUpdate:sqlString withArgumentsInArray:arrParameter];
        }];
    }
    return ok;
}複製代碼

Base裏面的方法,都是調用FMDB

User模塊

如今,咱們有一個User模塊,須要實現用戶的存取,首先,咱們須要一個裝SQL的文件,分離SQL

PPSDBUserSQL.h

#ifndef PPSDBUserSQL_h
#define PPSDBUserSQL_h



#define     USER_TABLE_NAME              @"user"
/**
 *  建表
 *
 *  @param uid   當前用戶Corp郵箱前綴
 *  @param fid    好友Corp郵箱前綴
 *  @param email   Corp郵箱
 *
 *  @return
 */
#define     SQL_CREATE_USER_TABLE        
            @"CREATE TABLE IF NOT EXISTS %@(\
                    uid TEXT,\
                    name TEXT,\
                    email TEXT,\
                    phoneNum TEXT,\
                    ext1 TEXT,\
                    ext2 TEXT,\
                    ext3 TEXT,\
                    ext4 INTEGER DEFAULT (0),\
                    ext5 INTEGER DEFAULT (0),\
                    ext6 INTEGER DEFAULT (0),\
                    PRIMARY KEY(uid))"

#define     SQL_ADD_USER      @"INSERT OR REPLACE INTO %@ ( uid, name, email, phoneNum, ext1, ext2, ext3, ext4, ext5, ext6) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"

#define     SQL_SELECT_USER   @"SELECT * FROM %@ WHERE uid = '%@'"

#define     SQL_GET_ALL_USER   @"SELECT * FROM %@ "

#define     SQL_DELETE_USER    @"DELETE FROM %@ WHERE uid = '%@'"

#define     SQL_UPDATE_USER    @"UPDATE %@ SET name = ?, email = ?, phoneNum = ? WHERE uid = '%@' "


#endif /* PPSDBUserSQL_h */複製代碼

而後是具體的操做User的Store 包含了基本的

#import "PPSDBBaseStore.h"

@class PPSUser;
@interface PPSDBUserStore : PPSDBBaseStore

//改
- (BOOL)updateUserData:(NSArray *)users;

//增
- (BOOL)addUser:(NSArray *)users;

//查
- (NSMutableArray *)usersByUserIds:(NSArray *)userIds;

//刪
- (BOOL)deleteUserByUid:(NSArray *)userIds;

- (NSArray *)allUsers;

@end複製代碼

批量查詢用戶,傳入id數組

-(NSMutableArray *)usersByUserIds:(NSArray *)userIds{
    NSArray *ids = [userIds copy];
    __block NSMutableArray *data = [[NSMutableArray alloc] init];

    for (NSString *userId in ids) {
      NSString *sqlString = [NSString stringWithFormat:SQL_SELECT_USER, USER_TABLE_NAME, userId];
        [self excuteQuerySQL:sqlString resultBlock:^(FMResultSet *retSet) {
            while ([retSet next]) {
                NSDictionary *dic = @{
                                      @"userId" : [retSet stringForColumn:@"uid"],
                                      @"email" : [retSet stringForColumn:@"email"],
                                      @"name" : [retSet stringForColumn:@"name"],
                                      @"phoneNum" : [retSet stringForColumn:@"phoneNum"],
                                      };
                PPSUser *user = [[PPSUser alloc] initWithDic:dic];
                [data addObject:user];
            }
            [retSet close];
        }];
    }
    return data;
}複製代碼

批量更新用戶,傳入用戶數組

-(BOOL)updateUserData:(NSArray *)users{
    NSArray *userCopy = [users copy];
    BOOL ok = YES;
    for (PPSUser *user in userCopy) {
        NSString *sql = [NSString stringWithFormat:SQL_UPDATE_USER, USER_TABLE_NAME, user.userId];
        NSArray *arrPara = [NSArray arrayWithObjects:
                            PPSNoNilString(user.name),
                            PPSNoNilString(user.email),
                            PPSNoNilString(user.phoneNum),
                            @"", @"", @"", @0, @0, @0,  nil];
        ok = [self excuteSQL:sql withArrParameter:arrPara];
    }
    return ok;
}複製代碼

使用

爲了方便,我就直接在ViewController中寫了,在真正的開發中,通常都會在管理類中進行數據庫操做

懶加載一個用戶數據庫

-(PPSDBUserStore *)store{
    if (!_store) {
        _store = [[PPSDBUserStore alloc] init];
    }
    return _store;
}複製代碼

初始化用戶,直接插入

- (void)initUsers{
    NSMutableArray *arr = [NSMutableArray array];
    for (int i=0; i<10; i++)="" {="" ppsuser="" *user="[[PPSUser" alloc]="" init];="" user.userid="[NSString" stringwithformat:@"%ld_userid",(long)i];="" user.name="[NSString" stringwithformat:@"%ld_username",(long)i];="" user.email="[NSString" stringwithformat:@"%ld_email",(long)i];="" user.phonenum="[NSString" stringwithformat:@"%ld_phonenum",(long)i];="" [arr="" addobject:user];="" }="" [self.store="" adduser:arr];="" }<="" code="">
  
  
  

 複製代碼

我就再也不貼代碼出來了,項目工程,我放在了

github.com/yangqian111…

相關文章
相關標籤/搜索