Windows Phone 7: SQLite - PullRequest
       34

Windows Phone 7: SQLite

6 голосов
/ 08 апреля 2011

Я пытаюсь заставить 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();

У меня есть приложение для Windows, которое использует SQLite, поэтому, если бы я мог использовать SQLite, а не Sterling DB или что-то еще, это сэкономило бы огромное количество времени. Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что, открыв и закрыв базу данных, я не могу открыть ее снова.

Ответы [ 2 ]

5 голосов
/ 08 апреля 2011

Я использую ту же библиотеку для приложения нашей компании и, насколько мне известно, также документирована в 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);
    }

Это первый раз, когда я пытаюсь отладить и внести свой вклад в проект с открытым исходным кодом. Будем весьма благодарны за любые комментарии или мысли по поводу этих изменений.

Алистер.

3 голосов
/ 22 июня 2011

Привет, я столкнулся с той же проблемой ... Я думаю, что я получил решение для этого. Это то, что я сделал.

  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

...