SQLite数据库C#Android中的Xamarin ListView显示项
在我的例子中,我想显示我创建的本地SQLite数据库中的项目,如下所示:SQLite数据库C#Android中的Xamarin ListView显示项,c#,android,sqlite,xamarin,C#,Android,Sqlite,Xamarin,在我的例子中,我想显示我创建的本地SQLite数据库中的项目,如下所示: public string CreateDB() //create database { var output = ""; string dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "IsoModule.db3"); output = "
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);
}
}
public string CreateDB()//创建数据库
{
var输出=”;
字符串dbPath=Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),“IsoModule.db3”);
output=“已创建数据库”;
返回输出;
}
公共字符串CreateTable()//创建表
{
尝试
{
字符串dbPath=Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),“IsoModule.db3”);
var db=新的SQLiteConnection(dbPath);
db.CreateTable();
db.CreateTable();
string result=“创建的表”;
返回结果;
}
捕获(例外情况除外)
{
返回(“错误”+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);
}
stringpath=path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),“IsoModule.db3”);
var tablelistout=新的SQLiteConnection(路径);
var alltables=tablelistout.Table();
foreach(所有表中的var列表)
{
var from=新字符串[]
{
listing.tname+“-”+listing.status
};
ListView listtable=(ListView)FindViewById(Resource.Id.listtable);
Adapter=newarrayadapter(这个,Android.Resource.Layout.SimpleListItem1,来自);
}
代码运行时没有错误,但只显示表中的最后一项。这让我很困惑,所以我想问一下如何从特定的表中检索所有数据?
或者如果有人问了同样的问题,请与我分享链接。很多人都很欣赏。var alltables=tablelistout.Table();
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());
var data=新列表();
foreach(所有表中的var列表)
{
data.Add(listing.tname+“-”+listing.status);
}
ListView listtable=(ListView)FindViewById(Resource.Id.listtable);
listtable.Adapter=newArrayAdapter(这个,Android.Resource.Layout.SimpleListItem1,data.ToArray());
我所做的只是把两件事从循环中去掉。首先,我移出了数组的初始化。其次,我移出了适配器的listView+赋值
你的问题是,在循环中,你总是覆盖你在上一次迭代中所做的一切(留下你所说的最后一项)
另外,您应该注意,如果您计划拥有相当数量的数据,那么创建自定义适配器对您来说非常重要。ArrayAdapter是一个本机Android类,然后由一个C#Xamarin对象包装,这意味着每行都有一个C#和Java对象。这会增加开销,因为两个垃圾收集器都有工作要做,并可能导致性能问题。Xamarin开发人员通常会避免使用它,但快速原型除外
另一方面,我将使用
findviewbyd(Int32)
而不是findviewbyd(Int32)
并强制转换它<代码>FindViewById(Resource.Id.listtable)在您的案例中。只是利用泛型的力量。非常感谢你,你的回答救了我的命!我会记下您的建议,再次感谢您应该注意,如果您计划拥有相当数量的数据,那么创建自定义适配器将非常重要。
不太可能,SimpleCursorAdapter
就足够了,无需重新设计适配器wheel@pskink事实上SimpleCursorAdapter
是一个Android sdk适配器,继承自java.lang.Object
,您的数据将是包装您的C#数据的java对象。你会遇到我在回答中描述的类似问题。您将有2个垃圾收集器的开销,并且您将使用双倍的内存来表示每一行。此外,地面军事系统需要“同步”,这意味着它通常需要一次以上的传递,从而导致对象在内存中的持续时间超过其应有的时间。好的,我不会假装我是xamarin专家,所以在你看来,所描述的是不正确的?这是一个好问题,它确实取决于幕后发生了什么。据我所见,您可能没有关于CursorAdapter
的问题,因为只有适配器是用C#包装的,并且适配器直接从数据库创建它的java对象,而不创建任何C#对应项。我的解释直接来自认证材料。在ArrayAdapter的例子中,您肯定遇到了我描述的问题,因为它需要将C#对象包装回java世界。