Так так. Похоже, то, что я намеревался достичь и предположил, что это простая задача, намного сложнее!

имаюсь разработкой приложения, которое хочу сделать доступным как для Android, так и для Blackberry (возможно, для JavaME в будущем). Бизнес-логика будет общей для всех платформ, а следовательно, и соответствующий уровень в коде.

Но у меня также есть слой данных - который, очевидно, будет отличаться для разных платформ. Мой подход к этому - иметь бин и абстрактный класс DataStore. Если бы я использовал пример Android NotePad, он бы выглядел так:

Примечание Бин:

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);
}

Каждая платформа будет реализовывать интерфейс хранилища данных и выполнять постоянный доступ к данным в зависимости от ситуации. Например, реализация Android будет использовать классы SQLite для этой цели.

Таким образом, «слои» более высокого уровня будут общими для всех платформ - при условии, что они не используют какие-либо специфичные для платформы функции.

Вопрос:

Разве функциональность хранилища данных выше (частично) не пересекается с функциональностьюContentProvider в Android? Я думал о различных подходах, чтобы сделать это «чище», но я не убежден ни в одном из них:

Есть мойContentProvider также реализовать интерфейс DataStore. Но разве это не загромождает ContentProvider, не говоря уже о том, чтобы «перепутать» обязанности?

Реализовать доступ SQLite вContentProvider - и затем реализация DataStore «вызывает» ContentProvider под прикрытием. Но как насчет накладных расходов дополнительного слоя? Кроме того, мне все равно нужно было бы использовать ContentProvider напрямую, например, для использования Android Search Framework. Разве это не похоже на дублирование одинаковых функций в нескольких слоях?

Обратный подход, описанный выше - то есть реализация SQLite на уровне хранилища данных; а затем иметьContentProvider позвони ему под одеяло. Я не могу думать о том, как это отличается от предыдущего подхода.

Итог - если бы не былоContentProvider - просто слой DataStore будет работать нормально, и этот дизайн позволит использовать бизнес-логику на разных платформах. Единственная причина, по которой я не могу полностью отказаться от ContentProviders, заключается в том, что некоторые компоненты системы Android ожидают, что вы представите данные как ContentProvider (например, Search).

Буду признателен за любые советы о том, как вы справились с этим в своих приложениях. Заранее спасибо.

РЕДАКТИРОВАТЬ:

Пока не так много ответов. Какие-нибудь советы по повторному использованию кода между различными платформами? Или, может быть, мне нужно перефразировать мой вопрос? (Извините - я новичок в SO. Не уверен, что протокол для "напоминаний").

Ответы на вопрос(2)

Ваш ответ на вопрос