在Android应用程序中组织数据层

时间:2016-08-05 20:31:44

标签: android sqlite

我在为Android应用程序设计数据层时遇到问题。更准确地说,我不明白应该返回类似查询的函数。我有这样的解决方案:

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

这种方法存在问题。要使用结果,您必须知道查询:列及其类型。这违反了封装。这种方法也会给单元测试带来问题。

但我看到了另一种方法:

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

至少我们保持封装,但我在这里看到其他问题。它似乎不是内存性能方法。我不能使用CursorAdapter和CursorLoader,不能设置autorequerying哪个实际上不是问题。什么问题是重大成果。如果响应太大而无法记忆,该怎么办?我应该防止这种情况吗? 我应该关心吗?

那么哪种方法更可取?以及如何解决这些问题?

1 个答案:

答案 0 :(得分:1)

正如您所指出的,第二种方法将提供更好的封装,因为调用者将处理熟悉的域模型(Note)对象而不是数据库游标的列表。要处理大型数据集的问题,this answer可能会有所帮助。