2012-01-12 12 views
1

すべての列を検索する必要があるので、where句で各列名を指定する代わりに、検索可能なメソッドを作成したいすべての列を介して。Objective-Cでfmdbを使用してsqliteのすべての列を反復する方法

-(void) fillSomeobjectNames:(NSString *)filter 
{ 
    FMDatabase *db = [FMDatabase databaseWithPath:databasePath]; 

    [db open]; 

    NSString *sql = [NSString stringWithFormat:@"SELECT id, name, imagefile FROM %@ %@", mainTableName, filter]; 
    FMResultSet *results = [db executeQuery:sql]; 
    while([results next]) 
    { 
     Someobject *someobject = [[Someobject alloc] init]; 
     [someobject setID:[results intForColumn:@"id"]]; 
     [someobject setName:[results stringForColumn:@"name"]]; 
     NSString *iconName = [[results stringForColumn:@"imagefile"] stringByReplacingOccurrencesOfString:@".jpg" withString:@""]; 
     [someobject setIconPath:[NSString stringWithFormat:@"%@-ico.jpg",iconName]]; 
     [someobjects someobject]; 
    } 

    [db close]; 
} 

「フィルタ」「ようにWHERE発言= [検索テキスト]と[説明= [検索テキスト]と...」することができ

答えて

8

私は、これは、単一のSELECT文で行うことができるとは思いません。カラム名を取得するための最良の方法は、残念ながら、これはSELECT文で使用することができない、PRAGMA table_info(table_name)あるので、あなたは、カラム名を取得するために、一つの追加SELECTを必要とし、その後、あなたはあなたのSQLを構築し、あなたがやりたいことができます。

-(void) fillSomeobjectNames:(NSString *)filter 
    { 
     FMDatabase *db = [FMDatabase databaseWithPath:databasePath]; 

     [db open]; 

     FMResultSet columnNamesSet* = [db executeQuery:[NSString stringWithFormat:@"PRAGMA table_info(%@)", mainTableName]]; 
     NSMutableArray* columnNames = [[NSMutableArray alloc] init]; 
     while ([columnNamesSet next]) { 
      [columnNames addObject:[columnNamesSet stringForColumn:@"name"]]; 
     } 
     // put whatever you need to look for as mySearchPhrase 
     NSString* partToAppend = [NSString stringWithFormat:@"=%@ OR ", @"mySearchPhrase"]; 
     NSString* filter = [columnNames componentsJoinedByString:partToAppend]; 
     filter = [filter stringByAppendingString:[NSString stringWithFormat:@"=%@", @"mySearchPhrase"]]; 

     // now your sql would look like this 
     NSString *sql = [NSString stringWithFormat:@"SELECT id, name, imagefile FROM %@ WHERE %@", mainTableName, filter]; 
     FMResultSet *results = [db executeQuery:sql]; 
     while([results next]) 
     { 
      Someobject *someobject = [[Someobject alloc] init]; 
      [someobject setID:[results intForColumn:@"id"]]; 
      [someobject setName:[results stringForColumn:@"name"]]; 
      NSString *iconName = [[results stringForColumn:@"imagefile"] stringByReplacingOccurrencesOfString:@".jpg" withString:@""]; 
      [someobject setIconPath:[NSString stringWithFormat:@"%@-ico.jpg",iconName]]; 
      [someobjects someobject]; 
     } 

     [db close]; 
    } 

WHEREという単語をフィルタから移動し、ANDの代わりにORを使用したことに注意してください。これは意図したことです。

さらに、各列のデータ型を覚えておいてください。それぞれを文字列と比較しますが、テキスト型のテーブルの各列は何ですか?私が使用したプラグマステートメントも、指定されたカラム(タイプのカラム)の型を返します。したがって、それを使用してタイプのカラムのカラムをフィルタリングできます。

+0

は素晴らしいです。私はちょうど "=%@ OR"を "LIKE '%%% @ %%" OR " – gangt

0

上記のお返事ありがとうございます、swift 3のコードを鳴らしてください。このコードは、表のすべての列を表示しています。

let db = FMDatabase(path: Util.getPath(databasePath)) 
    guard db != nil else { return } 

    db!.open() 

    let resultSet: FMResultSet! = db!.executeQuery("PRAGMA table_info(tableName)",withArgumentsIn: nil) 

    let marrInfo : NSMutableArray = NSMutableArray() 
    if (resultSet != nil) { 
     while resultSet.next() { 
      let aDict : NSMutableDictionary = NSMutableDictionary() 
      aDict.setValue(resultSet.string(forColumn: "cid"), forKey: "cid") 
      aDict.setValue(resultSet.string(forColumn: "name"), forKey: "name") 
      aDict.setValue(resultSet.string(forColumn: "type"), forKey: "type") 
      aDict.setValue(resultSet.string(forColumn: "notnull"), forKey: "notnull") 
      aDict.setValue(resultSet.string(forColumn: "pk"), forKey: "pk") 
      print(aDict) 
      marrInfo.add(aDict) 
     } 
    } 
    db!.close() 
関連する問題