2009-10-12 72 views
1

我想我在UITableViews和從SQLite數據庫獲取/插入數據方面得到了很好的處理。我正在討論一個建築問題。iPhone SDK:從SQLite加載UITableView

我的應用程序在數據庫中保存了3個值,可以有多/多行。但是,我會加載他們在表中?

從我所見過的所有教程中,通過執行SELECT語句將整個數據庫加載到NSMutableArray或類似對象中。

然後當

- (的UITableViewCell *)的tableView:(UITableView的*)的tableView的cellForRowAtIndexPath:(NSIndexPath *)indexPath

調用,所需的行從前面的打扮出裝載的NSMutableArray(或類似的意象結構) 。

但是我有幾千行?爲什麼要預加載它們?

我應該每次調用cellForRowAtIndexPath時都要查詢數據庫嗎?如果是這樣,我會用什麼作爲索引?

表中的每一行都會有一個AUTOINCREMENT索引,但由於某些行可能會被刪除,索引將不會對應表中的行(在SQL中,我可能有這樣的行,索引3丟失):

1數據1數據1 2數據2數據2 4.數據3數據3

感謝

回答

3
結果分配你的 int[]

我通過讀取表格單元格需要從我的數據庫到數據源數組中的所有現有數據庫條目來解決此問題。這些對象不會從數組中移除,但它們會停留在那裏,除非它們需要被移除。

例如,我的一個應用程序讀取1'700行,每行創建一個對象,分配一個NSUInteger(自動增量值)和一個NSString(將在單元格中顯示的對象的名稱)和將它們放入數據源數組中。這整個過程只需要大約200-300毫秒 - 你必須測試10'000 +條目是否需要太長的時間,但對於數千條條目,只讀全部應該是可以的。我記得內存消耗也很低,不能準確查找ATM有多少。然後,當用戶點擊一行時,我查詢數據源數組以查找他剛剛點擊的對象,然後此對象從數據庫加載所有其他值,因爲它知道它自己的數據庫密鑰/ id(它「保溼」本身)。

對於(使用FMDB)完整性的考慮:

NSResultSet *res = [db executeQuery:@"SELECT my_key, my_name FROM table"]; 
while ([res next]) { 
    NSDictionary *dict = [res resultDict]; 
    MyObj *obj = [MyObj obj]; 
    obj.id = [dict objectForKey:@"my_key"]; 
    obj.name = [dict objectForKey:@"my_name"]; 

    [datasourceArray addObject:obj]; 
} 
+0

嗨,你能解釋我如何爲foreach分配查詢(記錄集)嗎?請詳細說明你的代碼。謝謝Pascal – dinesh 2012-01-23 10:53:14

+0

dinesh,我更新了代碼,希望這有助於。 – Pascal 2012-01-23 16:06:01

+0

非常感謝,讓我試試 – dinesh 2012-01-24 08:22:36

1

你總是可以做一個選擇語句在你希望的順序來獲取只是「自動增量指標」,並讓他們在一個數組(你將有一個數組,數以千計的整數,壽沒關係)。然後,在'cellForRowAtIndexPath'中,從你的數組中獲取正確的'autoincrement index'並獲取你需要的所有數據(我在下面調用'id'你的'autoincrement index'...)。

NSArray *ids; // Put the result of 'select id from datatable' here 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Fetch full row where autoincrement index is: [ids objectAtIndex:indexPath.row] 

當然,如果你想在調用保存到intValue和這樣的你甚至可以使用(而不是NSArray*)一int[] ...您可以使用「select count(*) from datatable

2

這裏是我做的,它完美地工作(我有3K排在DB測試)。該應用程序是EZBudget

  1. 我只讀索引到數組,但我對整個表這樣做,但是許多行有
  2. 在 - (UITableViewCell的*)的tableView:(UITableView的*)的tableView的cellForRowAtIndexPath: (NSIndexPath *)indexPath在indexPath上做SELECT僅作爲索引
  3. 如果某些行需要刪除(一個事務被刪除)我刪除數組中的索引並從表中刪除相應的行
  4. 當記錄是在表中添加,我得到SQLite返回新增記錄的自動增量索引。我把這個索引,並添加到索引數組

所以我的索引數組始終與整個表同步。在任何時候,我都可以通過數組中的索引選擇整個記錄。

謝謝大家的建議!