Мне нужно разделить одну базу данных между двумя приложениями. Я знаю, что база данных будет создана в / data / data / MY_PACKAGE / databases /. Поскольку имена пакетов различаются, можно ли определить путь к одному имени пакета при создании базы данных в любом приложении? Спасибо.
Делитесь базой данных SQLite между двумя приложениями для Android?
Ответы (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, установка общего идентификатора пользователя запоздалым образом не сработает.
Надеюсь это поможет.
Путь к базе данных является частным для каждого приложения, и, насколько я знаю, получить к нему доступ напрямую через приложения невозможно.
Однако один подход заключается в том, что одно приложение делает свою базу данных доступной для другого с помощью ContentProvider. Проверьте, работает ли это для вас.
Поставщики контента хранят и извлекают данные и делают их доступными для всех приложений. Это единственный способ обмениваться данными между приложениями; нет общего хранилища, доступного для всех пакетов Android.
Пока вы используете один и тот же сертификат в обоих приложениях, ваши приложения будут работать в одном процессе и вести себя как одно и то же приложение. См. Этот раздел документации Android http://developer.android.com/tools/publishing/app-signed.html#strategy.