Xamarin ListView显示来自SQLite数据库C#Android的项目

本文关键字:数据库 C#Android 项目 SQLite ListView 显示 Xamarin | 更新日期: 2023-09-27 18:25:54

在我的情况下,我想显示我创建的本地SQLite数据库中的项目,如下所示:

public string CreateDB() //create database
    {
        var output = "";
        string dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "IsoModule.db3");
        output = "Database Created";
        return output;
    }
    public string CreateTable() //create table
    {
        try
        {
            string dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "IsoModule.db3");
            var db = new SQLiteConnection(dbPath);
            db.CreateTable<UserInfo>();
            db.CreateTable<TableInfo>();
            string result = "Table(s) created";
            return result;
        }
        catch (Exception ex)
        {
            return ("Error" + ex.Message);
        }
    }

这是我想要检索数据的代码

string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "IsoModule.db3");
        var tablelistout = new SQLiteConnection(path);
        var alltables = tablelistout.Table<TableInfo>();
        foreach (var listing in alltables)
        {
            var from = new string[]
            {
                listing.tname + "   -   " + listing.status 
            };
            ListView listtable = (ListView)FindViewById(Resource.Id.listtable);
            listtable.Adapter = new ArrayAdapter(this, Android.Resource.Layout.SimpleListItem1, from);
            }

代码运行时NO ERROR,但它只显示表中的最后一项。这让我很困惑,所以我想问如何从特定的表中检索所有数据?或者,如果有人问了同样的问题,请与我分享链接。许多人对此表示赞赏。

Xamarin ListView显示来自SQLite数据库C#Android的项目

var alltables = tablelistout.Table<TableInfo>();
var data = new List<string>();
foreach (var listing in alltables)
{
     data.Add(listing.tname + "   -   " + listing.status);
}
ListView listtable = (ListView)FindViewById(Resource.Id.listtable);
listtable.Adapter = new ArrayAdapter(this, Android.Resource.Layout.SimpleListItem1, data.ToArray());

我只做了两件事。首先,我移出了数组的初始化。其次,我移出了适配器的listView+赋值。

你的问题是,在循环中,你总是覆盖你在上一次迭代中所做的一切(留下最后一项,就像你说的那样)。

此外,您应该注意,如果您计划拥有相当多的数据,那么创建一个自定义适配器对您来说非常重要。ArrayAdapter是一个原生的Android类,然后由一个C#Xamarin对象封装,这意味着每行都有一个C#和Java对象。它增加了开销,因为两个垃圾收集器都有工作要做,并且可能导致性能问题。Xamarin开发人员通常会避免使用它,但快速原型除外。

另一方面,我将使用FindViewById<T>(Int32)而不是FindViewById(Int32),并在您的情况下将其强制转换为.FindViewById<ListView>(Resource.Id.listtable)。只是利用了泛型的力量。