Я использую ту же библиотеку для приложения нашей компании и, насколько мне известно, также документирована в http://wp7sqlite.codeplex.com (в соответствии с некоторыми рекомендациями) , если вы закроете соединение, вам потребуется восстановить его снова.
== ДОПОЛНИТЕЛЬНЫЕ КОММЕНТАРИИ ==
Я выяснил причину ошибки, создал исправление и проверяю его в нашем приложении. Вкратце, для переноса библиотеки Community.CSharpSqlite на WP7 автор написал оболочку FileStream вокруг WP7 IsolatedStorageFileStream. Когда БД открывается, поток файлов БД открывается и читается и закрывается с помощью 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);
}
Это первый раз, когда я пытаюсь отладить и внести свой вклад в проект с открытым исходным кодом. Будем весьма благодарны за любые комментарии или мысли по поводу этих изменений.
Алистер.