2016-06-10 16 views
0

Ich habe eine ListView eingerichtet von einem Cursor, der die ersten 10 Zeilen in einer Datenbank (LIMIT) ergreift.Wie erhalten Sie die Anzahl der Cursor ohne LIMIT?

cursor = db.query("MYTABLE", 
      new String[]{"_id", "NUMBER", "NAME"}, null, null, null, null, null, "10"); 

Die Liste ist auf "unendlich scroll" eingestellt. Er tut dies, indem die Anzahl der Elemente in der Liste zu vergleichen und die Anzahl der Elemente in der Datenbank, sobald ein Scroll abgeschlossen ist (onScroll von OnScrollListener)

public void onScroll(AbsListView view, int firstVisibleItem, 
           int visibleItemCount, int totalItemCount) { 

       if(firstVisibleItem+visibleItemCount == totalItemCount && totalItemCount!=0) 
       { 
        ListView listView = (ListView) findViewById(R.id.my_list); 

        long numberOfItemsInDB = DatabaseUtils.queryNumEntries(db, "MYTABLE"); 
        long numberOfItemsInList = listView.getAdapter().getCount(); 
        long difference = numberOfItemsInDB - numberOfItemsInList; 

        if (difference > 0) { 
        ... //do stuff here 
        } 

Dies funktioniert. Aber manchmal kann die Liste mit Elementen von einem benutzerdefinierten Cursor gefüllt werden (z. B. von der Suchfilterung), und daher würde ich die Elementanzahl dieses Cursors benötigen. Ich kann eine konsistente Anzahl haben, indem ich .getCount() benutze, aber wenn ich LIMIT bereits benutzt habe, dann gibt es nur die LIMIT zurück, die 10 war.

Wie kann ich die Anzahl der Elemente in einem Cursor bekommen, die das Limit ignorieren?

+0

Der Code wird mit dem Paging-Methode erhalten Sie in der Regel mit dem Erhalten von Daten von einem Remote-Server verwenden würde. Wenn Sie Daten aus der lokalen Datenbank abrufen, benötigen Sie diese Paging-Logik nicht. Die 'Cursor'-Klasse - speziell die' SQLiteCursor'-Klasse - behandelt das gesamte Paging intern. Mit einem 'CursorAdapter' und einem' ListView' aus Recycling haben Sie alles, was Sie brauchen. Setzen Sie Ihre Abfrage für den gesamten Datensatz, den Sie wollen, holen Sie sich den 'Cursor' und lassen Sie' CursorAdapter' und 'ListView' sich um den Rest kümmern. –

+0

@krislarson Also sollte ich meinen Cursor ziehen die gesamte Datenbank und verwenden Cursoradapter, um es zu begrenzen? Ich bin mir nicht sicher, was Sie mit Paging-Logik meinen, wo ist das in Listenansicht eingebaut, kann es automatische Scroll-Lasten aus der Box behandeln? – Prof

+0

Mit Paging meine ich die Logik, die Sie in Ihre 'onScroll'-Methode einbringen - scrollen Sie bis zu einem bestimmten Punkt nach unten, und holen Sie sich dann weitere Artikel zum Anzeigen. Die 10 Elemente würden eine "Seite" darstellen. Wenn Sie jetzt eine Abfrage ausführen und einen 'Cursor' generieren, werden die gesamten Abfragedaten nicht in den Speicher geladen. Wenn Sie möchten, können Sie Klassen wie 'CursorWindow' nachschlagen und den Quellcode lesen, um zu sehen, wie Cursor funktionieren. Nichtsdestotrotz, wenn Sie in Ihrer 'ListView' nach allem, was Sie wollen, abfragen und den resultierenden' Cursor' in einen 'CursorAdapter' setzen, werden Sie in der Lage sein, ohne merkliche Leistungsprobleme durch Ihre gesamte Liste zu blättern. –

Antwort

0

Verwenden Sie die folgende Methode, um Zeilenanzahl in Tabelle zu erhalten.

public synchronized long getRowCount(String TABLE_NAME) { 
    SQLiteDatabase db = this.getReadableDatabase(); 
    return DatabaseUtils.queryNumEntries(db, TABLE_NAME); 
} 

Um die Tabellenzeilenanzahl mit where Klausel

public synchronized long getRowCount(String TABLE_NAME) { 
    SQLiteDatabase db = this.getReadableDatabase(); 
    return DatabaseUtils.queryNumEntries(db, TABLE_NAME, "NAME like ?", new String[]{"%D%"}) 
} 
+0

Dies würde die Zeilenanzahl der Tabelle zurückgeben. Ich bin nach der Zeilenanzahl eines Cursors ohne das Limit. – Prof

+0

wird die Zeilenanzahl ohne Limit zurückgegeben. –

+0

Überprüfen Sie https://developer.android.com/reference/android/database/DatabaseUtils.html#queryNumEntries auf weitere Informationen. –

Verwandte Themen