RUDE

Как открыть базу данных SQLite, созданную одним приложением Xamarin для Android, в другом приложении?

У меня есть приложение Xamarin для Android, которое создает базу данных SQLite. После переустановки этого приложения я не могу открыть БД с новой версией приложения. В целях тестирования файл БД находится в папке «Загрузки». Когда приложение только что обновлено, а не переустановлено, оно обычно обращается к БД.

Мотивация: получить независимый файл БД, который можно было бы использовать в качестве резервной копии на случай переноса приложения на другое устройство.

Обновлено:

Приложение.xaml.cs:

public partial class App : Application
{
    private readonly static string _dirPath = "/storage/emulated/0/Download/InventoryApp";
    private static InvDB _database;            
    public static InvDB Database
    {
        get
        {
            if (_database == null)
            {
                string dbFileName = "InventoryDB.db3";
                _database = new InvDB(Path.Combine(_dirPath, dbFileName));
            }
            return _database;
        }

    }
    // ....
}

Конструктор класса базы данных:

public class InvDB
{
    readonly SQLiteAsyncConnection conn;

    public const SQLite.SQLiteOpenFlags Flags =        
    SQLite.SQLiteOpenFlags.ReadWrite |
    SQLite.SQLiteOpenFlags.Create |
    SQLite.SQLiteOpenFlags.FullMutex;

    public InvDB(string dbPath)
    {
        if(File.Exists(dbPath))
        {
            conn = new SQLiteAsyncConnection(dbPath, Flags);
            conn.CreateTableAsync<Item>().Wait();
            conn.CreateTableAsync<Room>().Wait();
        }
    }
    // ....
}

1
47
1

Ответ:

Решено

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

Вы можете проверить эту ссылку: Не удается записать во внешнее хранилище Android даже с установленными разрешениями

Если это все еще не работает, вы можете попробовать предоставить приложению разрешение «Доступ ко всем файлам», но я не рекомендую этого делать.

Вы можете проверить ответ, который я опубликовал несколько месяцев назад: Как запросить разрешение manage_external_storage в Xamarin.Android

Обновлять:

Похоже, что папка Download особенная, я создаю в ней файл txt и пытаюсь записать его с разрешением на запись во внешнее хранилище. Но я потерпел неудачу, в официальном документе говорится:

If your app wants to access a file within the MediaStore.Downloads collection that your app didn't create, you must use the Storage Access Framework. To learn more about how to use this framework, see the guide on how to access documents and other files.

Вы можете проверить официальный документ: https://developer.android.com/training/data-storage/shared/media#scoped_storage_enabled

Затем я добавляю <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> в файл манифеста и использую код по ссылке, которую я предоставил выше, чтобы запросить разрешение MANAGE_EXTERNAL_STORAGE. Я успешно пишу файл.

Таким образом, вы также можете попробовать сделать это или use the Storage Access Framework, как говорится в официальном документе, открыть файл базы данных в папке загрузки.