来自 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<T>(Int32)
而不是 FindViewById(Int32)
并进行转换。 FindViewById<ListView>(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 参数查询