【问题标题】:How to overwrite sqlite database for existing users in a Xamarin Forms app?如何覆盖 Xamarin Forms 应用程序中现有用户的 sqlite 数据库?
【发布时间】:2020-11-16 02:33:22
【问题描述】:

我们有一个 Xamarin Forms 应用程序。

我们有一些现有用户自去年以来一直在使用该应用程序,其中数据库文件名为 MyAppName.db

我们的新应用策略要求我们在应用中包含 .db (Sqlite),以确保我们可以包含持久信息并且在您安装应用时不需要互联网,这意味着我们希望为现有用户覆盖 db 文件.

在我们发布此数据库文件现在为 MyNewDbFile.db 的新更改后,我们的用户抱怨他们看不到任何数据,应用程序不会崩溃。

我们捕获错误报告,我们可以在我们的工具中看到一个常见错误,说明“未使用行值”,快速搜索表明该值不存在,因此“SELECT * FROM TABLE WHERE COLUMNAME”查询不起作用导致异常。

我们可以确认我们正在使用

Xamarin.Forms 4.5.x 版

sqlite-net-sqlcipher 1.6.292 版

我们没有任何复杂的逻辑,也看不到导致这种情况的非常具体的原因,因为当我们从 Alpha 通道或 TestFlight 测试我们的应用程序时不会产生这种情况。

【问题讨论】:

  • 能否提供错误信息的详细信息?您能否提供导致错误的查询?
  • @WendyZang-MSFT 我们进行了更多调查,我刚刚回答了这个问题。如果您认为还有更多内容,我也很乐意分享更多细节。感谢您的宝贵时间。

标签: xamarin.forms sqlite-net


【解决方案1】:

我们调查了问题的核心,可以确认问题的根源是设备文化信息。

我们一直在使用英语作为设备语言进行测试,但是当应用程序被使用除英语以外的任何其他语言的人使用时,查询会导致异常。

我们使用Xamarin Essentials 库来获取设备位置(这是可选的)。

返回的纬度和经度是特定于文化的。

因此,如果您在设备上使用西班牙语,则纬度和经度信息的格式是 ,(逗号)而不是 . (点)。

也就是说,纬度值类似于77.1234 它由 a 分隔。 (点)

但是对于设备上具有不同区域设置的用户,格式将更改为 77,1234 作为值,用 ,(逗号)分隔。

查询要求我们将值作为字符串,并且当不以 . 分隔时。 (dot) 执行失败:

查询:

if (deviceLocation != null)
   queryBuilder.Append($" ORDER BY((Latitude - {deviceLocation.Latitude})*(Latitude - {deviceLocation.Latitude})) +((Longitude - {deviceLocation.Longitude})*(Longitude - {deviceLocation.Longitude})) ASC");

deviceLocation 对象的类型为 Xamarin.Essentials.Location,它具有双纬度和经度值,但当用作字符串时,或者即使您明确执行 deviceLocation.Latitude.ToString(),它也会根据设备返回格式化值 @987654328 @。

我们可以确认问题是由于格式类型不匹配造成的,导致查询抛出异常,从而使体验如同没有数据一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 2021-06-06
    • 2017-11-28
    • 1970-01-01
    相关资源
    最近更新 更多