Совместно использовать базу данных SQLite между двумя приложениями для Android?

44

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

Теги:
database
sharing

3 ответа

76

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

Для обмена данными между приложениями (при условии, что они выпущены одним и тем же издателем) вам нужно указать общий идентификатор пользователя в 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, установка общего идентификатора пользователя в запоздалой мысли не будет работать.

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

  • 0
    Большое спасибо, сэр. SharedUserId действительно необходим
  • 4
    Это было потрясающей помощью, но все же оставило меня с проблемой, а именно, как предотвратить потерю БД при удалении «первого» приложения. Пожалуйста, смотрите ссылку .
Показать ещё 10 комментариев
5

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

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

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

1

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

  • 0
    Совместное использование БД - это хорошо, пока вы не столкнетесь с конфликтами, в конце концов мне пришлось отказаться от этого и перейти к лучшему дизайну поставщиков баз данных. Заставьте одно приложение создать провайдера, и тогда оба приложения смогут отправлять запросы одному и тому же провайдеру. Теперь у вас есть управляющий класс, который может определять, заблокирована база данных или нет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню