2012-01-09 3 views
1

私はUITableviewデリゲートとデータソースプロトコルメソッドを操作する方法を知っています。だから、私はセクションで作業することができます。今私は、データベースからすべてのレコードをフェッチするために、単一のクエリを使用したいと思います。firstname、firstname ascで連絡先の注文からlastnameを選択します。 (今私は26個の個別のクエリを使用していますが、これは適切な解決策ではないことが分かります)UITableview名前のセクションがソートされた順

ここでセクションのアルファベットに基づいて連絡先をグループ化したいと思います。文字Sから始まる連絡先がない場合、Sのセクションは表示されません。私に正しいコードやチュートリアルを教えてください。ありがとう

このスクリプトを修正することはできますか?

- (void)read_data_fromDB { objectsForCharacters = [[NSMutableDictionary alloc] init];

sqlite3 *db = [eikardAppDelegate getNewDBConnection]; 
arr_sectionTitles = [[NSMutableArray alloc] init]; 
for(char c='A';c<='Z';c++) 
{ 
    NSMutableString *query = nil; 

    query = [NSMutableString stringWithFormat:@"select first_name, middle_name, last_name from phonebook where first_name like '%c%%';",c]; 


    const char *sql = [query UTF8String]; 
    sqlite3_stmt *selectAllStmt = nil; 

    if(sqlite3_prepare_v2(db,sql, -1, &selectAllStmt, NULL)!= SQLITE_OK) 
     NSAssert1(0,@"error preparing statement",sqlite3_errmsg(db)); 
    else 
    { 
     NSMutableArray *arr_persons = [[NSMutableArray alloc] init]; 
     while(sqlite3_step(selectAllStmt)==SQLITE_ROW) 
     { 
      //NSLog(@"Firstname : %@",query); 
      PersonInfo *person =[[PersonInfo alloc] init]; 

      char *chrstr =(char *)sqlite3_column_text(selectAllStmt, 0); 
      if(chrstr !=NULL) 
      { 
       person.str_firstName = [NSString stringWithUTF8String:chrstr]; 
       NSLog(@"Firstname : %@",person.str_firstName); 
      }  
      chrstr =(char *)sqlite3_column_text(selectAllStmt, 1); 
      if(chrstr !=NULL) 
      { 

       person.str_middleName = [NSString stringWithUTF8String:chrstr]; 
       NSLog(@"Middlename : %@",[NSString stringWithUTF8String:chrstr]); 
      } 
      chrstr =(char *)sqlite3_column_text(selectAllStmt, 2); 
      if(chrstr !=NULL) 
      { 
       person.str_lastName = [NSString stringWithUTF8String:chrstr]; 
       NSLog(@"Lastname : %@",person.str_lastName); 
      }    


      [arr_persons addObject:person]; 

      [person release]; 
     } 
     if([arr_persons count]>0) 
     { 
      NSString *keyValue = [NSString stringWithFormat:@"%c",c]; 
      [objectsForCharacters setObject:arr_persons forKey:keyValue]; 
      [arr_sectionTitles addObject:keyValue]; 

     } 
     //[arr_persons release]; 

    } 
    sqlite3_finalize(selectAllStmt); 
} 
sqlite3_close(db); } 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 

    return [arr_sectionTitles count]; 
} 


// Customize the number of rows in the table view. 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    NSString *secTitle = [arr_sectionTitles objectAtIndex:section]; 

    return [[objectsForCharacters objectForKey:secTitle] count]; 
} 
+0

NSPredicatorを試してみましたか? –

+0

私はどのようにsqliteクエリでNSPredicateを使用するか考えていません。私にサンプルを提供してもらえますか? – dinesh

+0

すべてのデータfron sqliteを取得することができます。その後、配列を取得した後、NSPredicateを実行する必要があります。 –

答えて

1

データの出所によって異なります。 NSFetchedResultsControllerを使用している場合は、sectionNameKeyPath:のプロパティのキー名とともに、initWithFetcRequest:managedObjectContext:sectionNameKeyPath:cacheName:を使用できます。注文した結果を複数セクションで表示します。

配列内のクエリの結果データ(26個の文字の1つではなく、選択全体のもの)がある場合は、配列の配列でデータを並べ替える方がよいでしょう。つまり、マスター配列の各要素は、index内の各文字の結果の配列です。

セクションのタイトルとして[[UILocalizedIndexedCollat​​ion currentCollat​​ion] sectionIndexTitles]を使用すると、テーブルのインデックスを実装するのは簡単です。各インデックスのセクションを作成する必要はなく、メソッドの各インデックスの正しいセクションを参照してください。tableView:sectionForSectionIndexTitle:atIndex:

関連する問題