1

現在、私はsqliteデータベースを使用してAndroidで多くの問題を抱えています。今回は本当に変です。

特定のアクティビティを入力するたびに、「チーム1とチーム2の目標-目標」のように、最新の3つのエントリを表示したいと思います。奇妙なことに、データベースは間違った値を返しています。現在のデータベースコンテンツから始めましょう:

ここに画像の説明を入力してください

ここでの私の質問にとって重要なのは、列「id」、「goals1」、および「goals2」です。ご覧のとおり、最新の3つのゲームは、「4:dfsadf vs. asf 3-2」、「3:df vs. as 3-2」、「2:dfavs.dfas2-0」です。私のアクティビティでは、以下が表示されます。

ここに画像の説明を入力してください

ご覧のとおり、アウェーチームのゴールは間違っています(そして、エントリーのIDがアウェーゴールとして設定されているようです)。これらの3つのボタンのテキストを次のように設定します。

entries = datasource.getLatestFootballEntry(challengeName);
button = (Button) findViewById(R.id.bt_overview_latest1);
            entry = entries.elementAt(0);
            buttonText = entry.date + ": " + entry.team1 + " vs. " + entry.team2 + " " + entry.goals1 + "-" + entry.goals2;
            button.setText(buttonText);
            button.setClickable(true);

            button = (Button) findViewById(R.id.bt_overview_latest2);
            entry = entries.elementAt(1);
            buttonText = entry.date + ": " + entry.team1 + " vs. " + entry.team2 + " " + entry.goals1 + "-" + entry.goals2;
            button.setText(buttonText);
            button.setClickable(true);

            button = (Button) findViewById(R.id.bt_overview_latest3);
            entry = entries.elementAt(2);
            buttonText = entry.date + ": " + entry.team1 + " vs. " + entry.team2 + " " + entry.goals1 + "-" + entry.goals2;
            button.setText(buttonText);
            button.setClickable(true);

ここで特定のエントリを取得します。

public Vector<FootballEntry> getLatestFootballEntry(String challengeName){
        Vector<FootballEntry> entries = new Vector<FootballEntry>();
        Cursor cursor = database.query(CustomSQLiteHelper.TABLE_FOOTBALL, allColumns2, null, null, null, null, null);
        cursor.moveToLast();
        int i=0;
        while(i<3 && !cursor.isBeforeFirst()){
            if(checkIfCorrectChallengeName(cursor, challengeName)){
                entries.add(cursorToFootballEntry(cursor));
                i++;
            }
            cursor.moveToPrevious();
        }
        return entries;
    }

今、奇妙な部分が来ます。ボタンにテキストを設定する方法を次のように変更すると、すべて問題ありません。

button = (Button) findViewById(R.id.bt_overview_latest1);
            datasource.open();
            entry = datasource.getSpecificFootballEntry(entries.elementAt(0).id);
            datasource.close();
            buttonText = entry.date + ": " + entry.team1 + " vs. " + entry.team2 + " " + entry.goals1 + "-" + entry.goals2;
            button.setText(buttonText);
            button.setClickable(true);

今、散らばっている

ここに画像の説明を入力してください

これは私のcursorToFootballEntryメソッドです

private FootballEntry cursorToFootballEntry(Cursor cursor){
    FootballEntry entry = new FootballEntry();
    entry.id = cursor.getLong(0);
    entry.challengeName = cursor.getString(1);
    entry.date = cursor.getString(2);
    entry.home = cursor.getInt(3);
    entry.platform = cursor.getString(4);
    entry.team1 = cursor.getString(5);
    entry.stars1 = cursor.getDouble(6);
    entry.team2 = cursor.getString(7);
    entry.stars2 = cursor.getDouble(8);
    entry.goals1 = cursor.getInt(9);
    Log.i("dfasdf", "IN CURSOR TO FOOENRTY  " + cursor.getInt(9) + "-" + cursor.getInt(10) + "   id: " + cursor.getLong(0));
    entry.goals2 = cursor.getInt(10);
    entry.finished = cursor.getInt(11);
    return entry;
}

ご覧のとおり、私はいくつかの情報をログに出力します(つまり、チームの目標の2つの値)。出力は

09-29 22:50:18.191: I/dfasdf(7039): IN CURSOR TO FOOENRTY  3-4   id: 4
09-29 22:50:18.191: I/dfasdf(7039): IN CURSOR TO FOOENRTY  3-3   id: 3
09-29 22:50:18.201: I/dfasdf(7039): IN CURSOR TO FOOENRTY  2-2   id: 2
09-29 22:50:18.241: I/dfasdf(7039): IN CURSOR TO FOOENRTY  3-2   id: 4

したがって、基本的に、ID 4のエントリは2回読み取られますが、2つの異なるアウェーゴール値があります。これを引き起こす原因は何ですか?つまり、同じゲームである限り、一度に3つのゲームを取得するか、1つのゲームを3回取得するかは、明らかに違いはありません(IDを参照)。単一のゲームを取得すると、常に正しい値が返されます。すべてのゲームを入手した場合も同じことが起こります(別のアクティビティで必要)。データベース作成宣言では、「autoincrement」に設定された値は1つだけであり、_idは他に何もありません。

これを「証明」するために、スコア1-0の新しいエントリを入力しました。以下が表示されます(テキスト設定の2番目のバリアントでは、最初のバリアントが正しいことを意味します)

ここに画像の説明を入力してください

ログ

09-29 23:02:13.281: I/dfasdf(7039): IN CURSOR TO FOOENRTY  1-5   id: 5
09-29 23:02:13.291: I/dfasdf(7039): IN CURSOR TO FOOENRTY  3-4   id: 4
09-29 23:02:13.291: I/dfasdf(7039): IN CURSOR TO FOOENRTY  3-3   id: 3
09-29 23:02:13.311: I/dfasdf(7039): IN CURSOR TO FOOENRTY  1-0   id: 5

編集:もちろん、解決策は最新のゲームのIDのみを取得し、それらを個別に取得することですが、私の質問の動機は、なぜこれが発生する可能性があるのか​​を理解することです。

4

1 に答える 1

2

カーソルを後方に移動しても機能しないようです。

ただし、順序を明示的に指定しない場合、レコードが特定の順序で返されるという保証はありません。そのため、必要なレコードを正確に返すようにクエリを変更する方が簡単です。

cursor = database.query(CustomSQLiteHelper.TABLE_FOOTBALL,
                        allColumns2,
                        null, null,
                        null, null,
                        "id DESC",  // return largest id values first
                        "3");       // return no more than 3 records
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
    ...
    cursor.moveToNext();
}
于 2012-09-30T09:47:05.340 に答える