Я изо всех сил пытаюсь найти ответ самостоятельно, используя предыдущие сообщения 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();
}
}
}
Я знаю, что метод add to 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>