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

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


person bond    schedule 13.08.2011    source источник
comment
groups.google.com/group/android-developers/browse_thread/thread/ эта ветка о чем-то похожем; посмотрим, поможет ли это   -  person Kevin Qiu    schedule 14.08.2011


Ответы (3)


ОБНОВЛЕНИЕ: метод, описанный ниже, основан на android:sharedUserId, устаревшем с уровня API 29 (Android 10).

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

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

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

person Daniel Szmulewicz    schedule 28.10.2011
comment
Это была отличная помощь, но все еще оставалась проблема, а именно, как предотвратить потерю базы данных при удалении первого приложения. См. ссылку. - person Peri Hartman; 27.12.2012
comment
Правда, не официальным способом. Думаю, документация Android рекомендует поставщикам контента обмениваться данными между приложениями. Это больше похоже на хак (удобный). - person Daniel Szmulewicz; 20.06.2013
comment
Я согласен с Дэниелом, официальный способ - это контент-провайдеры. Я бы посоветовал всем не прибегать к подобным хитростям, вроде того, что поставщики контента к настоящему времени хорошо документированы и поняты, и есть много примеров и т. Д. - person Michael Kariv; 10.02.2014
comment
Я пытаюсь сделать то же самое с двумя приложениями для Android, созданными в Eclipse. Вам также нужно включить исходный файл для DBadapter в оба проекта приложений? - person giannileuani; 24.02.2014
comment
Я не понимаю, что такое DbAdapter или PerformerDbAdapter, я не вижу таких классов в Android API. Просьба уточнить - person ultraon; 14.07.2015
comment
DbAdapter не является частью API, но является хорошо известным шаблоном в мире Android, по крайней мере, так было, когда был написан пост выше. Вот полное изложение. lecturesnippets.com/android-sqlite-dbadapter-class - person Daniel Szmulewicz; 15.07.2015
comment
Что произойдет, если оба приложения обращаются к базе данных одновременно с транзакцией? В моих тестах происходит блокировка базы данных ошибок. - person Ismael; 28.01.2016
comment
Не используйте этот прием, если к вашей базе данных будет обращаться более одного клиента одновременно. - person Daniel Szmulewicz; 28.01.2016
comment
Должны ли мы использовать контент-провайдеров вместо этого метода? - person DeaMon1; 10.11.2017
comment
Да, вам следует предпочесть контент-провайдеров. - person Daniel Szmulewicz; 10.11.2017
comment
Раньше было хорошим вариантом ... sharedUserId теперь устарел с API 29 - person DennisWelu; 07.01.2021

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

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

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

person mibollma    schedule 13.08.2011

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

person Charleston    schedule 02.06.2014
comment
Совместное использование БД - это хорошо, пока вы не столкнетесь с конфликтами, в конце концов мне пришлось отказаться от этого и перейти к лучшему дизайну поставщиков баз данных. Сделайте одно приложение создателем поставщика, и тогда оба приложения смогут отправлять запросы одному и тому же поставщику. Теперь у вас есть управляющий класс, который может определять, заблокирована база данных или нет. - person JPM; 02.06.2014