2012-04-13 3 views
0

Ich habe den folgenden Cursor bekommeWie auch immer, Zeilennummer in SQLITE Rawquery zu ändern?

ein Dialogfeld mit einer Benutzer der Zahlung der Geschichte zu füllen einrichten
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); 

Das Problem ist aber, dass, wenn es mehr als eine Art von Schulden und Zahlungen an jede Schuld gemacht Wenn die Zahlungshistorie ihre Ergebnisse zurückgibt, werden sie als Out-of-Order-Zeilennummern zurückgegeben, z. B. 1,2,6,7,9,12 usw. Ich weiß, dass es den _id (eindeutigen Schlüssel) aus der Datenbank zieht, aber gibt es eine Möglichkeit, die Zeilennummer in der Abfrage neu zu erstellen oder zu ändern, so dass jedes Ergebnis als "1,2,3,4,5, etc "unabhängig von der ursprünglichen ID?

Ich dachte, dass die ORDER BY _id oder sogar ORDER BY Datum ASC würde dies beheben, aber es tat es nicht.

Meine Zeilen in der Datenbank in etwa so aussehen:

1, TEST, 2012.04.13, 250
2, TEST, 2012.04.13, 300
3, TEST, 4/14/2012, 222
4, TEST2, 2012.4.14, 500
5, TEST, 2012.4.15, 600

Wenn der Benutzer die Geschichte für die "TEST" klickt, kehrt zurück, wie 1,2,3,5 ... und wenn sie den Verlauf für "TEST2" aufrufen, wird es als "4" angezeigt, ich versuche es zu bekommen, so dass TEST "1,2,3,4" zeigt und TEST2 zeigt „1“

Verdammt ich kann nicht meine eigene Antwort beantworten, aber hier ist, was ich am Ende tun:

Danke Jungs. Ich habe eine alternative Option gefunden, mit der die Ansicht geändert wurde, um die SqLite-Datenbank nicht zu berühren. heres die Verbindung, die ich Modifying SimpleCursorAdapter's data

gefunden Und hier ist das Ergebnis:

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); 

Es ist nicht die glamouröse Art und Weise sein, aber jetzt jedes Mal das Fenster mit der Geschichte kommt, wird es mit der Zeilennummer (plus eins) um anzuzeigen, welche # es ist. Danke allen!

+1

warum nicht Sie nehmen die Nummer, die Sie von [Cursor # getPosition()] erhalten haben (http: // deve loper.android.com/reference/android/database/Cursor.html#getPosition%28%29) – zapl

+0

NIEMALS Werte mit einer unbearbeiteten Abfragezeichenfolge verketten und ausführen. http://en.wikipedia.org/wiki/SQL_injection –

+0

@AustynMahoney Willst du sagen, es zu etwas wie zu ändern: PaymentsCursor = db.getReadableDatabase(). RawQuery ("SELECT _id, Datum, Zahlung von tblPaymentHistory WHERE DebtName = ? "+" ORDER BY _id ASC ", neuer String [] {Schuldname}); dang Ich kann das nicht als Code richtig formatieren. Es tut uns leid –

Antwort

1

Hier ist eine Möglichkeit, die "re-based" IDs zu bekommen. In diesem Beispiel werden die "neuen IDs" auf der Grundlage der grade (dh den "alten ids" in Ihrem Fall):

.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; 

dies als foo.sql gespeichert haben, bekomme ich diese:

[[email protected] 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 
0

Ich habe ein bisschen mit @sixfeetsix geantwortet und da das keine 1,2,3,4, .. Nummerierung in Kombination mit der WHERE gibt, die Sie vielleicht in weitere Unterabfragen einfügen müssen (vielleicht nicht aber, I ' m nicht so gut mit Abfragen):

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; 

in Java-String setzen und die ? dort lassen Werte erhalten entkommen (Injektion sicher):

Cursor PaymentsCursor = db.getReadableDatabase().rawQuery(
       "...WHERE DebtName=? .. WHERE DebtName=? .. ", new String[]{ debtname, debtname }); 
     SimpleCursorAdapter HistoryAdapter = new SimpleCursorAdapter(this, 
       R.layout.paymenthistoryrow, PaymentsCursor, from, to); 
0

Diese Abfrage für mich gearbeitet nach langer Forschung ...

Empirische Ergebnisse I abgeleitet:

1) Sie müssen auch die Bedingung in der Unterabfrage definieren. 2) wenn IDs (t2._id < = t1._id) im Verhältnis Operator verglichen wird Primärschlüssel werden dann wird in allen Fällen gut funktionieren.
3) In Bezug auf den ordnungsgemäßen Zustand müssen Sie entscheiden, dass nach Ihrer Wahl oder Bedarf.

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 

Wie es funktioniert: -

Sagen wir eine Sequenz von Primärschlüssel 1,2,3,4,5,6 in irgendeiner Tabelle t haben

Nun erstellen wir zwei Aliase davon unter Verwendung von Tabelle T1 und T2 Tabelle

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

nun diese Bedingung (WHERE t2._id <= t1._id ) vergleicht erster Primärschlüssel „11“ von T2 mit dem ersten Primärschlüssel „11“ von T2 as 11=11 es wird return count() die nur eine Zeile vorhanden ist, damit wir get "1" in row number ..

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

Daher now outer query is at row second having primary key "12"

jetzt wird es again compare the (WHERE t2._id <= t1._id ) dieser Zeit again t2._id contains "11" während t1._id contains "12" ..

Quiet klar es wird wieder, dass TWO rows are there die haben ids <= 12 das ist 11 und 12

auf diese Weise wird es die gewünschte Sequenz erzeugen. ........

Dies ist ein einfacher Trick, um die Sequenz .. nicht einfach tatsächlich in einem Blick, aber wirklich einfach, wenn man in der Tiefe davon ..

Ich bin kein Experte erhalten zu generieren, aber das ist, was ich verstand .. Hoffen, dass die Erklärung hilft ...

Da gibt es verschiedene Lösungen oder gleiche verfügbare Lösungen auf Netz, aber keine Erklärung ..

:)

Verwandte Themen