2016-08-05 9 views
0

Ich habe Probleme bei der Gestaltung der Datenschicht für Android-Anwendungen. Genauer verstehe ich nicht, welche Abfrage-ähnliche Funktionen zurückkehren sollten. Ich hatte eine solche Lösung:Organisieren Datenschicht in Android-Anwendung

public class NotesDatabase { 
    // ... 
    public Cursor queryAllNotes() { 
     return helper.getReadableDatabase().query(...); 
    } 
} 

Es gibt Problem bei diesem Ansatz. Um das Ergebnis zu verwenden, müssen Sie query: columns und deren Typen kennen. Es ist Verletzung der Kapselung. Auch dieser Ansatz führt zu Problemen beim Komponententest.

Aber ich sah einen anderen Ansatz:

public class NotesDatabase { 
    // ... 
    public List<Note> queryAllNotes() { 
     Cursor c = helper.getReadableDatabase().query(...); 
     ArrayList<Note> notes = new ArrayList<>(c.getCount()); 
     while (c.moveToNext()) { 
      notes.add(new Note(c.getInt(), c.getText() ...)); 
     } 
     return notes; 
    } 
} 

Wenigstens halten wir Verkapselung aber ich sehe hier andere Probleme. Es scheint kein Speicher-performanter Ansatz zu sein. Ich kann CursorAdapter und CursorLoader nicht verwenden, kann keine automatische Abfrage festlegen, was eigentlich kein Problem ist. Was für ein Problem ist ein großes Ergebnis. Was ist zu tun, wenn die Antwort zu groß ist, um in den Speicher zu passen? Soll ich eine solche Situation verhindern? Sollte mich das interessieren?

Also welcher Ansatz ist vorzuziehen? Und wie löst man diese Probleme?

+0

Eigentlich bekomme ich Ihre Frage nicht. –

+0

@juergend Meine Frage ist, wie man Abfragefunktionen in der Datenschicht organisiert, um die Kapselung beizubehalten und mit großen Ergebnissen von Abfragen umzugehen? – Nolan

Antwort

1

Wie Sie bereits angemerkt haben, würde der zweite Ansatz eine bessere Kapselung bieten, da der Aufrufer eine Liste vertrauter Objekte des Domänenmodells (Note) anstelle eines Datenbank-Cursors behandeln würde. Um das Problem großer Datensätze zu lösen, kann this answer hilfreich sein.