Доступ к математическим функциям с помощью sqlite-net-pcl и Xamarin.Forms - PullRequest
0 голосов
/ 04 ноября 2018

При написании консольного приложения на 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 ( Пользовательские функции SQLite в Xamarin.iOS ). Однако я не до конца понял ответ. Теперь у меня есть следующие вопросы:

1) Могу ли я создавать собственные функции SQL, используя sqlite-net-pcl в Xamarin.Forms? Если да, может кто-нибудь поделиться простым (но полным) примером того, как это сделать? 2) Есть ли у меня доступ к тем же математическим функциям (pow, cos, sin и т. Д.), К которым я могу получить доступ при написании консольных приложений на C #? 3) Есть ли другой способ сделать это? Например, могу ли я прочитать столбцы из базы данных в список, затем выполнить необходимые математические функции и передать их обратно в базу данных? Это была бы ужасная идея с большой базой данных?

Заранее спасибо,

Дастин

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Поправьте меня, если я ошибаюсь, но то, что вы пытаетесь сделать, это по существу иметь два столбца, в которых один содержит набор данных, а другой содержит результат простой математической операции из первого столбца. Из этого у вас есть два столбца, где один зависит от другого, что означает, что вы занимаете вдвое больше необходимого пространства памяти. Для 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); 
    }
}

Нет никакой разницы между ними, и вы экономите много места в строке. Вы можете найти больше информации о => нотации от этого ответа StackOverflow Алекса Букера.

Давайте рассмотрим пример реализации этой структуры. Предположим, у вас есть база данных с 1 столбцом с именем Column1 , и вы хотите применить функцию Cosine к этому значению и отобразить ее. Ваш код может выглядеть так:

// 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.

0 голосов
/ 05 ноября 2018
  1. Сначала все в порядке.

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. Третий ответ ясен.

Подробнее:

Вы можете обратиться к официальному документу в здесь , Другое подобное обсуждение может быть полезным для вас this .

...