Таблица базы данных SQLite Xamarin Forms для ListView - PullRequest
0 голосов
/ 01 января 2019

Здравствуйте, я сейчас пытаюсь показать таблицу в базовом приложении для Android.тем не менее мой вопрос касается:

var db = new SQLiteAsyncConnection(Database.DatabasePath.DB_Path);
            foreach ( var N in db.Table<Database.Inventory>() )
            {

              InventoryItems.Add(new Store_Listing { Id = N.Id, 
              Description = N.Description, Style = N.Style });

Эта часть кода, которая принимает ошибку:

оператор foreach не может работать с переменными типа 'AsyncTableQuery<...> 'потому что' AsyncTableQuery <...> 'не содержит общедоступного экземпляра для' GetEnumerator '

foreach ( var N in db.Table<Database.Inventory>() ) "

Я изучил класс Database.Inventory, и онустановить в открытый класс, и все элементы в точности соответствуют таблице базы данных SQLite (тип 3).

Честно говоря, я действительно не знаю, что не так.

Нет проблем с подключением базы данных .db3, но эта ошибка мне неизвестна, так как яСовершенно новый для SQLite и Android.App Dev.

Это код для Database.Inventory:

using System;
using System.Collections.Generic;
using System.Text;
using SQLite;

namespace Inventory.Database

{
    [Table("Inventory")]
    public class Inventory

    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }

        public string Description { get; set; }
        public string Style { get; set; }

    }
}

Спасибо за ваш отзывзаранее.

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Вы вызываете новый экземпляр SQLiteAsyncConnection, который использует инструкции async для всех своих методов (при необходимости).В исходном коде SQLite NuGet вы обнаружите, что Table<T> возвращает переменную типа AsyncTableQuery.AsyncTableQuery не реализует и не наследует ничего .Это автономный класс, что означает, что он не может получить доступ к методу GetEnumerator, к которому он ожидает доступа для оператора foreach.

Итак, в вашем коде, где у вас есть:

var db = new SQLiteAsyncConnection(Database.DatabasePath);
foreach ( var N in db.Table<Database.Inventory>() ) // Table<T> does *not* return a List<T>!!
{
    InventoryItems.Add(new Store_Listing 
    { 
        Id = N.Id, 
        Description = N.Description, 
        Style = N.Style 
    });
}

Вы пытаетесь получить доступ к тому, что вы считаете List, но на самом деле AsyncTableQuery.

Как обойти это

Если вы посмотрите на класс AsyncTableQuery, у него есть метод ToListAsync, который преобразует объект AsyncTableQuery в объект List<T>.Просто позвонив по этому, вы преобразуете Table<T> в List<T> примерно так:

var db = new SQLiteAsyncConnection(Database.DatabasePath);
var myList = await db.Table<Database.Inventory>().ToListAsync();

// TODO: Add a null or empty check to prevent NullExceptions.

foreach(var N in myList)
{
    // Do your stuff
}
0 голосов
/ 01 января 2019
var results = await db.Table<Database.Inventory>();

var query = conn.Table<Database.Inventory>();

query.ToListAsync().ContinueWith((t) =>
{
    foreach (var N in t.Result)
    {
      // code from your foreach loop
    }
});
...