如何在 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”
更新:添加调试快照
我收到错误 {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”
更新:添加调试快照