web-dev-qa-db-ja.com

SQLiteデータベースは、<table_name>(column)に自動インデックスを警告します。アップグレード後Android L

Nexus 7をAndroid 5.0 Lollipop、その前にアプリケーションがSQLite Databaseでうまく動作するようにアップグレードしましたが、今ではあらゆるタイプのクエリを実行するたびに、 log cat error like:

12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on area(server_id)
12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on account(area_id)
12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on staff_visit(account_id)
12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on ordertab(account_id)
12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on area(server_id)
12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on account(area_id)
12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on staff_visit(account_id)
12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on ordertab(account_id)
12-09 12:37:04.978: E/SQLiteLog(13041): (284) automatic index on area(server_id)
12-09 12:37:04.978: E/SQLiteLog(13041): (284) automatic index on account(area_id)
12-09 12:37:04.978: E/SQLiteLog(13041): (284) automatic index on staff_visit(account_id)
12-09 12:37:04.978: E/SQLiteLog(13041): (284) automatic index on ordertab(account_id)

ロリポップの間違いは間違いですか?私はこのOSをアップグレードする前後にコードを更新していないのでそう思う。

自動インデックス付け はsqlite 3.7.17で導入されました。この機能を備えたsqliteのバージョンは Android L developer preview に含まれています。エラーとして記録された、それは実際には単なるメッセージです。

基本的に、インデックスが作成されていない列でルックアップを行っている場合、自動インデックス作成が有効になります。 sqliteは、大量のデータがあるため、一時インデックスの生成は生のルックアップよりも安価であると想定しています。

_CREATE INDEX_を使用して、ルックアップ列に明示的な永続インデックスを追加することを検討してください。たとえば、_CREATE TABLE_の後:

_CREATE INDEX indexname ON tablename(columnname);
_

sqliteによって生成される自動インデックスメッセージからtablename(columnname)を選択できます。

古い動作を元に戻したい場合は、次のコマンドで自動インデックス作成を無効にできます。

_PRAGMA automatic_index=off;
_
70
laalto

これは私がこの問題を調査している最中の投稿でした。私はC#プロジェクトを持っていますが、OPには関係ないかもしれませんが、私はそれがまだ誰かに役立つかもしれないと思いました。

インデックスが明示的に作成されたにもかかわらず、メッセージが表示され続ける理由を知りたい人のために。クエリが異なる照合を使用している可能性があります。

テキスト列を含むテーブルと、where name = @var1 COLLATE NOCASEを指定するwhereステートメントを含む選択クエリがありました。私が作成したインデックスはデフォルトの照合であったため、これにより警告がトリガーされました。

したがって、インデックスまたはcreate tableステートメントのいずれかを書き換えて、その列にnocaseを指定すると、警告が消えました。

1
user1515791