Как создать таблицу в SQLite на Raspberry - PullRequest
0 голосов
/ 24 января 2019

Я получаю сообщение об ошибке {SQLite.Net.SQLiteException: ошибка ввода-вывода диска, при попытке создать таблицу в базе данных sqllite на Raspberry Pi 3, с ОС WIN IOT является ОС.Я использую SQLite.Net-PCL версии 3.1.1 реализацию SQLite.Это приложение UWP.Вот полная ошибка:

{SQLite.Net.SQLiteException: disk I/O error
   at SQLite.Net.Platform.WinRT.SQLiteApiWinRT.Prepare2(IDbHandle db, String query)
   at SQLite.Net.SQLiteCommand.Prepare()
   at SQLite.Net.SQLiteCommand.ExecuteNonQuery()
   at SQLite.Net.SQLiteConnection.Execute(String query, Object[] args)
   at SQLite.Net.SQLiteConnection.CreateTable(Type ty, CreateFlags createFlags)
   at SQLite.Net.SQLiteConnection.CreateTable[T](CreateFlags createFlags)
   at InternetRadio.SQLite_Raspberry.GetConnection()}

Во-вторых, есть ли хранилище данных для этой конкретной реализации SQLite?Я использовал SQLite на Android раньше без проблем, но некоторые команды, которые я там использовал, здесь не доступны.

var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);    
var fileName2 = "Storage.db";
var path2 = Path.Combine(documentsPath, fileName2);     

try
    {
        using (var connection = new SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), path2))
        {
               md.CreateTable<RaspTables.Category>();
        }
    }
    catch (Exception ex)
    {
        string m_er = ex.ToString();
    }

моя табличная реализация:

    public class Category
    {
            [PrimaryKey, AutoIncrement]
            public int _id { get; set; }
            public int Cat_order { get; set; }
            public string Name { get; set; }
            public string Keywords { get; set; }
            public string Sub_Cat { get; set; }

        public Category()
        { }


    }

Я вижу файлы,Storage.db и Storage.db-journal были созданы.Они оба имеют права на запись на диск.Я прочитал, что мне нужно установить теги SQLiteOpenFlags.ReadWrite |SQLiteOpenFlags.Create |SQLiteOpenFlags.FullMutex, но не знаю, как это сделать.Я пытался,

md = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), path, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create | SQLiteOpenFlags.FullMutex);

, который выдает ошибку.Я также пытался;

md = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), path, true);

, который не помогает.Я все еще получаю ошибку ввода-вывода диска.

Из-за того, что я пытался что-то изменить, я изменил строку использования на;

using (SQLite.Net.SQLiteConnection md = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), path)) ;

Я не уверен, в чем разница между SQLite.Net.SQLiteConnection и SQLiteConnection, но SQLite.Net.SQLiteConnection закрывает соединение, а SQLiteConnection оставляет его открытым.Так что это была последняя проблема.

Еще одна вещь, которую я поместил в отдельный класс, чтобы он оставался открытым и использовался в любое время в остальной части кода.Это потребовало его удаления из оператора using, чтобы соединение оставалось открытым.

Спасибо за помощь.

1 Ответ

0 голосов
/ 25 января 2019

Я могу воспроизвести вашу проблему по пути «C: \ Data \ Users \ DefaultAccount \ Documents \».Это похоже на ограничение доступа UWP к файлу .

Измените путь приложения UWP, в котором работает ваш код.

        StorageFolder localFolder = ApplicationData.Current.LocalFolder;
        var fileName2 = "Storage.db";
        var path2 = Path.Combine(localFolder.Path, fileName2);

        try
        {
            using (var connection = new SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), path2))
            {
                connection.CreateTable<RaspTables.Category>();
            }
        }
        catch (Exception ex)
        {
            string m_er = ex.ToString();
        }

Путь для моего приложения:

C:\Data\Users\DefaultAccount\AppData\Local\Packages\911b8f0e-3351-44ed-a3b3-4e15b0d12cb6_a48w6404kk2ea\LocalState\Storage.db

Дополнительная справка " Использовать базу данных SQLite в приложении UWP"

Обновление: добавить снимок отладки

enter image description here

...