编写C#控制台应用程序并使用System.Data.SQLite时,我能够执行SQL命令,例如:
string cosfun = string.Format("UPDATE test SET cosColumn = column1*cos(20));
但是,当我尝试在Xamarin.Forms中使用sqlite-net-pcl包使用类似的命令时,出现以下错误:SQLite.SQLiteException:'没有这样的函数:cos'
我在SO(Custom SQLite functions in Xamarin.iOS)上找到了类似的问题。但是,我不完全理解响应。我现在有以下问题:
1)我可以在Xamarin.Forms中使用sqlite-net-pcl进行自定义SQL函数吗?如果是这样,有人可以分享一个简单(但完整)的方法示例吗? 2)无论如何,我可以使用C#编写控制台应用程序时访问哪些数学函数(pow,cos,sin等)? 3)还有另一种方法吗?例如,我可以将数据库中的列读取到列表中,然后执行所需的数学函数,然后将其反馈到数据库中吗?对于大型数据库,这会是一个可怕的主意吗?
预先感谢
达斯汀
答案 0 :(得分:0)
Frank Kreuger编写的SQLite-net PCL是Xamarin大学在其XAM160中使用的-与SQLite和Mobile Data类一起使用:https://university.xamarin.com/classes/track/cross-platform-design
您可以在Xamarin开发人员网站上找到一些有关如何入门的文档:http://developer.xamarin.com/recipes/android/data/databases/sqlite/
答案 1 :(得分:0)
如果我错了,请纠正我,但是您想要做的基本上是两列,其中一列包含一组数据,另一列包含第一列进行的简单数学运算的结果。由此,您有两列,其中一列依赖于另一列,这意味着您占用了两倍的必要内存空间。对于100个条目,没关系。 1,000,000?少了。
我个人认为您最好不要拥有with t(str) as
(
select 'TALLON | BLACK | 44' union all
select 'LLON | BLUE| 47 ' union all
select 'LON |YELLOW| 56 '
)
select substring(str, charindex('|',str,1)+1,
( charindex('|',str, charindex('|',str,1)+1) - charindex('|',str,1) )-1 )
as result
from t;
result
--------
BLACK
BLUE
YELLOW
,并且在读取数据时应该计算余弦。例如:
cosColumn
在上面,余弦值从未在C#或SQLite中存储或创建,但是仅在需要时才获取。这样可以使其对SQLite表的内存友好性更高,并实现了更好的SQLite结构。
在上面的代码中,该行:
// In your C# code...
public class MyData
{
public double Column1 { get; set; } = 0.0;
public double Cosine => Math.Cos(Column1);
}
完全等同于:
public double Cosine => Math.Cos(Column1);
两者之间没有真正的区别,您可以节省很多行空间。您可以在Alex Booker的this StackOverflow answer的public double Cosine
{
get
{
return Math.Cos(Column1);
}
}
符号中找到更多信息。
让我们看一下实现此结构的示例。假设您有一个名称为 Column1 的1列的数据库,并且您想对该值应用余弦函数并显示它。您的代码可能类似于:
=>
对象// Read from database object of type MyData
MyData data = ReadOneValueFromDatabase<MyData>();
// Display values in a label
MyValueLabel.Text = "Database value: " + data.Column1.ToString();
MyCosineLabel.Text = "Cosine value: " + data.Cosine.ToString();
将来自数据库的data
的值存储在Column1
中,但不是 Column1
。 Cosine
的值仅在您呼叫 Cosine
时获得。