IOS自定義類實現(xiàn)數(shù)據(jù)庫操作

在iOS開發(fā)的過程中,偶爾接觸到的小項目用到了數(shù)據(jù)庫,所以就利用fmdb這個第三方的框架來進行操作數(shù)據(jù),但是用過fmdb的知道,里面的數(shù)據(jù)庫操作語句比較繁瑣,在不借助對fmdb進行二次封裝的第三方庫的幫助下,我們操作這些數(shù)據(jù)非常的麻煩,所以針對于我自己做的項目,我就封裝了一個小的類,來實現(xiàn)對數(shù)據(jù)庫的簡單操作,也算是ios開發(fā)中的筆記。
話不多說,上文章。

1.導入FMDB第三方的庫

2.利用GCD創(chuàng)建存儲數(shù)據(jù)的單例類

  • 利用復合類聲明單例類的變量
    static SaveData *_data;
  • 利用GCD創(chuàng)建單例
    //自定義類方法
    +(instancetype)shareSaveData
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{

            _data = [[self alloc] init];
    });

        return _data;
    }
    //重寫系統(tǒng)的alloc方法
    +(instancetype)allocWithZone:(struct _NSZone *)zone
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _data = [super allocWithZone:zone];
        });
        return  _data;
    }

3.OC中的initialize方法創(chuàng)建數(shù)據(jù)庫

  • 這個方法是在程序運行一開始就被調(diào)用的方法,我們可以利用他們在類被使用前,做一些預處理工作
    //我們在這個方法里進行數(shù)據(jù)庫的創(chuàng)建
     + (void)initialize
    {
        NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"ArtData.db"];

        _db =[ FMDatabase databaseWithPath:path];
        if(![_db open])
        {
            return;
        }
    }

4.自定義數(shù)據(jù)庫表的增刪改查方法

表的創(chuàng)建方法

  • 自定義方法有三個參數(shù):模型、表名、和字典數(shù)組
  • 利用runtime遍歷出模型中的屬性,然后利用字符串的方法,拼接出創(chuàng)建表所需要的字符串
    #pragma mark - 截取字符串

    -(NSString *)getStr:(NSMutableString *)str
    {
        NSRange range = NSMakeRange(str.length - 1, 1);

        [str deleteCharactersInRange:range];

        return str;
    }

    #截取出所需要的串接下來就可以進行創(chuàng)建表格的操作了

    -(void)CreatTable:(id)model AndTableName:(NSString     *)tableName AndArr:(NSArray *)arr
    {
        if([arr count] == 0)
        {
            NSDictionary *dic = [self modelToString:model];
            // 創(chuàng)表
            [_db executeUpdate:[NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@(%@)",tableName,dic[@"creatName"]]];
        }
        else
        {
            for(int i = 0; i < [arr count]; i++)
            {

                NSDictionary *dic = [self modelToString:model];
                // 創(chuàng)表
                [_db executeUpdate:[NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@(%@)",tableName,dic[@"creatName"]]];
            }
        }
    }
    ```
>表數(shù)據(jù)的插入
- 自定義方法有三個參數(shù):**模型**、**表名**、**和字典數(shù)組**
- 利用runtime遍歷出模型中的屬性,然后利用屬性取出屬性的值然后就利用拼串和字典 來實現(xiàn)表的插入語句

```objc
-(void)InsertDataIntoTable:(id)model AndTableName:(NSString *)tableName AndArr:(NSArray *)arr
{
    NSMutableArray *valueArray  = [NSMutableArray array];

    for(int i = 0; i < [arr count]; i++)
    {
        id dic = arr[i];

        if(![dic isKindOfClass:[NSDictionary class]])
        {
            continue;
        }

        unsigned int length = 0;

        objc_property_t *pro = class_copyPropertyList([model class], &length);

        for(int j = 0; j < length; j++)
        {
            objc_property_t name = pro[j];

            NSString *keyStr = [NSString stringWithCString:property_getName(name) encoding:NSUTF8StringEncoding];

            id value = dic[keyStr];


            [valueArray addObject:value];

        }

        NSDictionary *tabledic = [self modelToString:model];

        NSString *insertStr = [NSString stringWithFormat:@"INSERT INTO %@(%@) VALUES(%@)", tableName,tabledic[@"insertName"],tabledic[@"quer"]];

        [_db executeUpdate:insertStr withArgumentsInArray:valueArray];

        //清除數(shù)組
        [valueArray removeAllObjects];
    }
}

查詢數(shù)據(jù)

  • 需要模型 和 表名
//查詢數(shù)據(jù)
-(NSMutableArray *)QuertyDataFromTable:(id)model AndTableName:(NSString *)tableName
{

    NSMutableArray *setArray = [NSMutableArray array];
    // 查詢數(shù)據(jù)
    FMResultSet *set = [_db executeQuery:[NSString stringWithFormat:@"SELECT * FROM %@",tableName]];


    while ([set next])
    {
        [setArray addObject:[set resultDictionary]];
    }
    return setArray;
}

刪除操作

//刪除制定表中的數(shù)據(jù)
-(void)deleteTable:(NSString *)tableStr
{
    [_db executeUpdate:[@"DELETE FROM " stringByAppendingString:tableStr]];

}

最后的是拼串時候所做的操作


//模型轉(zhuǎn)字符串
-(NSDictionary *)modelToString:(id)model
{

    //建立表的時候的字符串
    NSMutableString *creatName = [NSMutableString string];

    //插入數(shù)據(jù)時候的字符串
    NSMutableString *insertName = [NSMutableString string];

    //插入時候的問號
    NSMutableString *quer = [NSMutableString string];


    //利用runtime遍歷表格
    unsigned int count;
    objc_property_t *pro = class_copyPropertyList([model class], &count);


    for(int i = 0; i < count; i++)
    {
        objc_property_t name = pro[i];

        NSString *keyStr = [NSString stringWithCString:property_getName(name) encoding:NSUTF8StringEncoding];

        [creatName appendString:[keyStr stringByAppendingString:@" text,"]];

        [insertName appendString:[keyStr stringByAppendingString:@","]];

        [quer appendString:@"?,"];

    }

    //拼接去除字符串最后一位
    [self getStr:creatName];
    [self getStr:insertName];
    [self getStr:quer];

    NSDictionary *dic = @{
                          @"creatName":creatName,
                          @"insertName":insertName,
                          @"quer":quer
                          };

    return dic;
}


#pragma mark - 截取字符串
-(NSString *)getStr:(NSMutableString *)str
{

    NSRange range = NSMakeRange(str.length - 1, 1);

    [str deleteCharactersInRange:range];

    return str;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容