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

Самый короткий ответ, вероятно, будет «определение - исполнение», поэтому весь аргумент не имеет строгой точки зрения. В качестве более надуманного примера вы можете привести следующее:

def a(): return []

def b(x=a()):
    print x

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

Я согласен с тем, что при попытке использовать конструкторы по умолчанию, это будет gotcha.

45
задан bond 13 August 2011 в 23:53
поделиться

3 ответа

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

1
ответ дан Charleston 21 August 2018 в 10:55
поделиться
  • 1
    Совместное использование БД хорошо, пока вы не столкнетесь с конфликтами, в конце концов мне пришлось отказаться от этого и перейти к лучшему дизайну поставщиков баз данных. Сделайте одно приложение, создающее Провайдер, и затем оба приложения могут отправлять запросы одному и тому же провайдеру. Теперь у вас есть управляющий класс, который может диктовать, когда база данных заблокирована или нет. – JPM 2 June 2014 в 15:37

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

. Чтобы обмениваться данными между приложениями (при условии, что они выпущены одним и тем же издателем), вам нужно будет указать общий идентификатор пользователя в 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 error 14). С другой стороны, эмулятор может оказаться более прощающим. Итог, если ваши приложения опубликованы на рынке Android, установка общего идентификатора пользователя в запоздалой мысли не будет работать.

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

76
ответ дан Daniel Szmulewicz 21 August 2018 в 10:55
поделиться
  • 1
    Спасибо вам очень, сэр. Общий доступ к сети действительно необходим – Diljeet 28 July 2012 в 10:28
  • 2
    Это была огромная помощь, но все еще оставляет мне проблему - а именно, как предотвратить потерю db, когда «первая», приложение удалено. См. Ссылку . – Peri Hartman 27 December 2012 в 05:54
  • 3
    поэтому не правильный способ обмена данными между приложениями ... – njzk2 28 May 2013 в 15:50
  • 4
    Правда, не "официальный" путь. Документация на Android рекомендует контент-провайдерам для обмена данными между приложениями, я думаю. Это больше похоже на хак (удобный). – Daniel Szmulewicz 20 June 2013 в 16:50
  • 5
    Я согласен с Даниэлем, официальный путь - это контент-провайдеры. Я бы призвал всех не прибегать к хакам, как это, поставщики контента хорошо документированы и понятны к настоящему времени, и есть много примеров и т. Д. – Michael Kariv 10 February 2014 в 10:38

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

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

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

5
ответ дан mibollma 21 August 2018 в 10:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: