Доступ к полям строковой задачи, возвращаемой из базы данных SQLite, выдает ошибки

#c# #sqlite #xamarin

#c# #sqlite #xamarin

Вопрос:

В моем приложении Xamarin у меня есть локальная база данных, настроенная с использованием SQLite. При настройке я следовал примеру списка дел Microsoft (https://docs.microsoft.com/en-gb/xamarin/xamarin-forms/data-cloud/data/databases ) однако я столкнулся с проблемой.

У меня есть модель под названием «Animal», которая сохраняется в моей базе данных, и я пытаюсь запросить поля:

     public int ID { get; set; }

    public string Name {get; set; }
    
    public string Species { get; set; }
  
    public string Markings { get; set; }
   
    public string Diet { get; set; }
 

В моем файле запроса к базе данных я пытаюсь выполнить запрос, который получит животное на основе его имени, заданного пользователем, а затем из этого он вернет его маркировку / диету / и т.д…
Это то, что у меня есть до сих пор, но это ошибка, и я действительно не уверен, как это исправить:

     public async Task<string> getanimaldiet(string name)
    {
        
            Animal a = Database.Table<Animal>().Where(x => x.Name == name).FirstOrDefaultAsync();
            return a.Diet;


    }
 

Ошибки:
Имя «диета» не существует в текущем контексте и не может неявно преобразовать тип «Система».Многопоточность.Задачи.Задача<animalService .Animal>’ to ‘animalService .Животное ‘

Любая помощь приветствуется.

Комментарии:

1. Какая у вас ошибка?

2. Имя ‘diet’ не существует в текущем контексте и не может неявно преобразовать тип ‘System. Многопоточность. Задачи. Задача<animalService . Животное>’ to’animalService. Животное» обновило сообщение, чтобы включить это

Ответ №1:

Поскольку у вас есть асинхронный api, вам необходимо добавить await в свой код:

  Animal a =  await Database.Table<Animal>().Where(x => x.Name == name) 
               .FirstOrDefaultAsync();

            return a.Diet;

 

Вы можете синхронизировать его:

 public string getanimaldiet(string name)
    {
      
Animal a =   Database.Table<Animal>().Where(x => x.Name == name) 
               .FirstOrDefault();

            return a.Diet;
)
 

Комментарии:

1. Спасибо! Как бы мне тогда преобразовать то, что возвращается, в строку, а не вводить System.threading.task.task?

2. используйте FirstOrDefault вместо FirstOrDefaultAsync

3. Буду ли я использовать это при вызове функции в другом файле @Jason?