web-dev-qa-db-ja.com

2 Androidアプリ間でSQLiteデータベースを共有しますか?

2つのアプリ間で単一のデータベースを共有する必要があります。データベースが/ data/data/MY_PACKAGE/databases /に作成されることを知っています。パッケージ名が異なるため、いずれかのアプリでデータベースを作成するときに、1つのパッケージ名へのパスを定義できますか?ありがとう。

53
bond

確かに、2つのアプリ間で単一のデータベースを共有できます。

アプリ間でデータを共有するには(同じ発行元から発行されている場合)、両方のアプリのAndroidManifest.xmlで共有ユーザーIDを指定する必要があります。

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:sharedUserId="my.app" ... >

(文書化されていませんが、共有ユーザーIDは少なくとも1つのドット区切り文字を含む文字列である必要があります)

残りは簡単で、データベースパスをいじる必要はありません。両方のアプリで同じDBAdapterを使用するだけです。データベースをホストするアプリで、ネイティブコンテキストを使用してDBAdapterを呼び出します。

DBadapter hostDBAdapter = new DbAdapter(getApplicationContext());
performerDBadapter.open();

2番目のアプリで、データベースホスティングアプリのコンテキストを使用してデータベースにアクセスします。
最初に、共有コンテキストを定義します。

Context sharedContext = null;
    try {
        sharedContext = this.createPackageContext("replace.with.Host.package.name", Context.CONTEXT_INCLUDE_CODE);
        if (sharedContext == null) {
            return;
        }
    } catch (Exception e) {
        String error = e.getMessage(); 
        return;
        }   

次に、共有コンテキストでDBAdapterを開きます。

DbAdapter sharedDBadapter = new PerformerDbAdapter(sharedContext);
sharedDBadapter.open();

最後に、マニフェストで共有ユーザーIDを設定する前にデータベースが存在する場合、データベースからロックアウトしないように、物理デバイスでアプリをアンインストール/再インストールする必要があります(sqliteエラー14)。一方、エミュレーターはより寛容であることが証明されるかもしれません。結論として、アプリがAndroidマーケットで公開されている場合、後付けで共有ユーザーIDを設定しても機能しません。

お役に立てれば。

82

データベースパスは各アプリケーションに対してプライベートであり、私が知る限り、アプリケーション間で直接アクセスすることはできません。

ただし、1つのアプローチは、1つのアプリケーションが ContentProvider を使用して、データベースにアクセスできるようにすることです。それがあなたのために働くかどうかをチェックしてください。

コンテンツプロバイダーは、データを保存および取得し、すべてのアプリケーションからアクセスできるようにします。アプリケーション間でデータを共有する唯一の方法です。すべてのAndroidパッケージがアクセスできる共通のストレージ領域はありません。

5
mibollma

両方のアプリケーションで同じ証明書を使用する限り、アプリケーションは同じプロセスで実行され、同じアプリケーションとして動作しますAndroid documentation http:// developer。 Android.com/tools/publishing/app-signing.html#strategies

1
Charleston