【问题标题】:xamarin forms unable to show sqlite data in listviewxamarin 表单无法在列表视图中显示 sqlite 数据
【发布时间】:2019-02-10 00:26:27
【问题描述】:

我正在努力自己寻找答案,使用以前的 Stackoverflow 帖子、youtube 和 google 搜索。 我正在尝试学习如何将 SQLite 与 xamarin 表单一起使用。

解决方案连接:

using SQLite;
namespace TestSQLite
{
    public interface IDatabaseConnection
    {
        SQLiteAsyncConnection GetConnection();
    }
}

Android 特定连接(iOS 相同)

using SQLite;
using System.IO;
using TestSQLite; 
using Xamarin.Forms;

[assembly: Dependency(typeof(DatabaseConnection))]

namespace TestSQLite
{
    public class DatabaseConnection : IDatabaseConnection
    {
        public SQLiteAsyncConnection GetConnection() 
        {
            var dbName = "TestDb.db3";
            var path = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments), dbName);

            return new SQLiteAsyncConnection(path);
        }
    }
}

还有 MainPage C# 代码:

using SQLite;
using Xamarin.Forms;

namespace TestSQLite
{
    public class ControlledDrugs
    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }
        public string Drug { get; set; }
        public double Volume { get; set; }
    }
    public class Users
    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public partial class MainPage : ContentPage
    {
        private SQLiteAsyncConnection _connection;

        public MainPage()
        {
            InitializeComponent();
            _connection = DependencyService.Get<IDatabaseConnection>().GetConnection();
        }

        protected override async void OnAppearing()
        {
            await _connection.CreateTableAsync<ControlledDrugs>();
            await _connection.CreateTableAsync<Users>();

             RefreshUsers();
        RefreshDrugs();

            base.OnAppearing();
        }
        async void OnAdd(object sender, System.EventArgs e)
        {
    var user = new Users { Name = UserInput.Text };
    await _connection.InsertAsync(user);
        }

        void OnUpdate(object sender, System.EventArgs e)
        {

        }

        void OnDelete(object sender, System.EventArgs e)
        {

        }
 async void RefreshUsers()
    {
        var userlist = await _connection.Table<Users>().ToListAsync();
        Userlistview.ItemsSource = userlist;
    }

    async void RefreshDrugs()
    {
        var druglist = await _connection.Table<ControlledDrugs>().ToListAsync();
        Drugslistview.ItemsSource = druglist;
    }

    private void Userlistview_Refreshing(object sender, System.EventArgs e)
    {
        RefreshUsers();
        Userlistview.EndRefresh();
    }
    }
}

我知道添加到 sqlite 方法有效,首先是因为 Stackoverflow 上的用户帮助了我,其次是列表视图上出现了一个空白单元格。但这就是问题所在,单元格是空白的,无论我添加多少,都是空白的。 我似乎无法物理访问模拟器上的 sqlite 数据库来打开并调查条目是否被写入或输入为空白。 System.Environment.SpecialFolder.MyDocuments 似乎没有将 .db3 保存在模拟器我的文档中 - 单独的问题,但限制我自己找到答案。

所以我知道问题是:1)当解决方案将数据输入数据库(为空白)时,或者 2)从数据库中调用要在列表视图上查看的数据时出现错误。 此外,从我的代码中您可能会看到我正在手动调用刷新列表视图(通过用户拉列表视图,因为我仍在学习并且可观察的收集方法/方法有点超出我的 ATM。

感谢团队

更新:所要求的 Xaml 代码:谢谢。

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:TestSQLite"
             x:Class="TestSQLite.MainPage">

    <StackLayout>
        <Label Text="User Input"></Label>
        <Entry x:Name="UserInput"></Entry>
        <Button Text="add it" Clicked="OnAdd"></Button>
        <Label Text="User"></Label>
        <ListView x:Name="Userlistview" IsPullToRefreshEnabled="True" Refreshing="Userlistview_Refreshing"></ListView>
        <Label Text="Drugs"></Label>
        <ListView x:Name="Drugslistview"></ListView>
    </StackLayout>

</ContentPage>

【问题讨论】:

  • 请在您绑定 LIstView 的位置显示 XAML/代码
  • 检查两件事以缩小搜索范围。 1. 在 RefreshUsers 方法中放置一个断点,检查查询的结果是什么,看看属性是否被填满。 2. RefreshUsers 方法是异步无效的,因此在调用列表视图的 EndRefresh 之前,您实际上不知道该方法是否已完成。我会尝试让它返回一个任务,这样你就可以等待它。
  • 我已将 async void 更改为 public void 但现在我无法设置 UserListview。 Itemsource 到(=)用户列表:不能隐式转换类型?真正的新手,伙计们

标签: sqlite listview xamarin data-binding xamarin.forms


【解决方案1】:

我有点晚了,但希望这对将来的某人有所帮助(它肯定会对我有所帮助!)

我在浏览 Microsoft 网站上的 Xamarin 教程时遇到了同样的问题。本教程首先让您将列表保存到文件中,然后改为使用 SQLite 数据库。当我切换时,我发现添加一条新记录会填充一个空白列表条目。

原来罪魁祸首在于数据输入页面、列表视图和类中的变量名之间的绑定。我将类定义为:

public class Player
    {
        [PrimaryKey, AutoIncrement]
        public int ID { get; set; }
        public string PlayerName { get; set; }
        public DateTime JoinDate { get; set; }
    }

在执行数据输入时我应该有:

<StackLayout Margin="20">

        <Editor Placeholder="Enter player name"
                Text="{Binding PlayerName}"
                HeightRequest="50" />

        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Button Text="Save"
                            Clicked="OnRosterEntrySaveButtonClicked"
                            Grid.Row="1" />
            <Button Text="Delete"
                            Clicked="OnRosterEntryDeleteButtonClicked"
                            Grid.Row="1" 
                            Grid.Column="1"/>
        </Grid>
    </StackLayout>

相反,我在编辑器中有 "Text = "{Binding Text}"。这并没有在构建时产生错误。我在列表视图中也有一个错误。我应该有的是:

<ListView.ItemTemplate>
        <DataTemplate>
            <TextCell Text="{Binding PlayerName}"
                      Detail="{Binding Date}" />
        </DataTemplate>
</ListView.ItemTemplate>

相反,我再次使用“Text”而不是“PlayerName”。注意上面“Detail="{Binding Date}"也是错误的。类中的变量实际上是JoinDate。上面的绑定不会产生错误,但是当应用程序运行时没有显示数据。将绑定更改为JoinDate并且重建允许显示数据。

我的建议是检查您的绑定,以便在这些页面上设置和显示数据。

【讨论】:

    猜你喜欢
    • 2020-10-28
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多