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

Posted

技术标签:

【中文标题】来自 SQLite 数据库 C# Android 的 Xamarin ListView 显示项目【英文标题】:Xamarin ListView display item from SQLite Database C# Android 【发布时间】:2016-03-10 02:19:16 【问题描述】:

在我的情况下,我想显示我创建的本地 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 运行,但它只显示表中的最后一项。这让我很困惑,所以我想问一下如何从特定表中检索所有数据? 或者如果有人问过同样的问题,请分享我的链接。许多人欣赏。

【问题讨论】:

【参考方案1】:
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&lt;T&gt;(Int32) 而不是 FindViewById(Int32) 并进行转换。 FindViewById&lt;ListView&gt;(Resource.Id.listtable) 在你的情况下。只是利用泛型的力量。

【讨论】:

非常感谢,您的回答救了我的命!我会记下你的建议,再次感谢 You should take note that it will be important for you to create a custom adapter if you plan on having a decent amount of data. 不是,SimpleCursorAdapter 已经足够了,不用重新发明*** @pskink 实际上,SimpleCursorAdapter 是一个继承自 java.lang.Object 的 Android sdk 适配器,您的数据将是包装 C# 数据的 java 对象。您将遇到我在答案中描述的类似问题。您将有 2 个垃圾收集器的开销,并且您使用双倍内存来表示每一行。此外,GC 需要处于“同步”状态,这意味着通常需要不止一次通过,从而导致对象在内存中的持续时间比应有的时间长。 好吧,我不会假装我是 xamarin 专家,所以您认为 here 所描述的内容不正确? 这是一个很好的问题,这真的取决于幕后发生的事情。据我所知,CursorAdapter 可能没有问题,因为只有适配器包装在 C# 中,并且适配器直接从数据库创建它的 java 对象,而不创建任何 C# 对应项。我的解释直接来自认证的材料。在 ArrayAdapter 的情况下,您肯定遇到了我所描述的问题,因为它需要将 C# 对象包装回 java 世界。

以上是关于来自 SQLite 数据库 C# Android 的 Xamarin ListView 显示项目的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Android C# SQLite 参数查询

与来自 Android 的外部 SQLite 数据库交互。

来自sqlite的Android中的Textview显示

ListView来自android中的Sqlite

如何在 Android Studio 中显示来自 SQLite 数据库浏览器的图像?

在 C# VS2008 项目中使用 sqlite 的数据访问方法?