0

在编写 C# 控制台应用程序并使用 System.Data.SQLite 时,我能够执行 SQL 命令,例如:

string cosfun = string.Format("UPDATE test SET cosColumn = column1*cos(20));

但是,当我尝试在 Xamarin.Forms 中使用类似的命令,使用 sqlite-net-pcl 包时,我收到以下错误: SQLite.SQLiteException: 'no such function: cos'

我在 SO(Xamarin.iOS 中的自定义 SQLite 函数)上找到了类似的问题。但是,我并没有完全理解这个反应。我现在有以下问题:

1) 我可以在 Xamarin.Forms 中使用 sqlite-net-pcl 制作自定义 SQL 函数吗?如果是这样,有人可以分享一个简单(但完整)的例子来说明如何做到这一点吗?2) 我是否可以访问在 C# 中编写控制台应用程序时可以访问的相同数学函数(pow、cos、sin 等)?3)还有其他方法可以做到这一点吗?例如,我可以将数据库中的列读入列表,然后执行所需的数学函数,并将其反馈回数据库吗?对于大型数据库,这会是一个糟糕的主意吗?

提前致谢,

达斯汀

4

2 回答 2

0
  1. 首先是可以的。

Frank Kreuger 的 SQLite-net PCL 是 Xamarin 大学在其 XAM160 中使用的 - 使用 SQLite 和移动数据类:https ://university.xamarin.com/classes/track/cross-platform-design

  1. 二是好的。

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

  1. 第三个答案很明确。

更多信息:

你可以参考官方文档在这里,另一个类似的讨论可能对你有帮助

于 2018-11-05T07:53:04.077 回答
0

如果我错了,请纠正我,但是您要做的基本上是有两列,其中一个包含一组数据,另一个包含第一列的简单数学运算的结果。从这里你有两列,其中一列依赖于另一列,这意味着你占用了两倍的必要内存空间。对于 100 个条目,没关系。1,000,000?少这样。

我个人认为最好不要cosColumn并且在读取数据时应该计算余弦。例如:

// In your C# code...

public class MyData
{
    public double Column1 { get; set; } = 0.0;
    public double Cosine => Math.Cos(Column1);
}

在上面,余弦值从未在 C# 或 SQLite 中存储或创建,而是仅在需要时获取。这使得它对 SQLite 表的内存更加友好,并且实现了更好的 SQLite 结构。


在上面的代码中,这一行:

public double Cosine => Math.Cos(Column1);

完全等同于:

public double Cosine
{
    get 
    { 
        return Math.Cos(Column1); 
    }
}

两者之间没有真正的区别,并且您节省了大量的行空间。您可以从Alex Booker 的StackOverflow 答案中找到有关=>符号的更多信息。

让我们看一个实现这个结构的例子。假设您有一个数据库,其中包含 1 列,名称为Column1,并且您希望将余弦函数应用于该值并显示它。您的代码可能如下所示:

// 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仅在您调用 data.Cosine时获得。

于 2018-11-05T10:36:38.890 回答