【发布时间】:2014-11-16 03:13:28
【问题描述】:
我有一个 Windows Phone 8 应用程序,一些使用 Windows Phone 8.1 的用户报告了它的问题。似乎 SQLite 文件正在以某种方式损坏。
该应用包括以下项目参考:
- 适用于 Windows Phone 的 SQLite(SQLite.WP80,版本=3.8.5)
- Sqlite
我正在使用 Peter Huene 的 sqlite-net-wp8 3.8.5(通过 NuGet)。
该应用允许下载 SQLite 文件以使大量数据离线可用。该应用程序仅以只读模式打开这些应用程序,从下面的代码 sn-p 可以看出。两个可用的 SQLite 数据库文件都非常大 - 1.8 GB 和 2.6 GB。用户可以下载其中一个或两个文件。
using (SQLiteConnection conn = new SQLiteConnection(_filePath, SQLiteOpenFlags.ReadOnly))
{
SQLiteCommand cmd = new SQLiteCommand(conn);
cmd.CommandText = "SELECT EXISTS(SELECT 1 FROM tiles WHERE z=" + zoomLevel.ToString() + " AND x=" + x.ToString() + " AND y=" + y.ToString() + " LIMIT 1);";
canProvideMapTile = cmd.ExecuteScalar<bool>();
}
我在日志中看到的错误是:
SQLite.SQLiteException: file is encrypted or is not a database
at SQLite.SQLite3.Prepare2(Database db, String query)
at SQLite.SQLiteCommand.Prepare()
at SQLite.SQLiteCommand.ExecuteScalar[T]()
从日志中我可以看到 2 台设备遇到了这个问题。两个设备 ID 都以“RM-941”开头,因此看起来它们都是 Lumia 625。也许问题仅限于这种特定型号的设备,或者只是巧合?下载大文件是可选的,只有少数用户使用。
其中一位用户将应用安装到手机 SD 卡上,因此能够为我检索数据库文件。事实上,当我尝试使用 SQLite Expert 打开数据库文件时,我看到了“文件已加密或不是数据库”消息。
该文件的大小与未损坏的原始文件完全相同,但当我运行“comp”来比较这两个文件时,它确实显得不同。这是comp输出:
Compare error at OFFSET 0
file1 = DB
file2 = 53
Compare error at OFFSET 1
file1 = BD
file2 = 51
Compare error at OFFSET 2
file1 = 65
file2 = 4C
Compare error at OFFSET 3
file1 = 51
file2 = 69
Compare error at OFFSET 4
file1 = 45
file2 = 74
Compare error at OFFSET 5
file1 = BE
file2 = 65
Compare error at OFFSET 6
file1 = A7
file2 = 20
Compare error at OFFSET 7
file1 = 5E
file2 = 66
Compare error at OFFSET 8
file1 = 8A
file2 = 6F
Compare error at OFFSET 9
file1 = 4F
file2 = 72
10 mismatches - ending compare
用户提供的详细信息:
电话硬件是:
- Lumia 625
- 制造商:RM-941_[已移除]
- 固件版本:3058.50000.1424.0003
- 硬件版本:3.0.0.0
- 无线电软件版本:3.2.28072.7
- 芯片 SOC 版本:8930
- 屏幕:480x800
电话号码是:
- 列表项
- Windows 8.1 青色
- 版本:8.10.12393.890
用户已尝试卸载并重新安装该应用,但问题仍然存在。
有什么想法吗?
【问题讨论】:
-
我在存储大文件时使用 SD 卡的体验一直很糟糕,尤其是当它被大量写入时——比如你正在执行大量插入操作。即使是 10 级(我们使用的)最终也会崩溃。
-
如果文件是只读的,请计算其中部分的校验和,以便您可以重新下载它们。
-
@CL。 - 据我了解,文件每次被替换时都会不断损坏,所以我认为这不会有帮助。我应该想象如果也更新这将是相同的。
-
@ChubosaurusSoftware - 我的应用程序仅使用只读数据库文件,但我猜其他应用程序可能正在读取/写入 SD 卡的其他部分。我希望这不会导致问题,但这对我来说是新的。
标签: c# sqlite windows-phone-8 windows-phone-8.1 corruption