【发布时间】:2019-09-04 09:51:12
【问题描述】:
我正在尝试让 SQLite 工作以在本地存储一些信息,但现在我遇到了一个烦人的问题:每当我调用 sqlite 函数 CreateTable 时,它都会返回一个异常。
这是一个例外:
Unhandled Exception:
System.MissingMethodException: Method not found: string SQLitePCL.raw.sqlite3_column_name(SQLitePCL.sqlite3_stmt,int).
这是我用来使其跨平台的界面:
public interface IDataBase
{
SQLiteConnection GetConnection();
}
Android 实现:
[assembly: Dependency(typeof(DataBase))]
namespace MyNameSpace.Droid
{
public class DataBase : IDataBase
{
public DataBase() { }
public SQLiteConnection GetConnection()
{
var fileName = "DataBase.db3";
string docsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
string path = Path.Combine(docsPath, fileName);
var conn = new SQLiteConnection(path);
return conn;
}
}
}
还有一个用于 iOs 的:
[assembly: Dependency(typeof(DataBase))]
namespace MyNameSpace.iOS
{
public class DataBase : IDataBase
{
public DataBase() { }
public SQLiteConnection GetConnection()
{
var fileName = "DataBase.db3";
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
var libraryPath = Path.Combine(docPath, "..", "Library");
var path = Path.Combine(libraryPath, fileName);
var conn = new SQLiteConnection(path);
return conn;
}
}
}
然后我有我的表格类型:
namespace MyNameSpace.DataBase
{
public class MacroCategoria
{
[PrimaryKey]
public int ID { get; set; }
public string descrizione { get; set; }
public MacroCategoria() { }
}
}
获取第一个元素的DataBase控制器和I方法:
namespace MyNameSpace.DataBase
{
public class DBController
{
static object locker = new object();
SQLiteConnection database;
public DBController()
{
database = DependencyService.Get<IDataBase>().GetConnection();
if (database != null)
{
database.CreateTable<MacroCategoria>();
database.Insert(new MacroCategoria() { ID = 0, descrizione = "Description" });
}
}
public MacroCategoria getFirstMacro()
{
lock (locker)
{
if (database.Table<MacroCategoria>().Count() == 0)
return null;
else
return database.Table<MacroCategoria>().First();
}
}
}
}
在App类中调用:
public partial class App : Application
{
static DBController dbController;
public App()
{
InitializeComponent();
DependencyService.Register<MockDataStore>();
MainPage = new MainPage();
}
[...Other Default Methods...]
public static DBController DBController
{
get
{
if(dbController == null)
{
dbController = new DBController();
}
return dbController;
}
}
}
最后,在我的 mainPage 中,我有一个应该获取第一个元素的函数:
private void CartIcon_Clicked(object sender, EventArgs e)
{
try
{
App.DBController.getFirstMacro();
} catch(Exception ex) { throw; }
}
【问题讨论】:
标签: c# sqlite xamarin xamarin.forms