FMDB 根據(jù)表名獲取對應的列名是否存在

為什么要寫這個簡單的文章:

  1. 我的表已經(jīng)創(chuàng)建好了荠耽,而我又執(zhí)行了一個 增加列字段的操作态坦,所以這個是更新數(shù)據(jù)庫需要的梅尤,按道理來說應當檢測一下字段是否存在蜒滩。
  2. 更新字段腳本我們更新過一次就不能執(zhí)行第二次了,隨不起眼沼瘫,但是會影響數(shù)據(jù)庫操作抬纸。
  3. 所以執(zhí)行自動更新字段的操作前我們還是有必要先預判一下該字段是否存在,然后在進行是否執(zhí)行更新操作耿戚,這個相對來說更合理一些湿故。

咨詢了一部分人,都說是膜蛔,根據(jù)表名進行字段模糊查詢坛猪,經(jīng)過測試之后,發(fā)現(xiàn)并不是很如意皂股,我就查了一些FMDB里面的代碼 確實有一些方法是可以間接獲取對應的Key值的墅茉。

更新表中的某個字段sql 語句(省的小伙伴再找了)
ALTER TABLE table_name ADD 列名 TEXT
我們先看下FMDB的源碼獲取Key 的部分

- (void)setupColumnNames {
    
    if (!_columnNameToIndexMap) {
        [self setColumnNameToIndexMap:[NSMutableDictionary dictionary]];
    }    
    
    int columnCount = sqlite3_column_count([_statement statement]);
    
    int columnIdx = 0;
    for (columnIdx = 0; columnIdx < columnCount; columnIdx++) {
        [_columnNameToIndexMap setObject:[NSNumber numberWithInt:columnIdx]
                                 forKey:[[NSString stringWithUTF8String:sqlite3_column_name([_statement statement], columnIdx)] lowercaseString]];
    }
    _columnNamesSetup = YES;
}

上面這個方法是私有方法,外部是不允許直接調(diào)用的呜呐,或者在增加一外部API接口就斤。
這里我選擇了另外一種方法

- (int)columnIndexForName:(NSString*)columnName {
    
    if (!_columnNamesSetup) {
        [self setupColumnNames];
    }
    
    columnName = [columnName lowercaseString];
    
    NSNumber *n = [_columnNameToIndexMap objectForKey:columnName];
    
    if (n) {
        return [n intValue];
    }
    
    NSLog(@"Warning: I could not find the column named '%@'.", columnName);
    
    return -1;
}

這個方法是傳入一個你要檢測的字段名字,查詢獲取到對應的index 索引蘑辑。
如果有這個字段洋机,會返回對應的索引,否則返回 -1 .

-1: 這個神圣的數(shù)字代表什么呢洋魂,看到log 了么绷旗,查詢不到當前的字段
如果
非-1: 該字段存在,得到想要的結(jié)果了副砍,

具體查詢查詢實現(xiàn)代碼如下:

- (BOOL)selectHardTableColums{
   
    [_db open];
    NSString * sqlstr = [NSString stringWithFormat:@"select * from %@",HardSynTable_Record];
    FMResultSet * result = [_db executeQuery:sqlstr];
    [result columnIndexForName:SYNC_ALBUM_MUSIC_COUNT];
    
    NSLog(@"result = %@",result);
//    for (int i=0; i<[result columnCount]; i++) {
//        NSString * columnName = [result columnNameForIndex:i];
//        if ([columnName containsString:SYNC_ALBUM_MUSIC_COUNT]) {
//            return YES;
//        }
//    }
    NSDictionary * dict =   [result columnNameToIndexMap];
    if (dict) {
        for (NSString * keystr in [dict allKeys]) {
            if ([keystr containsString:SYNC_ALBUM_MUSIC_COUNT]) {
                return YES;
            }
        }
    }
    
   
    return NO;
    
}

columnIndexForName 你們是不是看到我這個地方了衔肢,為什么先調(diào)用這個方法。
一開始我調(diào)用的是 [result columnNameToIndexMap] 這個方法是返回一個帶有索引的字典 key-value 形式的豁翎,剛開始直接調(diào)用一直返回nil 我沒注意角骤,進去我看了一些沒有調(diào)用到 setupcolumnnames 方法,所以優(yōu)先調(diào)用 columnIndexForName方法,進行setup 字典初始化一次心剥。

上面我們說了兩種方法

  1. 這是其中一種方法邦尊,前提是我們調(diào)用了[result columnNameToIndexMap]
if (dict) {
        for (NSString * keystr in [dict allKeys]) {
            if ([keystr containsString:SYNC_ALBUM_MUSIC_COUNT]) {
                return YES;
            }
        }
    }
  1. 另外一種方法 FMDB提供了一個columnCount 的方法硼控,返回一個列的數(shù)量 columnNameForIndex:i 這個方法可以根據(jù)索引查找每個列下的列名,在這進行了一個遍歷是比較安全的胳赌,防止字段名重復
for (int i=0; i<[result columnCount]; i++) {
        NSString * columnName = [result columnNameForIndex:i];
        if ([columnName containsString:SYNC_ALBUM_MUSIC_COUNT]) {
            return YES;
        }
    }

如果有朋友需要查詢字段名字是否已經(jīng)插入成功牢撼,可以參考FMDB提供的這些方法,只是代碼疑苫,無需什么demo測試熏版。繼續(xù)保持技術(shù)的分享精神

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市捍掺,隨后出現(xiàn)的幾起案子撼短,更是在濱河造成了極大的恐慌,老刑警劉巖挺勿,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曲横,死亡現(xiàn)場離奇詭異,居然都是意外死亡不瓶,警方通過查閱死者的電腦和手機禾嫉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚊丐,“玉大人熙参,你說我怎么就攤上這事÷蟊福” “怎么了孽椰?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長凛篙。 經(jīng)常有香客問我黍匾,道長,這世上最難降的妖魔是什么呛梆? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任锐涯,我火速辦了婚禮,結(jié)果婚禮上削彬,老公的妹妹穿的比我還像新娘全庸。我一直安慰自己秀仲,他們只是感情好融痛,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著神僵,像睡著了一般雁刷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上保礼,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天沛励,我揣著相機與錄音责语,去河邊找鬼。 笑死目派,一個胖子當著我的面吹牛坤候,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播企蹭,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼白筹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谅摄?” 一聲冷哼從身側(cè)響起徒河,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎送漠,沒想到半個月后顽照,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡闽寡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年代兵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爷狈。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡奢人,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淆院,到底是詐尸還是另有隱情何乎,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布土辩,位于F島的核電站支救,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拷淘。R本人自食惡果不足惜各墨,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望启涯。 院中可真熱鬧贬堵,春花似錦、人聲如沸结洼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽松忍。三九已至蒸殿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宏所。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工酥艳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人爬骤。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓充石,卻偏偏與公主長得像,于是被迫代替她去往敵國和親霞玄。 傳聞我的和親對象是個殘疾皇子赫冬,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

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

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關(guān)的語法溃列,內(nèi)部類的語法劲厌,繼承相關(guān)的語法,異常的語法听隐,線程的語...
    子非魚_t_閱讀 31,625評論 18 399
  • 1. 簡介 1.1 什么是 MyBatis 补鼻? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,519評論 0 4
  • 在大學雅任,幾乎誰都會加入個把個社團學生會什么的风范。有些人來來就走,有些人則堅守兩三年沪么。 似乎硼婿,成為某個團隊的一員就像參...
    六厘米閱讀 202評論 0 2
  • 山水中走來的從文先生,山水中創(chuàng)就的邊城禽车。高中時寇漫,剛剛讀起這本書。每次午后殉摔,同學們午休時州胳,我便就著燦爛的陽光,沉...
    舊柳新芽閱讀 416評論 0 0
  • 作為一名大學生逸月,熬夜可能必不可少栓撞,甚至是必須的,但是我們熬夜都在做什么碗硬,看電視瓤湘?玩游戲?看小說恩尾?除了看小說勉強跟學...
    風楊閱讀 397評論 0 0