I'm developing an app which I want to make available both for Android and Blackberry (possibly to JavaME in the future). The business logic will be common to all the platforms - and hence, so will the corresponding layer in code.
But I also have a data layer - which will obviously be different to the various platforms. My approach to this is to have a bean and an abstract DataStore class. If I were using Android's NotePad sample, it would look like this:
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 Interface:
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);
}
Every platform would implement the datastore interface and perform the persistent data access as appropriate. The Android implementation, for example, would use SQLite classes for this purpose.
This way, the higher level "layers" would be common between all the platforms - as long as they do not use any platform-specific features.
Question:
Doesn't the functionality of the DataStore above (partially) overlap with that of the ContentProvider
in Android? I thought of various approaches to make this "cleaner" but I'm not convinced with any of them:
Have my
ContentProvider
also implement the DataStore interface. But, doesn't this clutter the ContentProvider, not to mention "mix up" the responsibilities?Implement SQLite access in the
ContentProvider
- and then have the DataStore implementation "call" the ContentProvider under the covers. But, what about the overhead of an additional layer? Plus, I would still need to use the ContentProvider directly, for example to use the Android Search Framework. Isn't that like duplicating the same functionality in multiple layers?Inverse of the above approach - i.e, implement the SQLite in the DataStore layer; and then have the
ContentProvider
call to it under the covers. I cannot think of how this is any different from the previous approach.
Bottom line is - if it wasn't for ContentProvider
- just the DataStore layer would work fine and this design would make the business logic reusable across platforms. The only reason I cannot entirely discard the ContentProviders is certain components of the Android system expect you to expose data as a ContentProvider (Search, for example).
I would appreciate any tips on how you have handled this in your apps. Thanks in advance.
EDIT:
Not many responses so far. Any tips at all on code reuse between various platforms? Or perhaps, I need to re-phrase my question? (I'm sorry - I'm new at SO. Not sure what the protocol is for "reminders").