【发布时间】: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