我正在为我们公司的应用程序使用相同的库,据我所知,也记录在http://wp7sqlite.codeplex.com (在一些建议下),如果您关闭连接,则需要重新创建它。
== 其他评论 ==
我已经找到了错误的原因,创建了一个修复程序并正在我们的应用程序中对其进行测试。简而言之,为了将 Community.CSharpSqlite 库移植到 WP7,作者围绕 WP7 隔离存储文件流编写了一个 FileStream 包装器。当打开一个db时,db文件流由CSharpSqlite打开和读取和关闭。但是该流的句柄也存储在将文件路径映射到流的字典中。当第二次打开数据库时,将检索流的句柄,但由于它已关闭(我假设尚未验证),数据库无法打开。
我将尝试将我的更改部署到 wp7sqlite.codeplex.com 项目,但与此同时,如果您有源代码,请对 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);
}
这是我第一次尝试调试并为开源项目做出贡献。对这些更改的任何评论或想法将不胜感激。
阿拉斯代尔。