使用sqlite-net-pcl和Xamarin.Forms访问数学函数

时间:2018-11-04 04:49:58

标签: sqlite xamarin.forms sqlite-net-pcl

编写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)还有另一种方法吗?例如,我可以将数据库中的列读取到列表中,然后执行所需的数学函数,然后将其反馈到数据库中吗?对于大型数据库,这会是一个可怕的主意吗?

预先感谢

达斯汀

2 个答案:

答案 0 :(得分:0)

  1. 首先可以。

Frank Kreuger编写的SQLite-net PCL是Xamarin大学在其XAM160中使用的-与SQLite和Mobile Data类一起使用:https://university.xamarin.com/classes/track/cross-platform-design

  1. 第二次还可以。

您可以在Xamarin开发人员网站上找到一些有关如何入门的文档:http://developer.xamarin.com/recipes/android/data/databases/sqlite/

  1. 第三个答案很清楚。

更多信息:

您可以在here中查阅正式文档,this也可以进行其他类似的讨论。

答案 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 answerpublic 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中,但不是 Column1Cosine的值仅在您呼叫 Cosine时获得。