Как получить доступ к файлу базы данных на устройстве Android [приложение Xamarin с Entity Framework для SQLite] - PullRequest
0 голосов
/ 13 октября 2019

Я новичок в мобильном программировании, я пытаюсь создать приложение базы данных в Xamarin Forms, есть Entity Framework SQLite для легкой работы с базой данных. После прочтения статей я настроил свое приложение так:

public partial class App : Application
    {
        public const string DbFileName = "DailyAppDatabase.db";
        string dbPath = DependencyService.Get<IPath>().GetDatabasePath(DbFileName);

        public App()...
     }

В проекте Android я реализовал метод, который возвращает путь к базе данных:

return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), filename);

, этот метод возвращает "/data/user/0/com.companyname.daily_app/files/DailyAppDatabase.db"

Я думаю, что мне следует поискать файл базы данных здесь (я хочу получить этот файл и открыть егов браузере баз данных SQLite). Но я не могу использовать эмуляторы, моя система виртуализации не работает, я отлаживаю свое приложение на физическом некорневом устройстве Android 7.0. Как я могу это сделать? Я посмотрел много похожих тем:

Как получить доступ к папке данных / данных на устройстве Android?

Получить базу данных или любой другой файл из внутреннего хранилища, используя run-as

, но не нашел ответа , мне действительно нужна помощь, я попробовал следующий метод:

1) с помощью команды оболочки adb chmod 666 /data/user/0/com.companyname.daily_app/files/DailyAppDatabase.db

2) adb shell -> run-as com.your.packagename -> cp /data/data/com.your.packagename/

Но результат выполнения этих команд на моем устройстве запрещен, я попробовал этот метод:

     string _databasePath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "DailyAppDatabse.db");      
            if (!File.Exists(_databasePath))
                return;
            Stream myInput = new FileStream(_databasePath, FileMode.Open);
            Stream myOutput = Assets.Open("database.db");

            byte[] buffer = new byte[1024];
            int b = buffer.Length;
            int length;
            while ((length = myInput.Read(buffer, 0, b)) > 0)
            {
                myOutput.Write(buffer, 0, length);
            }
            myOutput.Flush();
            myOutput.Close();
            myInput.Close();

Но я думаю, это неправильный способ решения проблемы, получить исключение "метод myOutput. запись (...) не поддерживается. Возможно, кто-то сталкивался с этой проблемой и может помочь, я не хочу получать root-доступ, и мне нравится подход с первым кодом в EntityFramework Core для SQLite

1 Ответ

0 голосов
/ 14 октября 2019

Я нашел решение, это было так сложно для меня. Следующий алгоритм:

1) создание файла резервной копии (обратите внимание на атрибут android: allowBackup = true в манифесте приложения)

adb backup -f "\location\on\local\drive" -noapk app.package.name

2) распаковка .ab file to .tar file using abe.jar

3) в папке .tar есть файлы и файл базы данных

, может быть, это кому-нибудь поможет в будущем

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