C# 如何将数据添加到SQLite脱机数据库表并在listView Xamarin上显示
我正在用Xamarin.Forms做一个天气应用程序项目。在成功地将用户添加到数据库并在“登录”中验证现有用户之后,现在我正在努力在SQLite数据库中添加一个town(带有3个变量),然后在内容页的ListView中显示信息。 问题是,当我单击“天气”按钮时,ListView中没有显示任何内容,并且第二个捕捉被触发-Temp=“无法获取天气” 让我们从我的城市模型开始: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
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; }