【问题标题】:Unable to retrieve data from SQLite DB on SD Card on WP8无法从 WP8 上 SD 卡上的 SQLite DB 检索数据
【发布时间】: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 以使用存储对象,但我怀疑这样做会是一个重要的项目。

简单项目示例:

我创建了一个简单的示例项目来突出我的问题,以防万一有人想快速查看并可能尝试任何想法:

https://skydrive.live.com/?cid=de82af8533ac6d28&id=DE82AF8533AC6D28!242&ithint=file,.zip&authkey=!AF4IwcI0G7bsDFE

将 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


【解决方案1】:

您不需要用于只读访问的库,只需在清单中注册文件扩展名。这可能看起来像这样:

<Extensions>
   <FileTypeAssociation Name="SQLite"
                        TaskID="_default"
                        NavUriFragment="fileToken=%s">
       <Logos>
           <Logo Size="small" IsRelative="true">...</Logo>
           <Logo Size="medium" IsRelative="true">...</Logo>
           <Logo Size="large" IsRelative="true">...</Logo>
       </Logos>
       <SupportedFileTypes>
         <FileType ContentType="application/sqlite">.sqlite</FileType>
       </SupportedFileTypes>
   </FileTypeAssociation>
</Extensions>

【讨论】:

  • 我已经这样做了 - 问题似乎在于 SQLite SDK 试图读取 SD 卡上的文件的方式。请参阅我的问题末尾的“Microsoft 员工提供的反馈”部分。这也是我之前拼凑的一个测试项目,其中包括你的建议(如果你想玩的话)-skydrive.live.com/…
猜你喜欢
  • 1970-01-01
  • 2011-05-16
  • 2021-12-30
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
  • 2020-11-08
相关资源
最近更新 更多