#android #database
#Android #База данных
Вопрос:
Я создавал платную версию своего первого приложения.
Я хотел бы скопировать существующую базу данных в новое платное приложение.
Как это возможно?
Редактировать
В бесплатном приложении я использую SQLiteOpenHelper
. Они могут использовать ту же базу данных, но хотели бы использовать SQLiteOpenHelper
снова и не могут понять, как заставить это использовать другую базу данных, поскольку приложения имеют разные имена пакетов (если они используют тот же dos’т бесплатная база данных не удаляется при удалении приложения?).
Пожалуйста, прокомментируйте, если вам нужна дополнительная информация (и, возможно, какая информация вам нужна :))
Комментарии:
1. Без дополнительной информации невозможно сказать. Есть ли причина, по которой они не могут подключиться к одной базе данных?
Ответ №1:
У вас есть несколько вариантов, вы не получите пакет с другим именем для прямого взаимодействия с другой базой данных пакетов.
-
Таким образом, вы могли бы закодировать
Content Provider
в бесплатное приложение, затем разрешить платной версии собирать данные у поставщика контента, а затем при первом запуске передавать все данные через. На мой взгляд, это несколько громоздко, но будет означать, что пользователю не нужна SD-карта, вы также сохраняете контроль над данными, Т. Е. Если пользователь уже использовал платную версию, вы можете добавить данные в базу данных, а не заменять новую на старую бесплатную… -
Вы можете сохранить базу данных на SD-карту из бесплатной версии, а затем собрать ее с помощью платной версии. В зависимости от того, сколько вы хотите кодировать, вы можете настроить
Broadcast Receiver
в бесплатном приложении, а затемsendBroadcast()
в платной версии, таким образом, когда бесплатное приложение получает широковещательную передачу, оно переносит свою базу данных на SD-карту, затем платное приложение собирает ее. Другим способом было бы, если бы пользователь нажал кнопку сохранения в бесплатной версии, сделал резервную копию на SDcard, затем пользователь нажимает кнопку в платной версии и получает ее — это может быть так же просто, как скопировать файл и заменить базу данных приложения, или вы могли бы импортировать его в платное приложение как другую базу данных, обработать его, добавив то, что вам нужно, в основную базу данных, а затем удалить его.
В качестве очень свободного и простого указателя вы можете скопировать базу данных на SD-карту с помощью чего-то вроде этого, это очень урезанный рабочий фрагмент кода, поэтому его следует считать до некоторой степени непроверенным — вам нужно будет добавить несколько блоков catch в местах, чтобы заставить его работать вместе с разрешениями на чтение и запись для SD-карты в манифесте:
// Get hold of the db:
InputStream myInput = new FileInputStream("/data/data/com.package.name/databases/database-name");
// Set the output folder on the SDcard
File directory = new File("/sdcard/someFolderName");
// Create the folder if it doesn't exist:
if (!directory.exists())
{
directory.mkdirs();
}
// Set the output file stream up:
OutputStream myOutput = new FileOutputStream(directory.getPath() "/database-name.backup");
// Transfer bytes from the input file to the output file
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0)
{
myOutput.write(buffer, 0, length);
}
// Close and clear the streams
myOutput.flush();
myOutput.close();
myInput.close();
Восстановление очень похоже:
// Set location for the db:
OutputStream myOutput = new FileOutputStream("/data/data/com.package.name/databases/database-name");
// Set the folder on the SDcard
File directory = new File("/sdcard/someFolderName");
// Set the input file stream up:
InputStream myInput = new FileInputStream(directory.getPath() "/database-name.backup");
// Transfer bytes from the input file to the output file
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0)
{
myOutput.write(buffer, 0, length);
}
// Close and clear the streams
myOutput.flush();
myOutput.close();
myInput.close();
Однако я бы посоветовал сначала выполнить некоторые проверки и немного опросить пользователя:
- Проверьте, существует ли файл уже на SDcard, если да, то хотят ли они перезаписать его.
- Проверьте, что они хотят перезаписать текущую базу данных резервной
- Вам также нужно будет выполнить некоторые проверки, например, установлена ли SDcard и т. Д.
Как я уже сказал, приведенный выше код на самом деле просто дает вам небольшой намек на то, как вы могли бы использовать SDcard для перемещения базы данных.
Комментарии:
1. Спасибо за очень подробный ответ. Думаю, я попробую решение с контент-провайдером, поскольку я знаю людей, использующих приложение без SD-карты. Может быть, я тоже смогу чему-нибудь научиться по пути:)
2. @Bastaix, Привет, не мог бы ты поделиться своим решением, пожалуйста! Я пытаюсь реализовать точно то же самое через
FileProvider
, но безуспешно. ЕстьSecurityException
везде, куда я иду.