C# 如何将数据添加到SQLite脱机数据库表并在listView Xamarin上显示

C# 如何将数据添加到SQLite脱机数据库表并在listView Xamarin上显示,c#,android,sql,visual-studio,xamarin,C#,Android,Sql,Visual Studio,Xamarin,我正在用Xamarin.Forms做一个天气应用程序项目。在成功地将用户添加到数据库并在“登录”中验证现有用户之后,现在我正在努力在SQLite数据库中添加一个town(带有3个变量),然后在内容页的ListView中显示信息。 问题是,当我单击“天气”按钮时,ListView中没有显示任何内容,并且第二个捕捉被触发-Temp=“无法获取天气” 让我们从我的城市模型开始: public class Town { [PrimaryKey] public int ID

我正在用Xamarin.Forms做一个天气应用程序项目。在成功地将用户添加到数据库并在“登录”中验证现有用户之后,现在我正在努力在SQLite数据库中添加一个town(带有3个变量),然后在内容页的ListView中显示信息。 问题是,当我单击“天气”按钮时,ListView中没有显示任何内容,并且第二个捕捉被触发-Temp=“无法获取天气”

让我们从我的城市模型开始:

public class Town
{       
    [PrimaryKey]
    public int ID { get; set; }
    public string TownName { get; set; }
    public string Temp { get; set; }
    public string searchTime { get; set; }

    public Town() { }
}
创建这个简单类后,我将实现一个控制器类,用于处理城镇数据:

SQLiteConnection database;

    public SearchHistoryDataController()
    {

        database = DependencyService.Get<ISQLite>().GetConnection();

        database.CreateTable<Town>();

    }

    IEnumerable<Town> orderItemCollection;
    public IEnumerable<Town> OrderItemCollection
    {
        get
        {
            if (orderItemCollection == null)
                orderItemCollection = GetTowns();
            return orderItemCollection;
        }
    }

    public IEnumerable<Town> GetTowns()
    {
        // Changing the database table items as ObservableCollection
        var table = (from i in database.Table<Town>() select i);
        ObservableCollection<Town> TownList = new ObservableCollection<Town>();
        foreach (var town in table)
        {
            TownList.Add(new Town()
            {
                ID = town.ID,
                TownName = town.TownName,
                Temp = town.Temp,
                searchTime = town.searchTime
            });
        }
        return TownList;
    }

    public Town GetTown(int id)
    {

        return database.Table<Town>().FirstOrDefault(t => t.ID == id);

    }


    public void DeleteTown(int id)
    {

        database.Delete<Town>(id);

    }

    public string AddTown(Town town)
    {
        var data = database.Table<Town>();
        var d1 = data.Where(x => x.TownName == town.TownName && x.searchTime == town.searchTime).FirstOrDefault();

        if (d1 == null)
        {           

            database.Insert(town);

            return "Successfully Added";

        }
        else
        {
            return "Invalid Town id Exist";
        }
    }
最终的-XAML文件的结构如下:

 <Grid>
        <Image HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Aspect="AspectFill" Source="gradientBack.png"/>
        <StackLayout Padding="10" Spacing="10">
            <StackLayout Orientation="Horizontal" Spacing="20" HorizontalOptions="Center" VerticalOptions="Start" Margin="5,20">
                <Label Text="Search History" FontSize="20" FontAttributes="Bold" VerticalOptions="Center" TextColor="White" HorizontalOptions="Center"/>
            </StackLayout>
            <ListView ItemsSource="{Binding OrderItemCollection}"
              HasUnevenRows="True"
              CachingStrategy="RecycleElement"
              IsPullToRefreshEnabled="True"
              RefreshCommand="{Binding GetWeatherCommand}"
              IsRefreshing="{Binding IsBusy, Mode=OneWay}"
              RowHeight="66"
              x:Name="ListViewTide">
                <ListView.SeparatorColor>
                    <OnPlatform x:TypeArguments="Color" iOS="Transparent"/>
                </ListView.SeparatorColor>
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <Frame BackgroundColor="White" BorderColor="#F0F0F0" Padding="5" Margin="0,0,0,5" HasShadow="False">
                                <Grid HeightRequest="50" HorizontalOptions="FillAndExpand" VerticalOptions="Start">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="*"/>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="*"/>
                                    </Grid.ColumnDefinitions>
                                    <Label Text="{Binding DisplayTide}" TextColor="#800080" FontSize="15"
                                           FontAttributes="Bold"
                                           Style="{DynamicResource ListItemTextStyle}"/>
                                    <StackLayout Grid.Column="2" Orientation="Horizontal" Margin="20,0" HorizontalOptions="End" VerticalOptions="Center">
                                        <Label Text="{Binding DisplayTime}" TextColor="Black" FontSize="15" FontAttributes="None" VerticalOptions="Center"/>
                                    </StackLayout>
                                </Grid>
                            </Frame>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </StackLayout>
    </Grid>

这个想法是在点击“天气”按钮时自动更新历史记录列表。历史记录将在文本字段中存储城镇名称、确切时间和温度。 该列表不会用于其他任何内容,它是一个选项卡


多谢各位

我确实解决了这个问题。第一个问题是这一行:
town.searchTime=DateTime.Parse(weatherRoot.Date).ToLocalTime().ToString(“g”)

它导致命令失败,因为无法访问此日期变量。我用:
town.searchTime=DateTime.Now.ToString()修复了它

下一步-如何显示保存在SQLite数据库中的数据:

将城镇插入数据库,然后轮询并将其存储在城镇列表下:

town.TownName = $"{weatherRoot.Name}";
                town.Temp = Temp;
                town.searchTime = DateTime.Now.ToString();

                //history database push               
                try
                {      
                    var returnvalue = searchHistoryDataController.AddTown(town);

                    if (returnvalue == "Sucessfully Added")
                    {

                        Console.WriteLine("Success");
                    }
                    else
                    {
                        Console.WriteLine("Fail");
                    }                
                }
                catch (Exception es)
                {
                    Debug.WriteLine(es.Message);
                }

                TownList = searchHistoryDataController.OrderItemCollection;
最后但并非最不重要的是XAML和SearchHistoryController:

<ListView ItemsSource="{Binding TownList}"
              x:Name="ListViewTide">
                <ListView.SeparatorColor>
                    <OnPlatform x:TypeArguments="Color" iOS="Transparent"/>
                </ListView.SeparatorColor>
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <Frame BackgroundColor="White" BorderColor="#F0F0F0" Padding="5" Margin="0,0,0,5" HasShadow="False">
                                <Grid HeightRequest="50" HorizontalOptions="FillAndExpand" VerticalOptions="Start">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="*"/>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="*"/>
                                    </Grid.ColumnDefinitions>
                                    <Label Text="{Binding TownName}" TextColor="#757575" FontSize="13" VerticalOptions="Center" Margin="20,0"/>
                                    <Label Grid.Column="1" Text="{Binding searchTime}" TextColor="Black" FontSize="10" FontAttributes="None" HorizontalOptions="Center" VerticalOptions="Center"/>
                                    <StackLayout Grid.Column="2" Orientation="Horizontal" Margin="20,0" HorizontalOptions="End" VerticalOptions="Center">
                                        <Label Text="{Binding Temp}" TextColor="Black" FontSize="25" FontAttributes="Bold" VerticalOptions="Center"/>
                                    </StackLayout>
                                </Grid>
                            </Frame>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

希望这对某人有帮助。:)

导致“无法获取天气”消息的实际异常是什么?它与天气信息有关。它可以正常工作,如果我删除关于城镇数据库的部分,这个异常不会被触发。杰森,你能冷静一点吗。没有异常消息,因为不存在错误。如果有一条异常消息可以帮助您解决问题,我一定会与您分享。我已经解决了这个问题。BR请将您的回答标记为答案,以便其他有类似问题的人可以从您的答案中获得帮助?谢谢。嗨,我马上就要做了。将您自己的回答标记为答案是有限制的,我必须等待24小时。
<ListView ItemsSource="{Binding TownList}"
              x:Name="ListViewTide">
                <ListView.SeparatorColor>
                    <OnPlatform x:TypeArguments="Color" iOS="Transparent"/>
                </ListView.SeparatorColor>
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <Frame BackgroundColor="White" BorderColor="#F0F0F0" Padding="5" Margin="0,0,0,5" HasShadow="False">
                                <Grid HeightRequest="50" HorizontalOptions="FillAndExpand" VerticalOptions="Start">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="*"/>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="*"/>
                                    </Grid.ColumnDefinitions>
                                    <Label Text="{Binding TownName}" TextColor="#757575" FontSize="13" VerticalOptions="Center" Margin="20,0"/>
                                    <Label Grid.Column="1" Text="{Binding searchTime}" TextColor="Black" FontSize="10" FontAttributes="None" HorizontalOptions="Center" VerticalOptions="Center"/>
                                    <StackLayout Grid.Column="2" Orientation="Horizontal" Margin="20,0" HorizontalOptions="End" VerticalOptions="Center">
                                        <Label Text="{Binding Temp}" TextColor="Black" FontSize="25" FontAttributes="Bold" VerticalOptions="Center"/>
                                    </StackLayout>
                                </Grid>
                            </Frame>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
 IEnumerable<Town> orderItemCollection;
        public IEnumerable<Town> OrderItemCollection
        {
            get
            {
                if (orderItemCollection == null)
                    orderItemCollection = GetTowns();
                return orderItemCollection;
            }
        }

        public IEnumerable<Town> GetTowns()
        {
            // Changing the database table items as ObservableCollection
            var table = (from i in database.Table<Town>() select i);
            ObservableCollection<Town> TownList = new ObservableCollection<Town>();
            foreach (var town in table)
            {
                TownList.Add(new Town()
                {
                    ID = town.ID,
                    TownName = town.TownName,
                    Temp = town.Temp,
                    searchTime = town.searchTime
                });
            }
            return TownList;
        }
[PrimaryKey, AutoIncrement]
        public int ID { get; set; }