适用于Android和其他平台的应用程序之间的逻辑代码重用:对于ContentProvider还是不对ContentProvider?

时间:2011-07-09 16:34:40

标签: android code-reuse android-contentprovider

我正在开发一个应用程序,我想为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的新人。不确定“提醒”的协议是什么。)

2 个答案:

答案 0 :(得分:1)

  

业务逻辑对所有平台都是通用的 - 因此代码中的相应层也是如此。

绝大多数代码在Android和其他版本之间会有所不同。 Blackberry和J2ME与Android共享几十个类,主要在java.iojava.util。即使你的“业务逻辑”也需要在三个类库的交集之外的类,很可能。

因此,我不会担心试图拥有一个共同的代码库。常见的设计,当然。可以互换的数据模型。实际的文字代码,不值得担心,恕我直言。

  

以上(部分)DataStore的功能是否与Android中ContentProvider的功能重叠?

API在操作方面重叠。就是这样。

  

我无法完全放弃ContentProviders的唯一原因是Android系统的某些组件希望您将数据公开为ContentProvider(例如,搜索)。

是的,但在这些情况下,“Android系统”无论如何都不会支持您的数据模型。例如,搜索需要一个相当具体的ContentProvider实现,而不仅仅是任何旧实现。

答案 1 :(得分:1)

此问题现已超出ContentProvider点并进入更广泛的领域。我确实使用第二个要点实现了我在原始问题中发布的内容 - 即

  

SQLite中实施ContentProvider访问权限,然后DataStore实施“调用”ContentProvider隐藏

然而,随着我的继续,我在尝试保持代码共同时看到了更多这样的挑战。几个例子:

  1. java.util.List在Blackberry和JavaME平台上不可用。唯一的解决方法是使用数组或Vectors。在Android中使用Vector是多少?

  2. 用于将POJO绑定到XML / JSON的库在JavaME / BB平台上运行不正常。其中一些库使用反射(GSON),而大多数使用注释,或至少使用java.util.List。 JavaME上没有这些功能。 因此,最好手动为这些平台编写XML / JSON解析/成帧逻辑。这引出了一个问题 - 一旦努力编写这样的解析器,为什么不在Android上重复使用它呢?

  3. JavaME / BB不支持泛型。虽然这不是一个“问题”(因为我的所有代码都是内部的 - 而不是API),我会在Eclipse中看到太多警告,或者在我的代码中有太多@SuppressWarnings("rawtypes")

  4. 好吧,好吧。看起来我打算实现并假设是一个简单的任务毕竟要复杂得多!