在我正在构建的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
方法会回复Place
个列表,每个列表都包含Image
个对象的集合。
update
方法更新Place
及其图片(如有必要,更新,插入新图片或删除现有图片)。
add
方法会在图片中添加新的Place
。
delete
方法会删除Place
及其所有图片。
findAll
,add
和delete
方法非常容易实现。
但是,我没有看到实现update
方法的直接方法,该方法考虑了多值属性。我想到的程序算法是:
Place
对象要更新的当前持久图像。Image
对象的images
属性中不再存在的Place
个对象并删除它们。images
属性中存在的持久图像。images
属性中的新图片。我认为这段代码会变得丑陋而且效率低下。 有没有更好的方法来实现DAO? 在使用DAO的应用程序中,您是否希望将每个DAO始终映射到一个物理表?
我考虑过在这种情况下使用两个不同的DAO,一个用于持久化Place
个对象,另一个用于Image
个对象。那么Place
DAO不会对图像对象的持久性负责,而是“业务”层应该保持它们的一致性。
但是,Image
在概念上是Place
个对象的一部分,因此这个解决方案并不能完全说服我。
非常感谢您的反馈!
注意:目前我对使用Android的ORM框架不感兴趣,只是想从概念的角度找到这个问题的答案。
答案 0 :(得分:1)
我是ORMLite的作者,它为你做了所有这些,但有几种方法你可以自己做。
您可以编写自己的List
类(Collection
更容易)来实现您想要的方法:add
,remove
等。这些都是更改列表并通过DAO方法调用。对于示例代码,您可以查看ORMLite如何执行此操作BaseForeignCollection
和EagerForeignCollection
,但这可能会因您的需求而过度。
您提到的更容易手动维护列表。也许在PlaceDataSource
上添加方法(看起来像DAO而不是DataSource
)可以从列表和中删除数据库。类似的东西:
class PlaceDataSource {
/** deletes image at location index from list and removes from database */
public void deleteImage(Place place, int index);
/** add image to the list and to the database */
public void addImage(Place place, Image image);
...
您必须确保不直接使用该列表,否则它将与数据库不同步。
您也可以在Place
本身上使用这些方法,然后为每个Place
对象注入其DAO。有些人喜欢这种模式,但我一直认为在另一个类中使用DAO方法更清晰。
希望这有帮助。