【发布时间】:2012-01-24 16:14:14
【问题描述】:
在我正在构建的 Android 应用程序中,我将关系查询封装在模型层中。
我的一个对象,我们称之为Place,有一个多值属性(我们称之为Image)。简化一下,我可以说 Java 中的模型如下所示:
class Place{
List<Image> images;
...
}
class Image {
String description;
String imageName;
...
}
在数据库中,这些类被映射到表 PLACE 和 IMAGE。
在 Java 端,我使用 DAO 来查询、插入、更新和删除 Place 对象。
作为一个简化的示例,我希望有一个名为 PlaceDataSource 的类,如下所示:
class PlaceDataSource {
public List<Place> findAll();
public void update(Place place);
public void add(Place place);
public void delete(Place place);
...
}
这些方法的描述如下:
findAll 方法回答Places 的列表,其中每个都包含Image 对象的集合。
update 方法更新 Place 及其图像(更新、插入新图像或在必要时删除现有图像)。
add 方法添加了一个新的 Place 及其图像。
delete 方法删除 Place 及其所有图像。
findAll、add 和 delete 方法很容易实现。
但是,我还没有看到一种直接的实现update 方法的方法,它考虑了多值属性。我想到的程序算法是:
- 从数据库中查询
Place对象中当前保存的图像以进行更新。 - 找出
Place对象的images属性中不再存在哪些Image对象并将其删除。 - 更新存在于
images属性中的持久图像。 - 在
images属性中添加新图像。
我认为这段代码会变得丑陋和低效。 有没有更好的方法来实现 DAO? 在您使用 DAO 的应用程序中,您是否希望每个 DAO 始终映射到一个物理表?
我曾考虑在这种情况下使用两种不同的 DAO,一种用于持久化Place 对象,另一种用于Image 对象。然后Place DAO 将不负责图像对象的持久性,而是“业务”层应该使它们保持一致。
但是,Images 在概念上是 Place 对象的一部分,所以这个解决方案也不能完全说服我。
非常感谢您的反馈!
注意:目前我对使用 Android 的 ORM 框架不感兴趣,只是想从概念的角度找到这个问题的答案。
【问题讨论】:
标签: java android orm relational-database