簡體   English   中英

Android 和其他平台的應用程序之間的邏輯代碼重用:到 ContentProvider 還是不到 ContentProvider?

[英]Logic code reuse between apps for Android and other platforms: To ContentProvider or not to ContentProvider?

我正在開發一個應用程序,我想為 Android 和 Blackberry 提供(將來可能提供給 JavaME)。 業務邏輯對所有平台都是通用的——因此,代碼中的相應層也是如此。

但我也有一個數據層——這顯然與各種平台不同。 我的方法是擁有一個 bean 和一個抽象的 DataStore class。 如果我使用的是 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 類。

這樣,更高級別的“層”將在所有平台之間通用——只要它們不使用任何特定於平台的功能。

問題:

上面的 DataStore 的功能(部分)是否與 Android 中的ContentProvider的功能重疊? 我想到了各種方法來使這個“更干凈”,但我不相信其中任何一個:

  • 讓我的ContentProvider也實現 DataStore 接口。 但是,這不會使 ContentProvider 變得混亂,更不用說“混淆”職責了嗎?

  • ContentProvider中實現 SQLite 訪問 - 然后讓 DataStore 實現在幕后“調用” ContentProvider。 但是,額外層的開銷呢? 另外,我仍然需要直接使用 ContentProvider,例如使用 Android 搜索框架。 這不就像在多個層中復制相同的功能嗎?

  • 與上述方法相反——即在DataStore層實現SQLite; 然后讓ContentProvider在幕后調用它。 我想不出這與以前的方法有什么不同。

底線是 - 如果不是ContentProvider - 只有 DataStore 層可以正常工作,並且這種設計將使業務邏輯可跨平台重用。 我不能完全放棄 ContentProvider 的唯一原因是 Android 系統的某些組件希望您將數據公開為 ContentProvider(例如,搜索)。

對於您如何在應用程序中處理此問題的任何提示,我將不勝感激。 提前致謝。

編輯:

目前回復的不多。 關於不同平台之間代碼重用的任何提示? 或者,我需要重新表述我的問題? (我很抱歉 - 我是 SO 的新手。不確定“提醒”的協議是什么)。

業務邏輯對所有平台都是通用的——因此,代碼中的相應層也是如此。

Android 和您的其他版本之間的絕大多數代碼都會有所不同。 Blackberry and J2ME share a few dozen classes with Android, mostly in java.io and java.util . 甚至您的“業務邏輯”也很可能需要三個 class 庫交集之外的類。

因此,我一點也不擔心嘗試擁有一個通用代碼庫。 通用設計,當然。 當然,可互換的數據模型。 實際的文字代碼,不值得擔心,恕我直言。

上面的 DataStore 的功能(部分)是否與 Android 中的 ContentProvider 的功能重疊?

API 在操作方面重疊。 就是這樣。

我不能完全放棄 ContentProvider 的唯一原因是 Android 系統的某些組件希望您將數據公開為 ContentProvider(例如,搜索)。

沒錯,但在這些情況下,無論如何,“Android 系統”將不支持您的數據 model。 例如,搜索需要一個相當具體的ContentProvider實現,而不僅僅是任何舊的實現。

這個問題現在已經超出了 ContentProvider 的范疇,進入了更廣泛的領域。 我確實使用第二個要點實現了我在原始問題中發布的內容 - 即,

ContentProvider中實現SQLite訪問 - 然后讓DataStore實現在幕后“調用” ContentProvider

然而,隨着我的繼續,我看到了更多這樣的挑戰,試圖保持代碼的通用性。 幾個例子:

  1. java.util.List在 Blackberry 和 JavaME 平台上不可用。 唯一的解決方法是使用 arrays 或Vectors 在 Android 中使用Vector有多大影響?

  2. 將 POJO 綁定到 XML/JSON 的庫在 JavaME/BB 平台上不能很好地工作。 其中一些庫使用反射(GSON),而其中大多數使用注釋,或者至少java.util.List 這些在 JavaME 上都不可用。 因此,最好手動為這些平台編寫 XML/JSON 解析/框架邏輯。 這就引出了一個問題——一旦努力編寫這樣一個解析器,為什么不在 Android 上重用它呢?

  3. JavaME/BB 不支持 Generics。 雖然這不是一個“問題”本身(因為我的所有代碼都是內部的 - 不是 API),但我會在 Eclipse 中看到太多警告,或者在我的代碼中有太多@SuppressWarnings("rawtypes")

好吧。 看起來我打算實現並假設是一項簡單的任務畢竟要復雜得多!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM