如何在 Raspberry 上的 SQLite 中创建 Table

How to Create Table in SQLite on Raspberry

我收到错误 {SQLite.Net.SQLiteException: 磁盘 I/O 错误,当我尝试在 raspberry pi 3 上的 sqllite 数据库中创建 table 时,使用 WIN IOT是OS。我正在使用 SQLite 的 SQLite.Net-PCL ver 3.1.1 实现。这是一个 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 实现的数据读取器?我以前在 Android 上使用 SQLite 没有问题,但是我在那里使用的一些命令在这里不可用。

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();
    }

我的 table 实现是;

    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);

这没有帮助。我仍然收到磁盘 I/O 错误。

在尝试过程中,我将 using 行更改为;

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

我不确定 SQLite.Net.SQLiteConnection 和 SQLiteConnection 之间有什么区别,但是 SQLite.Net.SQLiteConnection 关闭连接而 SQLiteConnection 保持打开状态。所以这是最后一个问题。

还有一件事我把它单独放在 class 中,这样它就可以保持打开状态,并且可以在代码的其余部分随时使用。这需要将其从 using 语句中删除,以便连接保持打开状态。

感谢您的帮助。

我可以在 "C:\Data\Users\DefaultAccount\Documents\" 路径下重现您的问题。这似乎与 UWP file access permission 限制有关。

更改为您的代码有效的 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\Packages1b8f0e-3351-44ed-a3b3-4e15b0d12cb6_a48w6404kk2ea\LocalState\Storage.db

更多参考“Use a SQLite database in a UWP app

更新:添加调试快照