2017-01-02 2 views
-1

私の問題の原因が見つかりました。それは重複としてマークされているので、私自身の質問を嫌うが、自分の質問の下で私の最後のコメントを参照してください。バックアップ機能は同じバージョン番号の古いデータベーススキームを取得したので、onUpdate()またはonCreate()はSQLiteHelperClassで呼び出されませんでした。新しくインストールされた署名付きAPKのSQLLite 'そのような列はありません'

私は解決できない奇妙な問題が発生しています。私はエミュレータで私のアプリを実行すると、すべてが大丈夫です。私は自分の携帯電話上のapk-debug.apkとしてそれを実行すると、すべてがOKですが、私は自分の携帯電話に署名したアプリとしてそれを実行しようとすると、私はこのエラーを取得する:

Error Code : 1 (SQLITE_ERROR) 
Caused By : SQL(query) error or missing database. 
(no such column: listId (code 1): , while compiling: SELECT * FROM mytable WHERE listId=100 ORDER BY id,name,conc ASC) 

私はすべて削除した場合設定のアプリデータはアプリを再実行しますが、最初は電話に初めてインストールされたものの、署名されたアプリバージョンではすべて動作します!

MYTABLEがdb.execSQL(DATABASE_CREATE_MY_TABLE)を実行することによって作成されます(列名が他の場所で設定された定数である)

private static final String DATABASE_CREATE_MY_TABLE = "CREATE TABLE " 
    + MY_TABLE + "("    
    + ID + " INTEGER, " 
    + LIST_ID + " INTEGER, " 
    + NAME + " STRING, " 
    + CONC + " REAL, " 
    + "PRIMARY KEY (" + ID + "," + LIST_ID + ")" 
    + ")" 

このエラーを作成するコードは以下の通りである:

SQLiteDatabase db = this.getReadableDatabase(); 
    String selectQuery = "SELECT * FROM " + MY_TABLE + " WHERE " + LIST_ID + "=?" + " ORDER BY " + NAME + "," + CONC + " ASC"; 
    Cursor cursor = db.rawQuery(selectQuery, new String[] {listId}); 

私の主な問題は、署名されたapkの最初のインストール時に作成されないようだが、app-dataを削除して署名付きapkを再作成した場合に作成される列LIST_IDです。電話機のエミュレータとdubug.apkで毎回作成されます。

String selectQuery = "SELECT * FROM " + MY_TABLE + " WHERE " + LIST_ID + "=" + listId + " ORDER BY " + NAME + "," + CONC + " ASC"; 
Cursor cursor = db.rawQuery(selectQuery, null); 

をし、少しデバッグのためにそれを修正:

私が試した

String selectQuery = "SELECT * FROM " + MY_TABLE + " WHERE " + ID + "=?" + LIST_ID + "=?" + " ORDER BY " + NAME + "," + CONC + " ASC"; 
Cursor cursor = db.rawQuery(selectQuery, new String[] {id, listId}); 

を結果と同じエラーで。異なる列を試しましたが、listIdはすべての場合にエラーを引き起こす列です。しかし、署名されたapkを自分の携帯電話で実行しているときのみ。それはanythigを意味する場合、私の携帯電話はサムスンS6です。私は私のアプリは、このコードのデータベースを最初にインストールで作成されていないことを私に示して

SQLiteDatabase db = this.getWriteableDatabase(); 

でそれを使って何をする前に、データベースの作成を強制しようとしたデバッグ対策として

。実際には、アンインストールの作業にもかかわらず、古いバージョンのデータベースが存在するようです。したがって、私はデータベースのバージョンを増やし、最初のインストール時にonUpgrade()が呼び出されました!

署名されたapkとして最初にインストールしたときにデータベースが正しく作成されないか、アンインストールで正しく削除されないようです。

私のコードや他の箇所でエラーを見つけられないようですが、私は盲目的になり始めていますが、他の誰かがバグを見ることができるか、前にこのようなことを経験しており、 。

+0

アプリを削除して再インストールして、古いバージョンのデータが原因ではないことを確認しましたか? –

+0

はい、何度も。何度も何度も繰り返します。これは、署名したビルドだけです。 – user1086500

+0

クリーンインストールから開始して、すべてのsql create/select文を記録します。おそらく誰かが何かを見つけられる可能性があるならば、エラーまでそれらの行を最悪の状態で投稿してください。 –

答えて

0

だけのタイプミスかもしれないが、あなたが気づく最初の変数

+0

これは実際のコードではなく、私の質問の型です! ;-)しかし、私のコードは、エミュレータとapk-debug.apkビルドでは完全に動作しますが、ビルドに署名したときは動作しません。 – user1086500

2

に余分なアンダースコアを

The mytable is created by running db.execSQL(DATABASE_CREATE_MY_TABLE)

private static final String DATABASE_CREATE_MYTABLE = "CREATE TABLE " 
    + MY_TABLE + "("    
    + ID + " INTEGER, " 
    + LIST_ID + " INTEGER, " 
    + NAME + " STRING, " 
    + CONC + " REAL, " 
    + "PRIMARY KEY (" + ID + "," + LIST_ID + ")" 
    + ")" 

を持って、私はここに私のownnの質問にお答えします。

私の電話でテストするために署名付きapkを作成し、以前のバージョンからアップグレードしたときの動作を確認しました。

私の電話機では、「クリーン」なインストールを試みて、アンインストールして再インストールして、その動作を確認したかったのです。しかし、これは質問に記載されたエラーをもたらしました。

この理由は、Android 6.0ではmanifest.xmlにallowBackup = trueが設定されているためです。つまり、アプリをアンインストールすると、アプリを再インストールするとすべてのデータがバックアップされ、検索されます。 https://developer.android.com/guide/topics/data/autobackup.html

通常、これは良いことですが、私のアプリをデバッグするときに私はこれを概説にしませんでした。この機能により、バックアップされたデータベースは同じバージョンですが、いくつかの変更が加えられたため、インストールしようとしたアプリのバージョンとして、アプリケーションはonCreate()とonUpgrade()の両方をスキップしました。また、onCreate()またはonUpgrade()のどちらも作成していない列を読み込もうとすると、エラーが発生しました。

+0

おかげで、これは2日間修正しようとしていた問題を解決しました!あなたのために大きなビール! – jdabrowski

関連する問題