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

Android和其他平台应用程序之间的逻辑代码重用:到ContentProvider还是不到ContentProvider?,android,code-reuse,android-contentprovider,Android,Code Reuse,Android Contentprovider,我正在开发一个应用程序,我想让它同时适用于Android和Blackberry(将来可能适用于JavaME)。业务逻辑对于所有平台都是通用的——因此,代码中的相应层也是通用的 但我也有一个数据层,这对于不同的平台来说显然是不同的。我的方法是拥有一个bean和一个抽象数据存储类。如果我使用Android的记事本示例,它将如下所示: 注意Bean: 数据存储接口: 公共接口NoteDataStore{ 公共布尔删除注释(长注释ID); 公共布尔添加注释(注释); 公共列表listNotes(); 公

我正在开发一个应用程序,我想让它同时适用于Android和Blackberry(将来可能适用于JavaME)。业务逻辑对于所有平台都是通用的——因此,代码中的相应层也是通用的

但我也有一个数据层,这对于不同的平台来说显然是不同的。我的方法是拥有一个bean和一个抽象数据存储类。如果我使用Android的记事本示例,它将如下所示:

注意Bean:

数据存储接口:

公共接口NoteDataStore{
公共布尔删除注释(长注释ID);
公共布尔添加注释(注释);
公共列表listNotes();
公共布尔editNote(长noteId,Note);
公共列表搜索(字符串搜索字符串);
}
每个平台都将实现数据存储接口,并根据需要执行持久数据访问。例如,Android实现将为此使用SQLite类

这样,更高级别的“层”在所有平台之间都是通用的,只要它们不使用任何特定于平台的功能

问题:

上面的数据存储功能(部分)是否与Android中的
ContentProvider
功能重叠?我想到了各种方法来让这个“更干净”,但我不相信其中任何一种:

  • 让我的
    ContentProvider
    也实现数据存储接口。 但是,这难道不会让内容提供者感到混乱,更不用说“混淆”责任了吗

  • ContentProvider
    中实现SQLite访问,然后让数据存储实现“调用”ContentProvider。 但是,额外一层的开销呢?另外,我还需要直接使用ContentProvider,例如使用Android搜索框架。这不就像在多个层中复制相同的功能吗

  • 与上述方法相反-即,在数据存储层中实现SQLite;然后将
    ContentProvider
    调用隐藏起来。我想不出这与以前的方法有什么不同

底线是——如果不是因为
ContentProvider
——只有数据存储层可以正常工作,这种设计将使业务逻辑可以跨平台重用。我不能完全放弃ContentProviders的唯一原因是Android系统的某些组件希望您将数据作为ContentProvider公开(例如,搜索)

如果您能在应用程序中提供有关如何处理此问题的任何提示,我将不胜感激。提前谢谢

编辑:

到目前为止,没有多少回应。关于不同平台之间的代码重用有什么建议吗?或者,我需要重新表述我的问题?(对不起,我是新来的。不确定“提醒”的协议是什么)

业务逻辑对于所有平台都是通用的——因此,代码中的相应层也是通用的

Android和其他版本之间的绝大多数代码都会有所不同。Blackberry和J2ME与Android共享几十个类,主要是
java.io
java.util
。甚至您的“业务逻辑”也很可能需要三个类库交叉点之外的类

因此,我一点也不担心试图拥有一个公共代码库。普通设计,当然。可互换的数据模型,当然。实际的文字代码,不值得担心,IMHO

上面的数据存储功能(部分)是否与Android中的ContentProvider功能重叠

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

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


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

这个问题现在已经超越了ContentProvider点,进入了更广泛的领域。我确实用第二个要点实现了我在原始问题中发布的内容,即

ContentProvider
中实现
SQLite
访问,然后让
DataStore
实现在封面下“调用”
ContentProvider

然而,随着我的继续,我发现在保持代码的公共性方面有更多这样的挑战。举几个例子:

  • java.util.List
    在Blackberry和JavaME平台上不可用。唯一的解决方法是使用数组或
    向量
    。在安卓系统中使用
    Vector
    s有多成功

  • 用于将POJO绑定到XML/JSON的库在JavaME/BB平台上无法正常工作。其中一些库使用反射(GSON),而大多数库使用注释,或者至少
    java.util.List
    。JavaME上没有这些功能。 因此,最好手动编写这些平台的XML/JSON解析/框架逻辑。这就引出了一个问题——一旦编写了这样一个解析器,为什么不在Android上重用它呢

  • JavaME/BB不支持泛型。虽然这本身不是什么“问题”(因为我所有的代码都是内部的,而不是API),但我要么在Eclipse中看到太多警告,要么在代码中有太多的
    @SuppressWarnings(“rawtypes”)


  • 好吧,好吧。看来,我开始要实现的,并假定是一个简单的任务,毕竟要复杂得多

    我想说,实际代码重用的程度取决于业务逻辑。我在联系人同步ap上工作过
    public class Note {
        private long id;
        private String title;
        private String note;
        private long created;
        private long modified;
    
        //Appropriate constructors
        //Getters and Setters
    }
    
    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);
    }