私は過去数日間SQLiteを使用していますが、時々、解決できないエラーが発生します。クエリが機能することもあれば、機能しないこともありますが、テーブルをダンプしても、機能するはずです。Logcatからのこのダンプを確認してください(デバイスでのデバッグ、データベースにアクセスするための良い方法がまだ見つかりません...):
これはct_dataというテーブルからのものです
01-05 20:13:16.619: I/DataDAO(12453): >===>ID 100
01-05 20:13:16.619: I/DataDAO(12453): >===>cablefinderID 4
01-05 20:13:16.619: I/DataDAO(12453): >===>latitude 51.5077559
01-05 20:13:16.619: I/DataDAO(12453): >===>longitude 7.5959846
01-05 20:13:16.629: I/DataDAO(12453): >===>data DV200SN041385SV4.01TM19:24DT12/04/09CM33ST0BT9MD0SS28UMMDP---
01-05 20:13:16.629: I/DataDAO(12453): >===>time 1357416761579
01-05 20:13:16.629: I/DataDAO(12453): >===>ID 101
01-05 20:13:16.629: I/DataDAO(12453): >===>cablefinderID 4
01-05 20:13:16.629: I/DataDAO(12453): >===>latitude 51.5077559
01-05 20:13:16.629: I/DataDAO(12453): >===>longitude 7.5959846
01-05 20:13:16.629: I/DataDAO(12453): >===>data DV200SN041385SV4.01TM19:24DT12/04/09CM33ST0BT9MD0SS27UMMDP---DV200SN041385SV4.01TM19:24DT12/04/09CM33ST0BT9MD0SS28UMMDP---
01-05 20:13:16.629: I/DataDAO(12453): >===>time 1357416771625
そして、これは私も(引用符なしで)出力するSQLステートメントです:
"SELECT * from ct_data WHERE cablefinderID = '4'"
where句='4'を引用符('')の有無にかかわらず試しましたが、cablefinderIDはSQLでは整数型であり、Javaではlong型です。これがJavaの私のコードです:
String query = "SELECT * from ct_data WHERE cablefinderID='" + registration.getId()+"'";
cursor = database.rawQuery( query, null );
// check if cursor is empty
if(!cursor.moveToFirst()) {
Log.i(TAG, "WTF!!!");
}
また、rawQueryの2番目の引数であるString[]selectionArgsを使用しようとしました。
String query = "SELECT * from ct_cablefinder_data WHERE cablefinderID=?";
String[] args = {"4"};
cursor = database.rawQuery( query, null );
それでも、時々「WTF」にたどり着きます。これは2日前に発生し、後でJavaで値を比較することになりましたが、これは単なる修正プログラムであり、後でDBに数千の行がある場合に使用するのは適切ではありません。デバッグに基づいて、インデックスが壊れている可能性があり、すべてのアプリデータが削除されてから機能したと考えました。今度はすべてのアプリデータを再度削除しましたが、同じことが起こります。私はここで自分自身をだまし始めます、これは私を夢中にさせます...
私が見たばかげた間違いがあるだけだと言ってください!
よろしく、サイモン。
- - - - - - - - - - - - - - - - -編集 - - - - - - - - ------------------
まず、助けてくれてありがとう!しかし、これはクレイジーです。それはうまくいきません。繰り返しになりますが、新しいクリーンなDBを取得するには、前にすべてのアプリデータを削除してください。これをチェックして:
01-06 05:54:38.969: I/DataDAO(19394): ====================ct_cablefinder_data====================
01-06 05:54:39.039: I/DataDAO(19394): >===>ID 1
01-06 05:54:39.039: I/DataDAO(19394): >===>cablefinderID 1
01-06 05:54:39.039: I/DataDAO(19394): >===>latitude 51.5077559
01-06 05:54:39.039: I/DataDAO(19394): >===>longitude 7.5959846
01-06 05:54:39.039: I/DataDAO(19394): >===>data DV200SN041385SV4.01TM05:06DT13/04/09CM33ST0BT9MD0SS00UMMDP---
01-06 05:54:39.039: I/DataDAO(19394): >===>time 1357451653224
01-06 05:54:39.039: I/DataDAO(19394): >===>ID 2
01-06 05:54:39.039: I/DataDAO(19394): >===>cablefinderID 1
01-06 05:54:39.039: I/DataDAO(19394): >===>latitude 51.5077559
01-06 05:54:39.049: I/DataDAO(19394): >===>longitude 7.5959846
01-06 05:54:39.049: I/DataDAO(19394): >===>data DV200SN041385SV4.01TM05:06DT13/04/09CM33ST0BT9MD0SS00UMMDP---
DV200SN041385SV4.01TM05:06DT13/04/09CM33ST0BT9MD0SS00UMMDP---
DV200SN041385SV4.01TM05:06DT13/04/09CM33ST0BT9MD0SS00UMMDP---
DV200SN041385SV4.01TM05:06DT13/04/09CM33ST0BT9MD0SS00UMMDP---
01-06 05:54:39.049: I/DataDAO(19394): >===>time 1357451663259
01-06 05:54:39.049: I/DataDAO(19394): ==============================================
01-06 05:54:51.889: I/DataDAO(19394): ====================ct_cableregistration====================
01-06 05:54:51.939: I/DataDAO(19394): >===>ID 1
01-06 05:54:51.939: I/DataDAO(19394): >===>projectID 1
01-06 05:54:51.939: I/DataDAO(19394): >===>startTime 2013-01-06 05:54:12
01-06 05:54:51.939: I/DataDAO(19394): >===>endTime null
01-06 05:54:51.939: I/DataDAO(19394): >===>deviceType DC200-041385
01-06 05:54:51.939: I/DataDAO(19394): >===>deviceKey 00:01:95:08:2F:3B
01-06 05:54:51.939: I/DataDAO(19394): >===>registrationServerID 0
01-06 05:54:51.949: I/DataDAO(19394): ==============================================
And the SQL statement:
01-05 20:14:20.859: E/DataDAO(12453): SELECT * from ct_cablefinder_data WHERE cablefinderID=1
これは私の調整されたコードであり、MeghalShahによる提案に従いました。
public List<DataVO> getDataByRegistration( CableRegistrationVO registration ) {
synchronized ( lock ) {
openReadable();
Cursor cursor = null;
List<DataVO> result = new ArrayList<DataVO>();
try {
String query = "SELECT * from ct_cablefinder_data WHERE cablefinderID="
+ registration.getId();
cursor = database.rawQuery( query, null );
dumpTableI( "ct_cablefinder_data" ); // see tabledump above
dumpTableI( "ct_cableregistration" ); // again, dump above
Log.e( TAG, query );
while ( cursor.moveToNext() ) {
result.add( this.bindSQLite( cursor ) );
}
} catch ( Throwable t ) {
Log.e( TAG, t.toString() );
} finally {
if ( cursor != null ) {
cursor.close();
}
}
close();
return result;
}
}
つまり、段階的なデバッグを行っており、プログラムがwhile条件に達するたびに、finallyブロックに直接ジャンプしてカーソルを閉じ、データをまったく取得しません。結果のArrayListは空のままです。しかし、それはそこにあります:cablefinderID = 1、私はそれを見ることができます、あなたはそれを見ることができますね?
ここで、すべてを文字列にキャストして、WHERE句のそれらを比較しようとします。それが機能しない場合は、よくわかりませんが、アルコールの乱用はかなりのようです。