我正在开发一个应用程序,我想为Android和Blackberry提供这些应用程序(将来可能会提供给JavaME)。业务逻辑对于所有平台都是通用的 - 因此代码中的相应层也是如此。
但我也有一个数据层 - 这显然会与各种平台不同。我的方法是拥有一个bean和一个抽象的DataStore类。如果我使用Android的NotePad示例,它将如下所示:
Note Bean:
public class Note {
private long id;
private String title;
private String note;
private long created;
private long modified;
//Appropriate constructors
//Getters and Setters
}
DataStore界面:
public interface NoteDataStore {
public boolean deleteNote(long noteId);
public boolean addNote(Note note);
public List<Note> listNotes();
public boolean editNote(long noteId, Note note);
public List<Note> search(String searchString);
}
每个平台都会实现数据存储区接口并根据需要执行持久数据访问。例如,Android实现将使用SQLite类来实现此目的。
这样,更高级别的“层”在所有平台之间都是通用的 - 只要它们不使用任何特定于平台的功能。
的问题: 的
以上(部分)DataStore的功能是否与Android中ContentProvider
的功能重叠?我想到了使这种“更清洁”的各种方法,但我不相信它们中的任何一种:
让我的ContentProvider
也实现DataStore接口。
但是,这不会使ContentProvider变得混乱,更不用说“混淆”责任吗?
在ContentProvider
中实现SQLite访问 - 然后让DataStore实现“调用”封面下的ContentProvider。
但是,附加层的开销怎么样?另外,我仍然需要直接使用ContentProvider,例如使用Android Search Framework。这不就像在多个层中复制相同的功能一样吗?
反转上述方法 - 即在DataStore层实现SQLite;然后在ContentProvider
下调用它。我想不出这与以前的方法有什么不同。
底线是 - 如果它不是ContentProvider
- 只是DataStore层可以正常工作,这种设计将使业务逻辑可以跨平台重用。我无法完全丢弃ContentProviders的唯一原因是Android系统的某些组件希望您将数据公开为ContentProvider(例如,搜索)。
如果您在应用中处理此问题,我们将不胜感激。提前谢谢。
修改 的
到目前为止反应不多。有关各种平台之间代码重用的任何提示吗?或许,我需要重新说出我的问题? (对不起 - 我是SO的新人。不确定“提醒”的协议是什么。)
答案 0 :(得分:1)
业务逻辑对所有平台都是通用的 - 因此代码中的相应层也是如此。
绝大多数代码在Android和其他版本之间会有所不同。 Blackberry和J2ME与Android共享几十个类,主要在java.io
和java.util
。即使你的“业务逻辑”也需要在三个类库的交集之外的类,很可能。
因此,我不会担心试图拥有一个共同的代码库。常见的设计,当然。可以互换的数据模型。实际的文字代码,不值得担心,恕我直言。
以上(部分)DataStore的功能是否与Android中ContentProvider的功能重叠?
API在操作方面重叠。就是这样。
我无法完全放弃ContentProviders的唯一原因是Android系统的某些组件希望您将数据公开为ContentProvider(例如,搜索)。
是的,但在这些情况下,“Android系统”无论如何都不会支持您的数据模型。例如,搜索需要一个相当具体的ContentProvider
实现,而不仅仅是任何旧实现。
答案 1 :(得分:1)
此问题现已超出ContentProvider点并进入更广泛的领域。我确实使用第二个要点实现了我在原始问题中发布的内容 - 即
在
SQLite
中实施ContentProvider
访问权限,然后DataStore
实施“调用”ContentProvider
隐藏
然而,随着我的继续,我在尝试保持代码共同时看到了更多这样的挑战。几个例子:
java.util.List
在Blackberry和JavaME平台上不可用。唯一的解决方法是使用数组或Vectors
。在Android中使用Vector
是多少?
用于将POJO绑定到XML / JSON的库在JavaME / BB平台上运行不正常。其中一些库使用反射(GSON),而大多数使用注释,或至少使用java.util.List
。 JavaME上没有这些功能。
因此,最好手动为这些平台编写XML / JSON解析/成帧逻辑。这引出了一个问题 - 一旦努力编写这样的解析器,为什么不在Android上重复使用它呢?
JavaME / BB不支持泛型。虽然这不是一个“问题”(因为我的所有代码都是内部的 - 而不是API),我会在Eclipse中看到太多警告,或者在我的代码中有太多@SuppressWarnings("rawtypes")
!