Перейти к содержанию
Fire Monkey от А до Я
  • 0

Импорт/экспорт БД


Вадим Шавров

Вопрос

Приветствую. Как реализовать экспорт БД из программы, расположенной по адресу:

 2018-05-03_10-13-53.thumb.png.d54695ef94f679b521d16ee2d1a0450d.png

Т.е. чтобы выводилось стандартное андройдовское окно (см. скрин), как во многих приложениях при нажатии на кнопку "поделится", и там допустим можно было бы эту базу залить на Яндекс.Диск.

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

Можно ли это как-то реализовать?

1666241421_Screenshot__Android_20180503-100223.thumb.png.38c7751efaf3516ff7ea7cfc7fdf930e.png

Ссылка на комментарий

Рекомендуемые сообщения

  • 2

Вот так:

procedure ShareFile(aFileName, aComment : String);
{$IFDEF ANDROID}
var Intent    : JIntent;
    uri       : Jnet_Uri;
    AttachmentFile: JFile;
    S : String;
{$ENDIF ANDROID}
begin
{$IFDEF ANDROID}
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_SEND);
  Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  S:=TPath.GetFileName(aFileName);
  Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(aComment));
  Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(aComment));
  AttachmentFile := TJFile.JavaClass.init(StringToJString(aFileName));
  Uri := TJnet_Uri.JavaClass.fromFile(AttachmentFile);
  Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, TJParcelable.Wrap((Uri as ILocalObject).GetObjectID));
  Intent.setType(StringToJString('text/plain'));
//  Intent.setDataAndType(StrToJURI('file:' + TPath.Combine(TPath.GetSharedDownloadsPath, 'picture.png')), StringToJString ('image/png'));
  SharedActivity.startActivity(Intent);
{$ENDIF ANDROID}
end;

Из давнего проекта, возможно нужно будет подправить согласно сообщениям компилятора.

P.S. И файл должен находится в общедоступной папке (к примеру TPath.GetSharedDocumentsPath)

Изменено пользователем Евгений Корепов
Ссылка на комментарий
  • 0

Да, конечно. Что то из этих, лишнее уберите:

  Androidapi.JNI.Webkit,
  FMX.Platform.Android,
  Androidapi.Helpers,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNIBridge,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.Net,
  Androidapi.JNI.Os,
 

Ссылка на комментарий
  • 0

Вроде бы ошибок нет, а как правильно её вызывать?

ShareFile('storage/emulated/0/Documents/data.db', ???);

aFileName - это полный путь к файлу или только название "data.db'?

aComment - а это я вообще не понимаю для чего :(

Ссылка на комментарий
  • 0
15 минут назад, Вадим Шавров сказал:

Вроде бы ошибок нет, а как правильно её вызывать?

ShareFile('storage/emulated/0/Documents/data.db', ???);

aFileName - это полный путь к файлу или только название "data.db'?

aComment - а это я вообще не понимаю для чего :(

Конечно полный путь, откуда иначе функция узнает какой файл отправлять?

AComment - комментарий, типа "Это файл №199 из такого то приложения, служит для того то". Но никто не заставляет вас его писать.

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

И убедитесь в существовании файла перед его отправкой.

Ссылка на комментарий
  • 0
В 03.05.2018 в 10:23, Вадим Шавров сказал:

Приветствую. Как реализовать экспорт БД из программы, расположенной по адресу:

 2018-05-03_10-13-53.thumb.png.d54695ef94f679b521d16ee2d1a0450d.png

Т.е. чтобы выводилось стандартное андройдовское окно (см. скрин), как во многих приложениях при нажатии на кнопку "поделится", и там допустим можно было бы эту базу залить на Яндекс.Диск.

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

Можно ли это как-то реализовать?

1666241421_Screenshot__Android_20180503-100223.thumb.png.38c7751efaf3516ff7ea7cfc7fdf930e.png

Здравствуйте Вадим Шавров.

Моё имя Олег. Могу ли я Вам задать по этой теме вопросы?

Ссылка на комментарий
  • 0
В 03.05.2018 в 12:21, Вадим Шавров сказал:

Всё работает, огромное Вам СПАСИБО!

Здравствуйте Вадим.

Пожалуйста ответьте мне на такой вопрос по этой теме.

Я пытаюсь отправить файл базы вот так:

//Поделится БД
procedure TForm_glavn.ButtonПоделитсяБДClick(Sender: TObject);
begin
if FileExists(TPath.GetSharedDocumentsPath+'/DB_BOKA.db3') then
begin
   Try
   ShareFile(TPath.GetSharedDocumentsPath+'/DB_BOKA.db3', 'Это файл DB_BOKA.db3 из приложения БОКА.');
   ShowMessage('Отправлено.');
   Except
   ShowMessage('Не отправлено.');
   End;
end else ShowMessage('Файл '+TPath.GetSharedDocumentsPath+'/DB_BOKA.db3'+' не найден.');
end;

себе на почту.

 Появляется сообщение что файл не найден.   Наверное дело в пути? Подскажите пожалуйста как узнать где лежит файл базы на телефоне? Поделитесь пожалуйста своим опытом.

С Уважением. Олег.

 

Изменено пользователем Олег Киреев
Ссылка на комментарий
  • 0
В 03.05.2018 в 10:29, Евгений Корепов сказал:

Вот так:


procedure ShareFile(aFileName, aComment : String);
{$IFDEF ANDROID}
var Intent    : JIntent;
    uri       : Jnet_Uri;
    AttachmentFile: JFile;
    S : String;
{$ENDIF ANDROID}
begin
{$IFDEF ANDROID}
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_SEND);
  Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  S:=TPath.GetFileName(aFileName);
  Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(aComment));
  Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(aComment));
  AttachmentFile := TJFile.JavaClass.init(StringToJString(aFileName));
  Uri := TJnet_Uri.JavaClass.fromFile(AttachmentFile);
  Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, TJParcelable.Wrap((Uri as ILocalObject).GetObjectID));
  Intent.setType(StringToJString('text/plain'));
//  Intent.setDataAndType(StrToJURI('file:' + TPath.Combine(TPath.GetSharedDownloadsPath, 'picture.png')), StringToJString ('image/png'));
  SharedActivity.startActivity(Intent);
{$ENDIF ANDROID}
end;

Из давнего проекта, возможно нужно будет подправить согласно сообщениям компилятора.

P.S. И файл должен находится в общедоступной папке (к примеру TPath.GetSharedDocumentsPath)

Здравствуйте Евгений.

Пожалуйста ответьте мне на такой вопрос по этой теме.

Я пытаюсь отправить файл базы вот так:

//Поделится БД
procedure TForm_glavn.ButtonПоделитсяБДClick(Sender: TObject);
begin
if FileExists(TPath.GetSharedDocumentsPath+'/DB_BOKA.db3') then
begin
   Try
   ShareFile(TPath.GetSharedDocumentsPath+'/DB_BOKA.db3', 'Это файл DB_BOKA.db3 из приложения БОКА.');
   ShowMessage('Отправлено.');
   Except
   ShowMessage('Не отправлено.');
   End;
end else ShowMessage('Файл '+TPath.GetSharedDocumentsPath+'/DB_BOKA.db3'+' не найден.');
end;

себе на почту.

 Появляется сообщение что файл не найден.   Наверное дело в пути? Подскажите пожалуйста как узнать где лежит файл базы на телефоне? Поделитесь пожалуйста своим опытом.

С Уважением. Олег.

Ссылка на комментарий
  • 0
32 минуты назад, Олег Киреев сказал:

Здравствуйте Евгений.

Пожалуйста ответьте мне на такой вопрос по этой теме.

Я пытаюсь отправить файл базы вот так:

//Поделится БД
procedure TForm_glavn.ButtonПоделитсяБДClick(Sender: TObject);
begin
if FileExists(TPath.GetSharedDocumentsPath+'/DB_BOKA.db3') then
begin
   Try
   ShareFile(TPath.GetSharedDocumentsPath+'/DB_BOKA.db3', 'Это файл DB_BOKA.db3 из приложения БОКА.');
   ShowMessage('Отправлено.');
   Except
   ShowMessage('Не отправлено.');
   End;
end else ShowMessage('Файл '+TPath.GetSharedDocumentsPath+'/DB_BOKA.db3'+' не найден.');
end;

себе на почту.

 Появляется сообщение что файл не найден.   Наверное дело в пути? Подскажите пожалуйста как узнать где лежит файл базы на телефоне? Поделитесь пожалуйста своим опытом.

С Уважением. Олег.

Файл будет лежать там, куда вы его положили. Откуда нам знать где на вашем телефоне может лежать какой то файл? 

Ссылка на комментарий
  • 0
В 16.11.2019 в 15:19, Евгений Корепов сказал:

Файл будет лежать там, куда вы его положили. Откуда нам знать где на вашем телефоне может лежать какой то файл? 

Дело в том что этот файл задеплоин так:

1536490910__.thumb.jpg.9a7af7cf0712816bf9a36b24858c15c0.jpg.

Я пытаюсь узнать действительно ли он там вот так:

//поиск файла
procedure TForm_glavn.Button10Click(Sender: TObject);
var
  FileToFind: string;
begin
  FileToFind := FileSearch('.\assets\external\DB_BOKA.db3', GetCurrentDir);
  if FileToFind = '' then
    ShowMessage('Не смог найти: ' + 'DB_BOKA.db3' + '.')
  else
    ShowMessage('Нашёл в каталоге ' + FileToFind + '.');
end;

Сообщение показывает "Не смог найти".

Подскажите пожалуйста что здесь не так?

С Уважением. Олег Киреев.

Ссылка на комментарий
  • 0
6 минут назад, Олег Киреев сказал:

Дело в том что этот файл задеплоин так:

1536490910__.thumb.jpg.9a7af7cf0712816bf9a36b24858c15c0.jpg.

Я пытаюсь узнать действительно ли он там вот так:

//поиск файла
procedure TForm_glavn.Button10Click(Sender: TObject);
var
  FileToFind: string;
begin
  FileToFind := FileSearch('.\assets\external\DB_BOKA.db3', GetCurrentDir);
  if FileToFind = '' then
    ShowMessage('Не смог найти: ' + 'DB_BOKA.db3' + '.')
  else
    ShowMessage('Нашёл в каталоге ' + FileToFind + '.');
end;

Сообщение показывает "Не смог найти".

Подскажите пожалуйста что здесь не так?

С Уважением. Олег Киреев.

Олег, если файл деплоится в external, то путь к нему надо получать так:

TPath.Combine(TPath.GetSharedDocumentsPath, 'DB_BOKA.db3')
Ссылка на комментарий
  • 0
1 час назад, mazayhin сказал:

Олег, если файл деплоится в external, то путь к нему надо получать так:


TPath.Combine(TPath.GetSharedDocumentsPath, 'DB_BOKA.db3')

СпасиБО. Буду знать.

Но я до этого  попробовал задеплоить сюда .\assets\Download\ и приложение нашло его так:

//поиск файла
procedure TForm_glavn.Button10Click(Sender: TObject);
var
  FileToFind: string;
begin
  FileToFind := FileSearch('/storage/emulated/0/Android/data/com.embarcadero.BOKA/files/Download/DB_BOKA.db3', GetCurrentDir);
  if FileToFind = '' then
    ShowMessage('Не смог найти: ' + 'DB_BOKA.db3' + '.')
  else
    ShowMessage('Нашёл в каталоге ' + FileToFind + '.');
end;

Ссылка на комментарий
  • 0

А ещё подскажите пожалуйста почему зависает телефон когда я отправляю файл так:

//Поделится БД
procedure TForm_glavn.ButtonПоделитсяБДClick(Sender: TObject);
begin
if FileExists(TPath.GetDownloadsPath+'/DB_BOKA.db3') then
begin
   Try
   ShareFile(TPath.GetDownloadsPath+'/DB_BOKA.db3', 'Это файл DB_BOKA.db3 из приложения БОКА.');
   Sleep(100);
   ShowMessage('Отправлено.');
   Except
   ShowMessage('Не отправлено.');
   End;
end else ShowMessage('Файл '+TPath.GetDownloadsPath+'/DB_BOKA.db3'+' не найден.');
end;

Хотя файл и сообщение отправляются нормально на указанный мной в приложении адрес. Хотя я поставил скобки исключения.

С Уважением. Олег Киреев.

Ссылка на комментарий
  • 0
47 минут назад, Олег Киреев сказал:

СпасиБО. Буду знать.

Но я до этого  попробовал задеплоить сюда .\assets\Download\ и приложение нашло его так:

//поиск файла
procedure TForm_glavn.Button10Click(Sender: TObject);
var
  FileToFind: string;
begin
  FileToFind := FileSearch('/storage/emulated/0/Android/data/com.embarcadero.BOKA/files/Download/DB_BOKA.db3', GetCurrentDir);
  if FileToFind = '' then
    ShowMessage('Не смог найти: ' + 'DB_BOKA.db3' + '.')
  else
    ShowMessage('Нашёл в каталоге ' + FileToFind + '.');
end;

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

Посмотрите статью https://delphifmandroid.blogspot.com/2014/02/deployment-manager.html

Там описано про пути деплоя, и как потом найти на устройстве, используя System.IOUtils

Ссылка на комментарий
  • 0
1 час назад, mazayhin сказал:

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

Посмотрите статью https://delphifmandroid.blogspot.com/2014/02/deployment-manager.html

Там описано про пути деплоя, и как потом найти на устройстве, используя System.IOUtils

СпасиБо с этим разобрался. 

А ещё подскажите пожалуйста почему зависает телефон когда я отправляю файл так:

//Поделится БД
procedure TForm_glavn.ButtonПоделитсяБДClick(Sender: TObject);
begin
if FileExists(TPath.GetDownloadsPath+'/DB_BOKA.db3') then
begin
   Try
   ShareFile(TPath.GetDownloadsPath+'/DB_BOKA.db3', 'Это файл DB_BOKA.db3 из приложения БОКА.');
   Sleep(100);
   ShowMessage('Отправлено.');
   Except
   ShowMessage('Не отправлено.');
   End;
end else ShowMessage('Файл '+TPath.GetDownloadsPath+'/DB_BOKA.db3'+' не найден.');
end;

Хотя файл и сообщение отправляются нормально на указанный мной в приложении адрес. Хотя я поставил скобки исключения.

С Уважением. Олег Киреев.

Ссылка на комментарий
  • 0
13 минут назад, Олег Киреев сказал:

СпасиБо с этим разобрался. 

А ещё подскажите пожалуйста почему зависает телефон когда я отправляю файл так:

//Поделится БД
procedure TForm_glavn.ButtonПоделитсяБДClick(Sender: TObject);
begin
if FileExists(TPath.GetDownloadsPath+'/DB_BOKA.db3') then
begin
   Try
   ShareFile(TPath.GetDownloadsPath+'/DB_BOKA.db3', 'Это файл DB_BOKA.db3 из приложения БОКА.');
   Sleep(100);
   ShowMessage('Отправлено.');
   Except
   ShowMessage('Не отправлено.');
   End;
end else ShowMessage('Файл '+TPath.GetDownloadsPath+'/DB_BOKA.db3'+' не найден.');
end;

Хотя файл и сообщение отправляются нормально на указанный мной в приложении адрес. Хотя я поставил скобки исключения.

С Уважением. Олег Киреев.

Возможно? это связано с восстановлением подключения к БД? На момент от правки она закрыта?

Если попробовать отправить другой какой-то файл, который не используется приложением, будет ли эта проблема?

Ссылка на комментарий
  • 0
3 часа назад, mazayhin сказал:

Возможно? это связано с восстановлением подключения к БД? На момент от правки она закрыта?

Если попробовать отправить другой какой-то файл, который не используется приложением, будет ли эта проблема?

Попробовал другой файл. Та же проблема зависает телефон. Может что ещё подскажете?

Ссылка на комментарий
  • 0

Сам спросил и сам ответил:

Сделал проще вот так:

//Поделится БД
procedure TForm_glavn.ButtonПоделитсяБДClick(Sender: TObject);
begin
if FileExists(TPath.GetDownloadsPath+'/DB_BOKA.db3') then
  begin
  ShareFile(TPath.GetDownloadsPath+'/DB_BOKA.db3', 'Это файл DB_BOKA.db3 из приложения БОКА.');
  Application.ProcessMessages;
  end else ShowMessage('Файл '+TPath.GetDownloadsPath+'/DB_BOKA.db3'+' не найден.');
Form_glavn.Realign;
end;

Теперь телефон не зависает.

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...