2

Android とデスクトップの両方で使用したい Java ライブラリを開発しています。Android は、android.database.sqlite私が使用したいクラスを提供しますが、明らかにデスクトップ システムでは使用できません。(これは唯一の Android 依存関係です。)

私はJavaにかなり慣れていません。これが C または C++ の場合、プラットフォームに応じて、さまざまなバージョンのラッパー クラスを使用して SQLite にアクセスします。そのようなことはJavaで可能ですか?もしそうなら、どのように? それがこれを処理する最善の方法ですか?

4

2 に答える 2

2
public interface DbAccessLibrary  ..

public class AndroidDbAccessLibrary implements DbAccessLibrary  ..

public class DesktopDbAccessLibrary implements DbAccessLibrary  ..

DbAccessLibrary accessLibrary;
try {
    getClass().getClassLoader().loadClass("android.database.sqlite.SQLiteDatabase");
    accessLibrary = new AndroidDbAccessLibrary();
} catch (ClassNotFoundException ex) {
    accessLibrary = new DesktopDbAccessLibrary();
}
于 2013-09-01T03:05:11.997 に答える
1

移植可能にしたい場合はandroid.database.sqlite、直接使用できません。@msh が提案したように、インターフェースの背後に隠す必要があります。独自のインターフェースを発明する代わりに、既存のインターフェースを使用できます: java-jdbc :

csv と sqlite データベースの間で変換するポータブル android/java-se ライブラリを作成しました。

ライブラリの初期化により、他の jdbc インターフェイス (接続、ステートメントなど) へのアクセスを許可する jdbc ドライバー (java.sql.Driver) が取得されます。

org.sqldroid.SQLDroidDriverは、android 側ではオープンソースの android jdbc ドライバー、java-se-side ではorg.sqlite.JDBCを使用できます。

Android側でjdbcドライバーマネージャーを使用すると問題が発生したため new org.sqldroid.SQLDroidDriver()、ライブラリを初期化する代わりにAndroidクライアント側で使用しました

私のポータブル ライブラリは 3 つのライブラリで終了しました。

  • @msh -s answer で説明されているように、android と java-se の実装の違いを隠す csv/sql とインターフェイスを含む 1 つのポータブル ライブラリ
  • インターフェイスの 1 つの Android 固有の実装と
  • インターフェイスの 1 つの java-se 固有の実装。

現在、プラットフォーム固有の部分にはログ記録のみがあります (log4j または android ログによって実装されています)。

java-se での統合テストは Android 側よりもはるかに簡単であるため、csv lib は両方のプラットフォームでうまく機能します。これは技術ライブラリです。

しかし、私はビジネスコードを共有ライブラリに入れることに失敗しました。多くの android api-s は、android-sandbox (コンテキスト) に依存しており、アクティビティ、ブロードキャストなどが継承され、java-se には存在しません。

于 2013-09-01T06:49:28.707 に答える