如何在Raspberry上的SQLite中创建表

时间:2019-01-24 14:07:37

标签: sqlite raspberry-pi iot windows-10-iot-core

我收到错误{SQLite.Net.SQLiteException:磁盘I / O错误,尝试在树莓派3上的sqllite数据库中创建表时,操作系统为WIN IOT。我正在使用SQLite的SQLite.Net-PCL 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();
    }

我的表实现是;

    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 (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 :(得分:0)

我可以在“ 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\Packages\911b8f0e-3351-44ed-a3b3-4e15b0d12cb6_a48w6404kk2ea\LocalState\Storage.db

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

更新:添加调试快照

enter image description here