Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite数据库C#Android中的Xamarin ListView显示项_C#_Android_Sqlite_Xamarin - Fatal编程技术网

SQLite数据库C#Android中的Xamarin ListView显示项

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 = "

在我的例子中,我想显示我创建的本地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);
        }
    }
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世界。