Как в picker подгрузить значение из локальной базы данных?

165
28 января 2020, 14:40

есть picker на C# написан

var AgeList = new List<string>();
            AgeList.Add("1");
            AgeList.Add("2");
            AgeList.Add("3");
            AgeList.Add("4");
            AgeList.Add("5");
            AgeList.Add("6");
            AgeList.Add("7");
            var picker = new Picker { Title = "Select", TitleColor = Color.Red };
            picker.ItemsSource = AgeList;
            picker.SetBinding(Picker.SelectedItemProperty, "Age");

есть локальная база данных, куда сохраняются значение из picker в таблицу TableAge. У таблицы есть ID и колонка Age. Сохранённое значение будет хранится в колонке Age c ID=1.

Есть модуль с помощью которого можно сохранять и получать значения

public class TableAge
    {
        [PrimaryKey, AutoIncrement]
        public int ID { get; set; }
        public string Age { get; set; }
    }

Ну и наконец-то) значение которое хранится в БД в колонке Age c ID=1 нужно подгрузить в picker.

Так же при изменении пользователем значения в picker, новое значение к примеру "3", значение должно сохранится в БД в колонку Age c ID=1.

Любая помощь, ссылки(хотя с доками я уже ознакомился понял на сколько смог), примеры, логику, что-нибудь. вобщем любой помощи буду благодарен.

Answer 1

Обычно при использовании какой-либо технологии, желательно понимать как она примерно устроена и иметь под рукой какой-нибудь хороший ресурс. В противном случае, если недостаточно опыта, попытка взять ее с наскока может быть даже хуже, чем изучить мануал с нуля. Поэтому начну с ресурса, который лично мне нравится: https://metanit.com/sharp/xamarin/

Небольшое примечание

Не имеет смысла создавать таблицу для одного единственного значения с постоянным ID. Обычно в этом случае заводится специальная таблица для настроек Settings. Она могла бы выглядеть так:

public class TableSettings
{
    [PrimaryKey]
    public string Key { get; set; }
    public string Value { get; set; }
}

И запросы уже были бы без ID и ненужного никому автоинкремента, который не используется:

class SettingsRepository {
    SQLiteConnection database;
    public SettingsRepository ()
    {
        database = //подключение к БД
    }
    public string GetAge()
    {
        return database.Table<TableSettings>().Where(p => p.Key == "Age").Select(p => p.Value).First();
    }
    public void SaveAge(string newAge)
    {
        var item = database.Table<TableSettings>().Where(p => p.Key == "Age").Select(p => p);
        item.Value = newAge;
        database.Update(item);
    }
}

Теперь к задаче

Она выглядит слишком просто, по отношению к уже написанному коду. Поэтому у некоторых участников есть весомый повод пропустить вопрос, так как она больше подходит под определение "работа за автора".

Я возьму за основу ваш код, в него добавится всего пара простых строк, ссылки на источники которых вы уже сами привели даже.

SettingsRepository repository = new SettingsRepository();
public void SomeFunc(){
    var AgeList = new List<string>();
    AgeList.Add("1");
    AgeList.Add("2");
    AgeList.Add("3");
    AgeList.Add("4");
    AgeList.Add("5");
    AgeList.Add("6");
    AgeList.Add("7");
    AgeList.Add(repository.GetAge());
    var picker = new Picker { Title = "Select", TitleColor = Color.Red };
    picker.ItemsSource = AgeList;
    picker.SetBinding(Picker.SelectedItemProperty, "Age");
    picker.SelectedIndexChanged += picker_SelectedIndexChanged;
}
void picker_SelectedIndexChanged(object sender, EventArgs e)
{
    repository.SaveAge(picker.Items[picker.SelectedIndex]);
}
Answer 2

Вообщем сделал так.

По условию у меня есть элемент с ID=1.

Так как ID элемента известно то просто делаем запрос в БД и получаем значения поля которое нам нужно. :)

var age = (await App.Database.GetItemsAsyncD()).Single(x => x.ID == 1).Age;

Теперь известны все данные по элементу. :)

(здесь я могу путаться в формулировке чуть-чуть так что будьте острожнее) Теперь создаем новый picker по шаблону который у нас был условлен изначально.

await Navigation.PushAsync(new PagePicker
{
BindingContext = new Models.PagePicker { ID = 1, Age = age } as Models.PagePicker
});

Вот и все, значение из БД подгружено в Picker :) всем спасибо.

READ ALSO
Интерполяция строк в C# 6 без использования $

Интерполяция строк в C# 6 без использования $

В конфигурационном JSON файле используются строки следующего вида:

166
Как вывести окно поверх всех окон в Windows?

Как вывести окно поверх всех окон в Windows?

Нужно вывести окно поверх всех окон, для эффекта водяного знакаВозможно ли это сделать с помощью WPF без использования WinApi?

240
Xamarin forms for desktop

Xamarin forms for desktop

Нужно разработать мультиплатформенное десктопное(в будущем возможно и мобила) приложениеВыбрал Xamarin Forms, он только для мобильных приложений?...

202
Сортировка списка из внешнего файла С# [закрыт]

Сортировка списка из внешнего файла С# [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение

191