0

こんにちは私は本当に私のアプリで立ち往生しています。SQLITE3を使用して、テーブルの1つで約250.000行(50mb)の単純なSELECTを作成する必要があります。Iphone Simulatorをロードすると、クエリに約3秒かかります。デバイスでアプリをテストすると、クエリに90秒かかります。残念ながら、90秒待ってもアプリをリリースできません。ここに私のコードを投稿します:

-(void) loadResults {

sqlite3 *database;
NSMutableString *street;
zone = [[NSMutableArray alloc] init];

if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
    const char *sqlStatement = [[NSString stringWithFormat:@"select street from streets "] UTF8String];
    sqlite3_stmt *compiledStatement;
    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
        while(sqlite3_step(compiledStatement) == SQLITE_ROW) {

            street = [NSMutableString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
            [zone addObject:street];
        }
    }   
    sqlite3_finalize(compiledStatement);
}
sqlite3_close(database);}   

これがSQLITE3を使用してテーブルを作成した方法です

CREATE TABLE streets (id INTEGER PRIMARY KEY, street TEXT, province TEXT, country TEXT, from TEXT, to TEXT, lat TEXT, lon TEXT);
CREATE INDEX strIndx on streets(street);

ご覧のとおり、WHEREステートメントはなく、単純な「SELECTstreetFROMstreets」にすぎません。

ここで助けが必要ですよろしくお願いします。

4

3 に答える 3

3

250,000 の行があり、3000 の個別の結果しかない場合、各道路はデータベースに平均 83 回含まれています。

おそらく、通りを個別の正規化されたテーブルに分割し、各値が 1 回だけ発生するようにし、住所テーブルからそれらの通りを ID で参照するのが適切でしょう。次に、TableView については、Streets テーブルから値だけを引き出すことができます。

前述したように、UI パラダイムの問題もある可能性があります。UI に 3000 エントリを含むテーブルがある場合、ユーザーにとって非常に面倒な作業になる可能性があります。(一度に 1 フリック下にスクロールして、Yabar Street に移動しようとすることを想像してください。)

前に提案されたように、少なくともテーブルを遅延ロードすることをお勧めします。または、ユーザーが通りの名前を入力できるようにし、Google が提案するタイプのインターフェイスを提供して、入力時に一致する候補をポップアップ表示することもできます。

于 2010-07-09T17:19:00.317 に答える
2

あなたは何をしようとしているのですか?WHEREステートメントがないことを認めているので、Obj-C側で行をフィルタリングするようなことはしていないと思います。したがって、あなたがやろうとしていると私が考えることができる唯一のことは(私が間違っている場合はコメントしてください)、表示するすべての行をロードすることです。Apple はこれに対して非常に単純な標準的な推奨事項を持っています - テーブルを遅延ロードします。基本的には、元のクエリに 15 行の制限を追加し、さらに取得する方法を用意します (通常、これは「もっと読み込む...」という青いテキストを含むテーブル フッターになります)。あるいは、これは、要求されるまで (ユーザーがセルにスクロールしたときに発生する) 制限を下回るセルをロードしないことによっても実装できます。

于 2010-07-09T01:24:09.653 に答える
0

答えてくれてありがとう、ジャレッド、私が必要としているのは、すべての通りを UITableView に表示し、ユーザーが UISearchBar で検索をフィルタリングできるようにするか、リストから選択できるようにすることです。クエリを次のように変更しました

SELECT DISTINCT(street) from streets

これは 3000 行の結果を返しましたが、DISTINCT がない場合と同じ時間、つ​​まり 90 秒かかります。「GROUP BY street」でも試してみましたが、メリットはありません。ただし、.. LIMIT 3000 を追加すると、結果は即座に得られます。クエリがテーブル全体を移動して DISTINCT 値を取得する必要があると思いますが、これは LIMIT とは関係ありません。INDEX の問題である可能性はありますか? インデックスが機能しているかどうかを知るにはどうすればよいですか? 再度、感謝します!

于 2010-07-09T03:09:36.523 に答える