【问题标题】:Xamarin Forms Sqlite Android 7+ SupportXamarin Forms Sqlite Android 7+ 支持
【发布时间】:2019-03-20 21:39:11
【问题描述】:

我一直在使用 sqlite-net-pcl 插件,但 Play 商店现在需要一个应用程序至少以 Android 版本 7 为目标。

当我以此为目标(目标 Android 版本 - 7.1)时,应用程序无法打开/创建数据库,它仅适用于较低版本的 Android,例如 5。 我知道有可能导致此问题的安全更改,但我不知道如何解决。

我得到了一个像Path.Combine(global::Android.OS.Environment.ExternalStorageDirectory.Path, filename);这样的android数据路径

然后在启动我的应用程序时尝试像这样打开数据库连接

string dbPath = DependencyService.Get<IFileHelper>().GetLocalFilePath("myDbName.db3"); var conn = new SQLiteAsyncConnection(dbPath);

我想使用SQLiteAsyncConnection 来处理表锁。

例外是:

未处理的异常: SQLite.SQLiteException: Could not open database file: /storage/emulated/0/myDbName.db3 (CannotOpen)

我还确保我已经勾选了外部存储权限的读写。 我使用的插件是 https://github.com/praeclarum/sqlite-net,这是 xamarin 表单在其文档中推荐的。

【问题讨论】:

  • 在更新到 android 8 有目标版本后,我这边一切正常。你的 sqllite nuget 包是最新的吗?
  • 感谢您的回复!

标签: sqlite xamarin xamarin.forms xamarin.android


【解决方案1】:

我认为您要做的是将数据库文件保存到外部存储位置。您需要授予应用程序写入外部存储的权限(AppManifest -> 读/写外部存储)。完成后,您可以在设备设置(应用程序->[应用程序名称]->权限)中启用权限以进行测试,或者您可以使用the Permissions Plugin by James Montemagno 启用对存储的读/写。必须访问数据库文件之前授予权限。

我也在使用相同的插件。我已将数据库初始化(请求存储权限后)设置如下:

/* Request storage permissions first!! */

// After granting storage permissions...
string dbPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments);
string databaseFileName = "MyDatabase.db";
string fullDatabasePath = System.IO.Path.Combine(dbPath, databaseFileName);
_connection = new SQLiteConnection(fullDatabasePath);

我没有尝试过使用SQLiteAsyncConnection,但应该不会有太大区别。

【讨论】:

  • 谢谢汤姆,是的,你是对的。我并没有主动征求用户的许可!我已经开始使用一些 android 代码来请求许可,但没有插件。该插件似乎也似乎是awaitable? (等待用户批准或拒绝请求?)
  • @user3737964 是的,权限请求是awaitable,因为代码必须等待用户授予/拒绝权限。你可以在这里找到一个示例实现:github.com/jamesmontemagno/PermissionsPlugin#in-action。您只需输入所需的权限(在您的情况下为“存储”)。请记住在尝试访问任何文件/文件夹之前检查是否已授予权限!
【解决方案2】:

我认为 sqlite 数据库文件不是用户必须查看和访问的东西。所以不要将它存储在本地文件夹中。

正如我在类似的reddit post.. 上所说的那样。如果您将数据库存储在应用程序的个人文件夹中,则可以跳过所有权限问题。然后,您不必请求权限。检查this official article,它解释了不同android版本的权限,尤其是最后的the graph

【讨论】: