2016-06-01 8 views
0

Ich benutze Recycler-Ansicht, um Tabelleninhalte mit Filtern anzuzeigen, sortieren usw. Wenn ich ein neues Element hinzufügen, füge ich ein neues Element ein, frage die Datenbank nach dem neuen Cursor mit SELECT ab.Wie wird die Position der neuen Zeile in der Datenbank nach der Abfrage ausgewählt?

In der Recycler-Ansicht wird vorgeschlagen, dass ich in diesem Fall notifyItemInserted (int position) mit Position Bedeutung Position im Cursor des neuen Elements aufrufen soll.

Es gibt 2 Dinge, die ich weiß, was ich tun kann:

  1. Cursor Iterierte und finden Position des Elements (Hexe ist vielleicht nicht die beste Idee, wenn meine Tabelle mit Zeilen verloren haben)

  2. nicht notifyItemInserted, sondern notifyDataSetChanged und leben, ohne nette Animation (wie ein wilder)

Meine Frage ist, ist es möglich, eine sQL-Abfrage ausführen, die tun so etwas wie diese:

  1. Frage, was ich

  2. hinzufügen COLUMN_POSITION möge, die Ergebnisse der vorherigen Abfrage (im Speicher)

  3. Abfrage des oben mit ausgewähltem COLUMN_POSITION wobei id = id neuen aufzählen Artikel.

  4. einen Cursor mit Position Get

Bonus Fragen: gibt es andere Lösungen für dieses Problem? Wie finde ich eine neue Position, die ich im Cursor kenne?

+1

Verwenden Sie 'CursorJoiner', um den Unterschied zwischen zwei' Cursor's zu sehen – pskink

+0

Sie sollten dies als Antwort hinzufügen. Es ist jedoch nicht perfekt, da es erfordert, dass Cursor in aufsteigender Reihenfolge nach einem eindeutigen Schlüssel sortiert werden, den ich bereitstelle, aber es könnte das Beste sein, was ich sowieso bekomme. – st1hy

Antwort

0

Ich bin schließlich zu der Schlussfolgerung gekommen, dass diese Idee unnötig kompliziert ist und tatsächlich das Iterieren über Cursor gut genug ist.

CursorJoiner intern aber vergleicht Cursor mit etwas restriktiverem Verhalten. Wenn Sie absteigende Reihenfolge verwenden möchten oder keine eindeutigen Spalten haben, ist das Verhalten undefiniert, so dass Sie kein Glück haben.

/** 
* @return position of new item or -1 if item could not be found inside the cursor 
*/ 
private int getNewItemPosition(@NonNull Cursor cursor, @NonNull Tag dao) { 
    int idColumn = cursor.getColumnIndexOrThrow(TagDao.Properties.Id.columnName); 
    long newDaoId = dao.getId(); 
    while (cursor.moveToNext()) { 
     if (newDaoId == cursor.getLong(idColumn)) { 
      return cursor.getPosition(); 
     } 
    } 
    return -1; 
} 

Mein erster Einwand über die Leistung nicht gültig zumindest im Maßstab entpuppte dass Android Apps verwenden und so weise Meister sagte optimiere nicht etwas, es sei denn, Tests seine ein Problem zeigen.

0

Die Anrufe insert oder update auf SQLite Gegenzug pro doc,

* @return the row ID of the newly inserted row, or -1 if an error occurred 

So brauchen Sie nur diese zurück, und Sie werden Ihre Reihe kennen, und notifyItemInserted

verwenden können
+0

Nicht wirklich. Wie ich in Frage gestellt habe (vielleicht war ich nicht klar hier) zeige ich Ergebnis einer Abfrage mit Sortierung, so dass die unwahrscheinliche Zeilen-ID die Position vom Cursor abgleicht. – st1hy

Verwandte Themen