Экспорт таблицы базы данных Sqlite как csv из Android приложения с использованием sqlite3 программно - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь добавить функцию облачного экспорта / импорта в мое текущее приложение Android.

Я хочу разрешить своим пользователям экспортировать определенную таблицу базы данных Sqlite в Google Drive в формате csv.

Я понимаю, что могу выполнить оператор select и "вручную" создать файл csv.

Однако я хотел бы подход, который напоминает выполнение этих команд sqlite3

>sqlite3 c:/sqlite/chinook.db
sqlite> .headers on
sqlite> .mode csv
sqlite> .output data.csv
sqlite> SELECT customerid,
   ...>        firstname,
   ...>        lastname,
   ...>        company
   ...>   FROM customers;
sqlite> .quit

В идеале я хотел бы иметь возможность напрямую экспортировать в Google листы

Можно ли упаковать sqlite3 с моим приложением и программно выполнить вышеуказанные команды?

1 Ответ

3 голосов
/ 25 марта 2020

Возможен ли экспорт, sqlite3 в csv?

Да, это довольно простая операция, мы можем сделать это программно с помощью различных методов. Как и ответили здесь экспорт SQLite в CSV и здесь Экспорт базы данных SQLite в CSV-файл в android, а также здесь Как реализовать Экспорт SQLite в Excel / CSV-файл в android? и многие ответы и решения доступны на The StackOverFlow.

Но как с помощью команд sqlite3?

Если вы действительно хотите сделать это с помощью команд , ты можешь это сделать. Но это будет действительно удачный c способ, потому что команды выглядят простыми на терминале, но они действительно ужасны программно. Вам нужны привилегии суперпользователя или вам нужно установить приложение как системное приложение. Если вы действительно хотите это сделать, давайте начнем,

Во-первых, мы сможем правильно понять основы. Android запустите Linux ядро ​​внизу. Теперь, если вам нужно запустить на нем свой процесс с привилегиями суперпользователя (запустите его как root), единственный способ выполнить ваш процесс - через командную строку, потому что это единственный способ, которым вы можете напрямую взаимодействовать с ядром. Также вам нужно использовать su перед выполнением любой команды.

Process process = Runtime.getRuntime().exec("su");

почти ничего не сделает sh. Он просто запросит привилегию супер использования с помощью диалога. Что вы можете сделать, это вместо того, чтобы просто выполнить su, вы можете выполнить свой процесс с помощью su следующим образом:

Process process = Runtime.getRuntime().exec(new String[] { "su", "-c", yourCommand});

Таким образом, ваши команды выглядят так:

Process process = Runtime.getRuntime().exec(new String[] { "su", "-c", "sqlite3 /data/data/your-package-name/databases/file.db", ".headers on",".mode csv","...and all other operations"});

- c Option

Среди наиболее часто используемых опций su есть - c, который указывает su выполнить команду, которая следует непосредственно за ней в той же строке. Такая команда выполняется как новый пользователь, и затем окно терминала или консоль, из которой был запущен su, немедленно возвращается к учетной записи бывшего пользователя после завершения выполнения команды или после закрытия любой запущенной программы.

Альтернативный вариант

Альтернативой вышеприведенному методу является еще один способ, который может работать - использовать командную строку для копирования приложения в каталог /system/app/. Тогда ваше приложение будет автоматически запускаться с привилегиями root (так же, как системные приложения)

Какой способ предпочтительнее?

Мне лично нравится первый способ, потому что работа над Команды оболочки в приложении android не являются гибкими. Сейчас многие провайдеры блокируют команды su на уровне ядра, выполняемые из сторонних приложений.

Надеюсь, это помогает. Спасибо!

...