2011-08-08 15 views
2

SQLiteデータベースにはテーブルビューに読み込まれる5000行があります。SQLiteを最適化する必要がありますTableViewにロードする

テーブルをロードするには5~10秒(iPhoneでは非常に長い)かかります。これをスピードアップするために、小さなバッチなどでセルをロードする方法はありますか?また、私が階層に戻ってこのビューに戻ったとき、それは再び全面的に再ロードしなければなりません。代わりにこれをキャッシュすることはできますか?私のデータベースクラスで

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [NSThread detachNewThreadSelector:@selector(myThread:) toTarget:self withObject:nil]; 
} 

-(void) myThread:(id) obj { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSMutableArray *array = [[Database sharedDatabase] getICD9DiseaseCodes]; 

    [self performSelectorOnMainThread:@selector(dataDoneLoading:) withObject:array waitUntilDone:NO]; 
    [pool release];  
} 

-(void) dataDoneLoading:(id) obj { 
    NSMutableArray *array = (NSMutableArray *) obj; 
    self.codeAray = array; 
    [self.myTableView reloadData]; 
    [self dismissHUD]; 
    NSLog(@"done");  
} 

-(NSMutableArray *) getICD9DiseaseCodes 
{ 
    sqlite3 *database = CodesDatabase(); 

    NSMutableArray *icd9DiseaseCodes = [[[NSMutableArray alloc] init] autorelease]; 

    NSString *nsquery = [[NSString alloc] initWithFormat:@"SELECT code, title, description FROM icd9_disease_codes ORDER BY code"]; 
    const char *query = [nsquery UTF8String]; 
    [nsquery release]; 

    sqlite3_stmt *statement; 
    int prepareCode = (sqlite3_prepare_v2(database, query, -1, &statement, NULL)); 
    if(prepareCode == SQLITE_OK) { 
     while (sqlite3_step(statement) == SQLITE_ROW) 
     { 
      ICD9DiseaseCodes *code = [[ICD9DiseaseCodes alloc] init]; 
      code.code = [NSString stringWithCString:(char *)sqlite3_column_text(statement, 0) encoding:NSUTF8StringEncoding]; 
      code.name = [NSString stringWithCString:(char *)sqlite3_column_text(statement, 1) encoding:NSUTF8StringEncoding]; 
      code.description = [NSString stringWithCString:(char *)sqlite3_column_text(statement, 2) encoding:NSUTF8StringEncoding]; 
      [icd9DiseaseCodes addObject:code]; 
      //   NSLog(@"Code: %@ Short Description: %@ Long Description: %@", hcpcsCode.code, hcpcsCode.name, hcpcsCode.description); 
      [code release]; 
     } 
     sqlite3_finalize(statement); 
    } 
    return icd9DiseaseCodes; 
} 

答えて

1

私の最初の質問は、Core DataではなくSQLiteを直接使用する理由です。 Core Dataは、データストアから高速に部分的にフェッチを行い、余分なコードを無償で提供します。

SQLiteで同じことを手動で直接実行したい場合は、重い持ち上げコードが必要です。部分的なデータを取得するには、LIMITOFFSETをSQLクエリに使用し、一度に小さいサブセットのみをフェッチするようにAPIを拡張する必要があります。

+0

コアデータを使用したいと思っていますが、すでにSQLiteデータベースを作成しており、コアデータにロードできませんでした。 –

+0

@Faisal - 何らかの理由で**使用する必要がある**データベースですか? Xcodeでドラッグ&ドロップUIを使用するだけで、手動のSQLiteを続けるよりCore Dataモデルをやり直す方が速いでしょう。特にこのパフォーマンスの問題を解決したい場合。 – PeyloW

1

は、あなたが考えられたりCoreDataに見たことがありますか? CoreDataには大きなレコードセットのための多くの最適化があります。

ありがとうございました。 James

+0

私はCore Dataを使用することができますが、既にSQLiteデータベースを作成しており、コアデータに読み込むことができませんでした。 –

関連する問題