我收到错误{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语句中删除,以便连接保持打开状态。
感谢您的帮助。
答案 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”
更新:添加调试快照