Xamarin表单无法在ListView中显示sqlite数据

时间:2018-09-04 23:47:15

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

我正在努力使用以前的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>

1 个答案:

答案 0 :(得分:0)

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

在浏览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>

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

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