我在为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哪个实际上不是问题。什么问题是重大成果。如果响应太大而无法记忆,该怎么办?我应该防止这种情况吗? 我应该关心吗?
那么哪种方法更可取?以及如何解决这些问题?
答案 0 :(得分:1)
正如您所指出的,第二种方法将提供更好的封装,因为调用者将处理熟悉的域模型(Note)对象而不是数据库游标的列表。要处理大型数据集的问题,this answer可能会有所帮助。