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 等“不管原来的身份证?

我认为 ORDER BY _id 甚至 ORDER BY Date ASC 会解决这个问题,但它没有。

我在数据库中的行看起来像这样:

1,测试,2012 年 4 月 13 日,250
2,测试,2012 年 4 月 13 日,300
3,测试,2012 年 4 月 14 日,222
4,TEST2,2012 年 4 月 14 日,500
5,测试,4/ 15/2012, 600

当用户单击“TEST”的历史记录时,它会以 1、2、3、5 的形式返回......如果他们拉起“TEST2”的历史记录,它会显示为“4”,我正在尝试获取它TEST 显示“1,2,3,4”,TEST2 显示“1”

该死的我无法回答我自己的答案,但这是我最终做的:

多谢你们。我找到了一个修改视图的替代选项,因此不必触摸 SqLite db。这是我找到的修改 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);

这可能不是最迷人的方式,但现在每次窗口出现历史记录时,它都使用行号(加一)来指示它是哪个#。谢谢大家!

4

3 回答 3

1

这是获取“重新基于”的 ID 的一种方法。在此示例中,“新 ids”基于grade(即您的情况下的“旧 ids”):

.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

我已经对@sixfeetsix 回答的内容进行了一些尝试,因为它没有给出 1,2,3,4,.. 编号以及您可能需要放入更多子查询的 WHERE (也许不是,但我不是很好的查询):

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 回答
0

经过长时间的研究,这个查询对我有用......

我得出的经验结果:

1)您还需要在子查询中定义 where 条件。2)如果在关系运算符中比较的 ids (t2._id <= t1._id) 将是主键,那么它在所有情况下都可以正常工作。
3)关于 orderby 条件,您必须根据您的选择或需要来决定。

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 创建它的两个别名

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()只存在一行,因此我们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"

安静清楚,它将返回TWO rows are there具有ids <= 12 11 和 12 的内容

这样它将生成所需的序列......

这是生成序列的一个简单技巧..实际上看起来并不简单,但当你深入了解它时真的很简单..

我不是专家,但这是我所理解的..希望解释有所帮助......

由于网上有各种解决方案或相同的解决方案,但没有解释..

:)

于 2012-05-15T04:26:31.007 回答