1

私は過去数日間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句のそれらを比較しようとします。それが機能しない場合は、よくわかりませんが、アルコールの乱用はかなりのようです。

4

2 に答える 2

1

Ok。そのため、どこかでデータ型に問題がありました。具体的には、cablefinderID を整数として宣言します。しかし、Sqlite はそれだけでは十分ではないと考えたのかもしれません。だから私がしたことは、比較する前に明示的に Integer に再度キャストすることでした:

String query = "SELECT * from  ct_cablefinder_data WHERE CAST(cablefinderID as integer)=" + registration.getId();

それだけでうまくいきました。

しかし、私を助けてくれてありがとう、今ではコーディングを続けることができ、アルコール依存症に陥ることはありません!

于 2013-01-06T09:43:17.713 に答える
0

最初のクエリで、cablefinderID が整数の場合、 '' または "" は必要ありません。動作するはずの次のスニペットを試す必要があります

        String query = "SELECT * from  ct_data WHERE cablefinderID=" + registration.getId();
        cursor = database.rawQuery( query, null );
        while(cursor.moveToNext()){
          //your code here
        }
        cursor.close();

2 番目のクエリは、ct_data の代わりに ct_cablefinder_data を使用しています。これが問題になる可能性があります。また、テーブルの作成方法も役立ちます。

于 2013-01-05T21:42:17.627 に答える