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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市微王,隨后出現(xiàn)的幾起案子屡限,更是在濱河造成了極大的恐慌,老刑警劉巖炕倘,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钧大,死亡現(xiàn)場離奇詭異,居然都是意外死亡罩旋,警方通過查閱死者的電腦和手機啊央,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門眶诈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人劣挫,你說我怎么就攤上這事册养《В” “怎么了压固?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長靠闭。 經(jīng)常有香客問我帐我,道長,這世上最難降的妖魔是什么愧膀? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任拦键,我火速辦了婚禮,結(jié)果婚禮上檩淋,老公的妹妹穿的比我還像新娘芬为。我一直安慰自己,他們只是感情好蟀悦,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布媚朦。 她就那樣靜靜地躺著,像睡著了一般日戈。 火紅的嫁衣襯著肌膚如雪询张。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天浙炼,我揣著相機與錄音份氧,去河邊找鬼。 笑死弯屈,一個胖子當著我的面吹牛蜗帜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播资厉,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼厅缺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了酌住?” 一聲冷哼從身側(cè)響起店归,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酪我,沒想到半個月后消痛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡都哭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年秩伞,在試婚紗的時候發(fā)現(xiàn)自己被綠了逞带。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡纱新,死狀恐怖展氓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脸爱,我是刑警寧澤遇汞,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站簿废,受9級特大地震影響空入,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜族檬,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一歪赢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧单料,春花似錦埋凯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至藏斩,卻和暖如春躏结,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狰域。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工媳拴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兆览。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓屈溉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親抬探。 傳聞我的和親對象是個殘疾皇子子巾,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容