【发布时间】:2013-12-17 22:19:06
【问题描述】:
我在控制台应用程序中使用 System.Data.SQLite 创建了一个 SQLite 数据库。然后我把它移到了 Windows Phone 的 SD 卡上。
我按照以下说明将 SQLite 支持添加到我的 WP8 应用程序中: https://github.com/peterhuene/sqlite-net-wp8
我找到数据库文件并像这样打开它:
ExternalStorageFile file = null;
IEnumerable<ExternalStorageDevice> storageDevices = await ExternalStorage.GetExternalStorageDevicesAsync();
foreach (ExternalStorageDevice storageDevice in storageDevices)
{
try
{
file = await storageDevice.GetFileAsync("northisland.nztopomap");
}
catch
{
file = null;
}
if (file != null) break;
}
SQLiteConnection conn = new SQLiteConnection("Data Source=" + file.Path + ";Version=3;Read Only=True;FailIfMissing=True;");
SQLiteCommand command = new SQLiteCommand(_dbNorthIsland);
command.CommandText = "SELECT COUNT(*) FROM tiles";
int count = (int)command.ExecuteScalar<int>();
这会导致以下错误:
{SQLite.SQLiteException: no such table: tiles
at SQLite.SQLite3.Prepare2(Database db, String query)
at SQLite.SQLiteCommand.Prepare()
at SQLite.SQLiteCommand.ExecuteScalar[T]()}
有趣的是,我还尝试了以下 SQL 语句:
"SELECT COUNT(*) FROM sqlite_master WHERE type='table'"
哪个给出的结果为 0,表明找不到我的“tiles”表?
我怀疑 ExternalStorageFile.Path 正在返回 SQLite 无法解析为现有文件的路径,导致它创建一个新数据库,因此在我尝试访问它时抱怨缺少表。
这篇 Microsoft 文章似乎建议我应该能够从我的应用程序访问 SD 卡中的文件: http://msdn.microsoft.com/library/windowsphone/develop/jj720573%28v=vs.105%29.aspx
Microsoft 员工提供的反馈:
您的应用无法直接访问 SD 卡上的文件。它不能直接用文件系统API打开它们,而是需要使用Windows.Storage的ExternalStorageFile和ExternalStorageFolder接口。引用从 Windows Phone 8 上的 SD 卡读取:
Windows Phone 应用可以使用以下方式从 SD 卡读取特定文件类型 Microsoft.Phone.Storage API。
我希望手机的 SQLite 实现会尝试使用标准 C 文件 API 而不是使用 Storage 对象打开数据库,因此要求数据库位于 Xap 或独立存储中,并且无法访问 SD 卡上的数据库(Windows Store 应用程序的 SQLite 肯定是这种情况)。
理论上可以更新 SQLite 以使用存储对象,但我怀疑这样做会是一个重要的项目。
简单项目示例:
我创建了一个简单的示例项目来突出我的问题,以防万一有人想快速查看并可能尝试任何想法:
将 bx24.nztopomap 文件复制到 SD 卡的根目录下进行测试。
来自 SQLite SDK 社区的反馈:
显然,为具有一些 C++ 技能的人添加对 SQLite SDK 的支持应该是相当直接的(我的有点生疏!):
回复: http://www.mail-archive.com/sqlite-users@sqlite.org/msg81059.html http://www.mail-archive.com/sqlite-users@sqlite.org/msg81060.html
对于我原来的问题: http://www.mail-archive.com/sqlite-users@sqlite.org/msg81055.html
有人知道可以从 SD 卡读取的 Windows Phone 的 SQLite 库吗?
【问题讨论】:
-
大胆猜测:您确定复制到 sd 卡上的文件与您使用 db explorer 查看的文件完全相同吗?我想承认的更多次,我从 DEBUG 而不是 RELEASE 复制文件,反之亦然,或者设置了“不复制”并使用旧版本而不是我刚刚更改的版本等等。
-
@Corak - 是的,100% 确定,因为我没有空版本;)
-
除了连接字符串,您的应用可以访问外部存储上的文件夹和文件吗?
-
它可以找到它,因为我可以获得一个 ExternalStorageFile 对它的引用,但我无法打开它并从中检索数据。
-
@Hyndrix - 不是真的,但问题在 Windows Phone 8.1 中消失了,因为用户现在可以选择在 SD 卡上安装应用程序。如果应用在 SD 卡上,那么数据库也可以存在于 SD 卡上。
标签: c# sqlite windows-phone-8 sd-card