我正在努力使用以前的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>
答案 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重新构建可以显示数据。
我的建议是检查绑定,以设置和显示这些页面上的数据。