База данных Xamarin SqlLite в Android Внутреннее общее хранилище - PullRequest
0 голосов
/ 02 мая 2018

Мое приложение будет использоваться в автономном режиме, и я планирую ежедневную синхронизацию push / push через кабель USB Мои пользователи находятся в очень примитивной ситуации: нет Wi-Fi и нет вышек сотовой связи. Мой вопрос не о синхронизации, а скорее о получении доступа к данным, чтобы я мог синхронизироваться.

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

Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData); 
Environment.GetFolderPath(Environment.SpecialFolder.Personal);
Android.App.Application.Context.FilesDir.AbsolutePath;

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

Я тоже пробовал это, но он взрывается:

Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath;

Я попытался отладить Xamarin Live, но затем я получил эту ошибку:

"Вам необходимо вызвать SQLitePCL.raw.SetProvider ();"

Я попытался добавить console.writeline и Log.Error, чтобы добавить некоторые диагностические данные, но я не могу найти какие-либо файлы журнала во Внутреннем общем хранилище.

У меня есть разрешения WRITE_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE в манифесте; хотя я думаю, что в этом нет необходимости.

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

Я редко обращался за помощью в течение 40 лет, но я занимался этим несколько дней. Спасибо!

Ответы [ 3 ]

0 голосов
/ 13 мая 2018

Чтобы получить файлы на внутреннее общее хранилище, доступное через USB, потребовалось 3 шага: 1: получить разрешения во время выполнения ActivityCompat.RequestPermissions (активность, новая строка [] {Manifest.Permission.WriteExternalStorage, Manifest.Permission.ReadExternalStorage}, 1);

2) используйте этот путь: string extPath = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath; extPath = Path.Combine (extPath, "RtTrace.txt"); File.AppendAllText (extPath, «новый контент» + System.Environment.NewLine);

3) Медиа сканирует полученный файл, чтобы сделать его видимым: MediaScannerConnection.ScanFile (Android.App.Application.Context, new String [] {extPath}, null, null);

0 голосов
/ 13 мая 2018

Путь на Environment.SpecialFolder.Personal относится к закрытой области, к которой имеет доступ только приложение (и сама ОС, например, когда вы удаляете данные из приложения). Я не знаю о ApplicationData.

Вы можете легко скопировать файл приложения (защищенный) в общую папку, например Downloads, или создать новую папку MyAppDirectory в общедоступном хранилище, которая разрешит доступ с других устройств. Затем вы можете очистить локальные данные, которые вам больше не нужны (после процесса синхронизации).

Чтобы создать новую общую папку на Android:

var folder = System.IO.Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, "MyAppDirectory");

System.IO.Directory.CreateDirectory(folder);

Вы получите это:

enter image description here

Затем скопируйте файл:

var newFile = Path.Combine(folder, "MySharedFile"); // The database, xml, json, text or any file you want to share
var sourceFullName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal),"MyOriginalFile");

System.IO.File.Copy(sourceFullName, newFile, true /* overwrite */);

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

0 голосов
/ 02 мая 2018

База данных SQLite хранится в частной памяти приложения и не может быть доступна через USB, попробуйте экспортировать содержимое вашей БД во внешний файл во внутренней памяти или во внешнюю память, чтобы иметь доступ к нему через USB-аккорд.

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