【问题标题】:Windows Phone 7: SQLiteWindows Phone 7:SQLite
【发布时间】:2011-04-08 11:53:09
【问题描述】:

我正在尝试让 Community.Csharp 与 Windows Phone 一起使用,我尝试使用来自 http://wp7sqlite.codeplex.com/ 的版本并使用 WINDOWS_PHONE 标志编译主干线,但是当我在手机上运行应用程序时,我得到了尝试执行任何查询时出错(但在打开数据库时不会;仅在查询上):“无法打开数据库文件”

_conn = new SqliteConnection("Version=3,uri=file:recipes.sqlite");
_conn.Open();
cmd.CommandText = "SELECT * FROM recipes";
SqliteDataReader reader = cmd.ExecuteReader();

不过有趣的是,我使用以下方法来检查表是否存在并且没有抛出异常:

cmd.CommandText = "SELECT * FROM sqlite_master WHERE name='" + tableName + "'";
SqliteDataReader rdr = cmd.ExecuteReader();
exists = rdr.Read();
rdr.Close();

我有一个使用 SQLite 的 Windows 应用程序,所以如果我可以使用 SQLite 而不是 Sterling DB 或其他东西,那将节省大量时间。我目前遇到的问题是,一旦我打开数据库并关闭它,我就无法重新打开它。

【问题讨论】:

标签: c# sqlite windows-phone-7 windows-phone


【解决方案1】:

我正在为我们公司的应用程序使用相同的库,据我所知,也记录在http://wp7sqlite.codeplex.com (under Some Recommendations ),如果您关闭连接,则需要重新创建它。

== 其他评论 ==

我已经找到了错误的原因,创建了一个修复程序并正在我们的应用程序中对其进行测试。简而言之,为了将 Community.CSharpSqlite 库移植到 WP7,作者围绕 WP7 隔离存储文件流编写了一个 FileStream 包装器。当打开一个db时,db文件流由CSharpSqlite打开和读取和关闭。但是该流的句柄也存储在将文件路径映射到流的字典中。第二次打开数据库时,将检索流的句柄,但由于它已关闭(我假设尚未验证),因此数据库无法打开。

我将尝试将我的更改部署到 wp7sqlite.codeplex.com 项目,但与此同时,如果您有 source code,请对 Community.CsharpSqlite.FileStream 进行以下更改

改变

    public FileStream(string path, FileMode mode, FileAccess access, FileShare share, int unused)
    {
        IsolatedStorageFileStream handler = null;
        if (FileStream.HandleTracker.TryGetValue(path, out handler))
        {
            _internal = handler;
        }
        else
        {
            if (mode == FileMode.Create || mode == FileMode.CreateNew)
            {
                _internal = IsolatedStorageIO.Default.CreateFile(path);
            }
            else
            {
                _internal = IsolatedStorageIO.Default.OpenFile(path, FileMode.OpenOrCreate);
            }
            FileStream.HandleTracker.Add(path, _internal);
        }
    }

    public FileStream(string path, FileMode mode, FileAccess access, FileShare share, int unused)
    {
        IsolatedStorageFileStream handler = null;
        if(FileStream.HandleTracker.TryGetValue(path, out handler)) 
        {
            _internal = handler;
            if(!_internal.CanRead) 
            {
                FileStream.HandleTracker.Remove(path);
                CreateOpenNewFile(path, mode);
            }
        } else {
            CreateOpenNewFile(path, mode);
        }
    }

    private void CreateOpenNewFile(string path, FileMode mode) 
    {
        if(mode == FileMode.Create || mode == FileMode.CreateNew) 
        {
            _internal = IsolatedStorageIO.Default.CreateFile(path);
        } else {
            try {
                _internal = IsolatedStorageIO.Default.OpenFile(path, FileMode.OpenOrCreate);
            } catch(Exception ex) {
                var v = ex;
            }
        }
        FileStream.HandleTracker.Add(path, _internal);
    }

这是我第一次尝试调试并为开源项目做出贡献。任何有关这些更改的 cmet 或想法将不胜感激。

阿拉斯代尔。

【讨论】:

  • 谢谢,这似乎解决了问题。该项目的源代码在命名约定上看起来非常像 C。
  • 干得好; +1!我初步选择了@VanSiner 的解决方案,并希望您的代码能尽快包含在内。 :-)
【解决方案2】:

您好,我遇到了同样的问题……我想我已经解决了。 这就是我所做的。

  public void CloseDB()
  {
    Connection.Close();               //Connection is a property(of type SqliteConnection) of my object
    FileStream.HandleTracker.Clear(); //This here is the fix
  } 

我真的不需要更改 dll。
我还不确定这是否会在以后导致错误,但现在它对我有用。
...我只是一个初级程序员:D

【讨论】:

  • 似乎工作(如果您一次只打开一个连接,至少)。如果其他人被FileStream 没有HandleTracker 属性所困扰,那是因为这不是System.IO.FileStream,而是Community.CsharpSqlite.FileStream
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
相关资源
最近更新 更多