Android和其他平台应用程序之间的逻辑代码重用:到ContentProvider还是不到ContentProvider?
我正在开发一个应用程序,我想让它同时适用于Android和Blackberry(将来可能适用于JavaME)。业务逻辑对于所有平台都是通用的——因此,代码中的相应层也是通用的 但我也有一个数据层,这对于不同的平台来说显然是不同的。我的方法是拥有一个bean和一个抽象数据存储类。如果我使用Android的记事本示例,它将如下所示: 注意Bean: 数据存储接口:Android和其他平台应用程序之间的逻辑代码重用:到ContentProvider还是不到ContentProvider?,android,code-reuse,android-contentprovider,Android,Code Reuse,Android Contentprovider,我正在开发一个应用程序,我想让它同时适用于Android和Blackberry(将来可能适用于JavaME)。业务逻辑对于所有平台都是通用的——因此,代码中的相应层也是通用的 但我也有一个数据层,这对于不同的平台来说显然是不同的。我的方法是拥有一个bean和一个抽象数据存储类。如果我使用Android的记事本示例,它将如下所示: 注意Bean: 数据存储接口: 公共接口NoteDataStore{ 公共布尔删除注释(长注释ID); 公共布尔添加注释(注释); 公共列表listNotes(); 公
公共接口NoteDataStore{
公共布尔删除注释(长注释ID);
公共布尔添加注释(注释);
公共列表listNotes();
公共布尔editNote(长noteId,Note);
公共列表搜索(字符串搜索字符串);
}
每个平台都将实现数据存储接口,并根据需要执行持久数据访问。例如,Android实现将为此使用SQLite类
这样,更高级别的“层”在所有平台之间都是通用的,只要它们不使用任何特定于平台的功能
问题:
上面的数据存储功能(部分)是否与Android中的ContentProvider
功能重叠?我想到了各种方法来让这个“更干净”,但我不相信其中任何一种:
- 让我的
也实现数据存储接口。 但是,这难道不会让内容提供者感到混乱,更不用说“混淆”责任了吗ContentProvider
- 在
中实现SQLite访问,然后让数据存储实现“调用”ContentProvider。 但是,额外一层的开销呢?另外,我还需要直接使用ContentProvider,例如使用Android搜索框架。这不就像在多个层中复制相同的功能吗ContentProvider
- 与上述方法相反-即,在数据存储层中实现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有多成功java.util.List
。JavaME上没有这些功能。
因此,最好手动编写这些平台的XML/JSON解析/框架逻辑。这就引出了一个问题——一旦编写了这样一个解析器,为什么不在Android上重用它呢@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);
}