為什么要寫這個簡單的文章:
- 我的表已經(jīng)創(chuàng)建好了荠耽,而我又執(zhí)行了一個 增加列字段的操作态坦,所以這個是更新數(shù)據(jù)庫需要的梅尤,按道理來說應當檢測一下字段是否存在蜒滩。
- 更新字段腳本我們更新過一次就不能執(zhí)行第二次了,隨不起眼沼瘫,但是會影響數(shù)據(jù)庫操作抬纸。
- 所以執(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 字典初始化一次心剥。
上面我們說了兩種方法
- 這是其中一種方法邦尊,前提是我們調(diào)用了
[result columnNameToIndexMap]
if (dict) {
for (NSString * keystr in [dict allKeys]) {
if ([keystr containsString:SYNC_ALBUM_MUSIC_COUNT]) {
return YES;
}
}
}
- 另外一種方法 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ù)的分享精神