2012-01-26 8 views
5

Android OSに完全に対応するiOSコードを移植しています。私は一連のクエリを実行し、クエリの結果を一時テーブルに挿入します。すべてのクエリが完了したら、私は自分の作成したオブジェクトのコレクションに一時テーブルのすべての結果を取得します。私はそれがより速く実行されると思うので、コレクションにまっすぐに選択するのではなく、一時的なテーブルを使用しています。私は私が唯一の初ExecSqlのから1行を取得し、このコードを実行するとINSERT INTOクエリのSQLiteDatabase.execSQLが期待通りに機能しない

db.execSQL("CREATE TEMPORARY TABLE SearchResults(Name text);"); 
db.execSQL("INSERT INTO SearchResults (Name) SELECT Name FROM ProductNames WHERE NameLower MATCH '" + termLowerCase + "*';"); 
db.execSQL("INSERT INTO SearchResults (Name) SELECT Name FROM BrandNames WHERE NameLower MATCH '" + termLowerCase + "*';"); 

()INSERTを呼び出す:私の問題は、私が期待するようExecSqlの()が動作していないということです、ここのコードです。私はProductNamesテーブルに複数の結果があり、My Termと一致する必要があることを知っています。私はBrandNamesテーブルに何百という行がありますコードを次のように変更した場合:

Cursor cursor = db.rawQuery("SELECT Name FROM ProductNames WHERE NameLower MATCH '" + termLowerCase + "*'", null); 
cursor.moveToFirst(); 
while (!cursor.isAfterLast()) 
{ 
    resultSet.add(cursor.getString(0)); 
    cursor.moveToNext(); 
} 
cursor.close(); 
cursor = db.rawQuery("SELECT Name FROM BrandNames WHERE NameLower MATCH '" + termLowerCase + "*'", null); 
cursor.moveToFirst(); 
while (!cursor.isAfterLast()) 
{ 
    resultSet.add(cursor.getString(0)); 
    cursor.moveToNext(); 
} 

私は期待しているすべての結果を得ています。

私が間違っていることを教えてもらえますか? execSQL()を不適切な方法で使用していますか?私は単にiOS上で使用しているsqlite3_exec()にクエリを渡すと仮定しました。 execSQL()を不適切に使用している場合、制限事項は何ですか?そして、私がやりたいことの中で最も速いものは何ですか?助けてくれてありがとう!

答えて

0

SQLiteDatabaseドキュメントによれば、この場合はexecSQLを使用できません。代わりにrawQueryでその文を実行してみてください。

+0

私は、クエリから返されたデータが必要な場合は、ドキュメントでは使用しないことを示していると思います。私のシナリオでは、rawQueryを使用することは実現可能ではないようです。上記の生のクエリコードは、ADP2で実行するのに非常に長い時間がかかります。また、私は別の方法でiOSバージョンの他のいくつかのクエリを移植したことをテストしました。これは、fts3 MATCHを使用したSELECTでINSERT INTOを使用しています。これらはうまく動作しているようです。この問題は依然として謎です。 –

+0

私はドキュメントを理解する方法は、SELECTではない1つのステートメントを実行すると言います。つまり、INSERT + SELECTは、そのドキュメントの両方の制約に違反します。 rawQueryを使用すると動作しますか?遅いうちは、データのサイズ以上の操作を検討してください。それは簡単な操作ではありません。 – jlindenbaum

+0

はい私はあなたがここで言っているものを得ていますが、INSERT INTOとSELECT文を使ってexecSQL()を呼び出しています。 sql = "INSERT INTO SearchResults(SearchOrder、PID、ProductName、DBTable)" + "SELECT 3、P.ProductID、P.Name、0" + "FROM Ingredients I" + これは、 "INNER JOIN ProductAltNames A ONL(I.IngredientsID = A.IngredientID)" + "INNER JOIN ProductNames P ON(A.ProductID = P.ProductID)" + "WHERE I.DescriptionLower MATCH '" + termLowerCase + "* "; db.execSQL(sql); –

関連する問題