sqliteデータベースからNSArrayにロードされる280.000以上の単語の膨大な単語リストがあります。次に、高速列挙を実行して、ユーザーが入力した特定の文字列値が配列内の単語の1つと一致するかどうかを確認します。アレイは非常に大きいため、iphone 4でそのアレイを通過するのに約1〜2秒かかります。
どうすればパフォーマンスを向上させることができますか?たぶん私はいくつかの小さな配列を作る必要がありますか?通過するデータが少なくなるように、アルファベットの各文字に1つずつ。
これが私のデータベースクラスの外観です
static WordDatabase *_database;
+(WordDatabase *) database
{
if (_database == nil) {
_database = [[WordDatabase alloc] init];
}
return _database;
}
- (id) init
{
if ((self = [super init])) {
NSString *sqLiteDb = [[NSBundle mainBundle] pathForResource:@"dictionary" ofType:@"sqlite"];
if (sqlite3_open([sqLiteDb UTF8String], &_database) != SQLITE_OK) {
NSLog(@"Failed to open database!");
}
}
return self;
}
- (NSArray *)dictionaryWords {
NSMutableArray *retval = [[[NSMutableArray alloc] init] autorelease];
NSString *query = @"SELECT word FROM words";
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
char *wordChars = (char *) sqlite3_column_text(statement, 0);
NSString *name = [[NSString alloc] initWithUTF8String:wordChars];
name = [name uppercaseString];
[retval addObject:name];
}
sqlite3_finalize(statement);
}
return retval;
}
それから私のメインビューで私はそれをこのように初期化します
dictionary = [[NSArray alloc] initWithArray:[WordDatabase database].dictionaryWords];
そして最後に、このメソッドを使用して配列を調べます
- (void) checkWord
{
NSString *userWord = formedWord.wordLabel.string;
NSLog(@"checking dictionary for %@", userWord);
for (NSString *word in dictionary) {
if ([userWord isEqualToString: word]) {
NSLog(@"match found");
}
}
}