0

ダイアログボックスにユーザーの支払い履歴を入力するために、次のカーソルを設定しました

Cursor PaymentsCursor = db.getReadableDatabase().rawQuery(
                "SELECT _id, Date, Payment FROM tblPaymentHistory WHERE DebtName = '"
                        + debtname + "'" + "ORDER BY _id ASC", null);
        SimpleCursorAdapter HistoryAdapter = new SimpleCursorAdapter(this,
                R.layout.paymenthistoryrow, PaymentsCursor, from, to);

問題は、複数の種類の債務があり、各債務に対して順不同で支払いが行われた場合、支払い履歴が結果を返すときに、順不同の行番号、たとえば 1,2 として返されることです。 、6、7、9、12など。データベースから_id(一意のキー)を取得していることは知っていますが、クエリの行番号を再ベースまたは変更して、各結果が「1、2、3、4、5など」として返されるようにする方法はありますか「元のIDに関係なく?

ORDER BY _id または ORDER BY Date ASC でさえこれを修正すると思っていましたが、そうではありませんでした。

データベース内の私の行は次のようになります。

1、テスト、2012 年 4 月 13 日、250
2、テスト、2012 年 4 月 13 日、300
3、テスト、2012 年 4 月 14 日、222
4、テスト 2、2012 年 4 月 14 日、500
5、テスト、4/ 2012 年 15 月、600

ユーザーが「TEST」の履歴をクリックすると、1,2,3,5... として返され、「TEST2」の履歴をプルすると「4」と表示されるので、取得しようとしています。 TEST は「1,2,3,4」を示し、TEST2 は「1」を示します。

いまいましい私は自分の答えに答えることができませんが、これが私がやったことです:

みんなありがとう。SqLite dbに触れる必要がないように、ビューを変更する代替オプションを見つけました。私が見つけたリンクはheres SimpleCursorAdapterのデータを変更する

結果は次のとおりです。

PaymentsCursor = db.getReadableDatabase().rawQuery(
            " SELECT _id, Date, Payment FROM tblPaymentHistory WHERE DebtName = '"
                    + debtname + "'" + "ORDER BY _id ASC", null);

    String[] from = new String[] { DbAdapter.KEY_HISTORY_ID,
            DbAdapter.HISTORY_DATE, DbAdapter.HISTORY_PAYMENT };

    int[] to = new int[] { R.id.PAYMENTNO, R.id.PAYMENTDATE,
            R.id.PAYMENTAMOUNT };

    SimpleCursorAdapter HistoryAdapter = new SimpleCursorAdapter(this,
            R.layout.paymenthistoryrow, PaymentsCursor, from, to);

    HistoryAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
        @Override
        public boolean setViewValue(View view, Cursor cursor, int column) {
            if (column == 0) { // let's suppose that the column 0 is the
                                // date

                TextView tv = (TextView) view;
                String rownum = String.valueOf(cursor.getPosition() + 1);
                // here you use SimpleDateFormat to bla blah blah
                tv.setText(rownum);

                return true;
            }
            return false;
        }
    });

    paymenthistory.setAdapter(HistoryAdapter);

これは最も魅力的な方法ではないかもしれませんが、ウィンドウに履歴が表示されるたびに、行番号 (プラス 1) を使用して # を示しています。皆さんありがとう!

4

3 に答える 3

1

「リベース」ID を取得する 1 つの方法を次に示します。この例では、「新しい ID」はgrade(つまり、この場合の「古い ID」) に基づいています。

.headers on

create table foo (name text, grade int);

insert into foo values ('Joe', 45);
insert into foo values ('Anna', 98);
insert into foo values ('Julie', 78);

select name, 
       grade, 
       (select count(*) from foo t1 where t1.grade>=t2.grade) as rank  
from foo t2;

select name, 
       grade, 
       (select count(*) from foo t1 where t1.grade>=t2.grade) as rank  
from foo t2
order by rank;

これを foo.sql として保存すると、次のようになります。

[someone@somewhere tmp]$ sqlite3 < foo.sql 
name|grade|rank
Joe|45|3
Anna|98|1
Julie|78|2
name|grade|rank
Anna|98|1
Julie|78|2
Joe|45|3
于 2012-04-13T21:38:16.147 に答える
0

このクエリは、長い調査の結果、うまくいきました...

私が導き出した経験的結果:

1)サブクエリでもwhere条件を定義する必要があります。2)関係演算子で比較された id (t2._id <= t1._id) が主キーになる場合、すべてのケースで正常に機能します。
3) オーダー・バイ・コンディションに関しては、お客様の選択または必要に応じて決定する必要があります。

SELECT 
(SELECT COUNT(*) FROM table t2 WHERE t2._id <= t1._id AND t2.Recipe_id = 2) AS RowNumber,_id,Recipe_id,col2,col3,col4
FROM table t1
WHERE Recipe_id = 2
ORDER BY _id

使い方:-

あるテーブル t に一連の主キー 1,2,3,4,5,6 があるとします。

次に、テーブル t1 とテーブル t2 を使用して 2 つのエイリアスを作成します。

Now both have same sequence table t1 -> 11,12,13,14,15,16
                            table t2 -> 11,12,13,14,15,16

この条件( WHERE t2._id <= t1._id )は、t2 の最初の主キー "11" と t2 の最初の主キー "11" を比較as 11=11するとreturn count()、1 行しか存在しないため、get "1" in row number..

*** remember for every row in Outer query the sub-query is executed ***

したがってnow outer query is at row second having primary key "12"

今度は.. again compare the ( WHERE t2._id <= t1._id ) _again t2._id contains "11"t1._id contains "12"

11 と 12TWO rows are thereを持っているものを返します。ids <= 12

このようにして、目的のシーケンスが生成されます........

これは、シーケンスを生成するための簡単なトリックです..実際に一見すると単純ではありませんが、深く掘り下げると本当に単純です..

私は専門家ではありませんが、これは私が理解したものです..説明が役立つことを願っています...

ネット上にはさまざまなソリューションまたは同じソリューションがありますが、説明はありません..

:)

于 2012-05-15T04:26:31.007 に答える
0

私は@sixfeetsixが答えたことを少し試しましたが、1,2,3,4、..の番号付けに失敗したため、より多くのサブクエリを配置する必要がある場合があります(そうではないかもしれませんが、私はそうではありませんクエリに適しています):

SELECT ( 
           SELECT count( * ) + 1
             FROM  ( 
                   SELECT *
                     FROM tblPaymentHistory 
                    WHERE DebtName = ? 
               ) 
               AS t1
            WHERE t1._id < t2._id 
       ) 
       AS _id,
       Date,
       Payment
  FROM tblPaymentHistory AS t2
 WHERE DebtName = ?
 ORDER BY _id;

Java String を入力し、?エスケープされた値を取得するためにそのままにしておきます (インジェクションセーフ):

Cursor PaymentsCursor = db.getReadableDatabase().rawQuery(
                "...WHERE DebtName=? .. WHERE DebtName=? .. ", new String[]{ debtname, debtname }); 
        SimpleCursorAdapter HistoryAdapter = new SimpleCursorAdapter(this,
                R.layout.paymenthistoryrow, PaymentsCursor, from, to);
于 2012-04-13T22:18:19.957 に答える