Совместно использовать базу данных SQLite между двумя приложениями для Android? - PullRequest
52 голосов
/ 14 августа 2011

Мне нужно разделить одну базу данных между двумя приложениями.Я знаю, что база данных будет создана на / data / data / MY_PACKAGE / database /.Поскольку имена пакетов различны, можно ли определить путь к одному имени пакета при создании базы данных в любом приложении?Благодарю.

Ответы [ 3 ]

81 голосов
/ 29 октября 2011

Вы, безусловно, можете совместно использовать одну базу данных между двумя приложениями.

Чтобы обмениваться данными между приложениями (при условии, что они выпущены одним и тем же издателем), вам необходимо указать общий идентификатор пользователя в AndroidManifest.XML обоих приложений.

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

(недокументировано, но разделяемый идентификатор пользователя должен быть строкой хотя бы с одним разделителем точек)

Остальное легко, и вам не нужно возитьсяс путем к базе данных.Просто используйте один и тот же DBAdapter в обоих приложениях.В приложении, в котором размещена база данных, вызовите DBAdapter с собственным контекстом.

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

Во втором приложении перейдите к базе данных с контекстом приложения для размещения базы данных.
Сначала определите общий контекст:

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

В заключение: если ваша база данных существует до установки общего идентификатора пользователя в манифесте, вам потребуется удалить / переустановить приложения на физическом устройстве, иначезаблокировать себя из базы данных (ошибка sqlite 14).Эмулятор, с другой стороны, может оказаться более щадящим.В итоге, если ваши приложения публикуются на рынке Android, установка общего идентификатора пользователя в запоздалой мысли не будет работать.

Надеюсь, это поможет.

5 голосов
/ 14 августа 2011

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

Однако один из подходов состоит в том, что одно приложение делает свою базу данных доступной для другого с помощью ContentProvider . Проверьте, работает ли это для вас.

Поставщики контента хранят и извлекают данные и делают их доступными для все приложения. Это единственный способ обмена данными между Приложения; Там нет общей области хранения, что все пакеты Android можно получить доступ.

1 голос
/ 02 июня 2014

Пока вы используете один и тот же сертификат в обоих приложениях, ваши приложения будут работать в одном и том же процессе и работать как одно и то же приложение, проверьте этот раздел документации для Android http://developer.android.com/tools/publishing/app-signing.html#strategies

...