#xamarin.forms
#xamarin.forms
Вопрос:
Вот мой код, в котором я добавляю элементы в базу данных SQLite
public partial class BirdPages : ContentPage
{
private SQLiteAsyncConnection _connection;
public BirdPages(string BirdNames, Button BirdSelect)
{
InitializeComponent();
_connection = DependencyService.Get<ISQLiteDb>().GetConnection();
BirdNameCall.Text = BirdNames;
AddToList = BirdSelect;
}
async private void AddToList_Clicked(object sender, EventArgs e)
{
await _connection.CreateTableAsync<Bmodel>();
string BirdNames = BirdNameCall.Text;
var voel = new Bmodel { Bname = BirdNames};
await _connection.InsertAsync(voel);
await DisplayAlert(BirdNames, "added to list", "Ok");
}
И вот где я получаю доступ из базы данных в listview
public class Bmodel
{
[PrimaryKey, AutoIncrement]
public int Id { get; set;}
[MaxLength(255)]
public string Bname { get; set; }
}
public partial class myBirdList : ContentPage
{
private SQLiteAsyncConnection _connection;
private ObservableCollection<Bmodel> _birds;
public myBirdList()
{
InitializeComponent();
_connection = DependencyService.Get<ISQLiteDb>().GetConnection();
}
protected override async void OnAppearing()
{
await _connection.CreateTableAsync<Bmodel>();
var blists = await _connection.Table<Bmodel>().OrderBy(x => x.Bname).ToListAsync();
_birds = new ObservableCollection<Bmodel>(blists);
birdlistview.ItemsSource = _birds;
base.OnAppearing();
}
void MenuItem_Clicked(object sender, System.EventArgs e)
{
var blists = (sender as MenuItem).CommandParameter as Bmodel;
_connection.DeleteAsync(blists);
_birds.Remove(blists);
}
Когда элемент добавляется в базу данных дважды или более, он отображается в listview. Я был бы признателен за помощь в том, как не отображать повторяющиеся элементы или даже как отображать оповещение, когда оно уже есть в базе данных. Я думаю, что это как-то связано с PrimaryKey, если я не ошибаюсь. Любая помощь была бы большой благодарностью.
Комментарии:
1. Если вы не хотите, чтобы два или более элемента имели одинаковый вид,
Bname
почему бы не сделать этоPrimary Key
?2. Я пробовал это. Когда я добавляю
Bname
во второй раз, приложение закрывается. Есть ли способ отобразить предупреждение, котороеBname
уже добавлено в базу данных?3. Получение какого-либо исключения? Вы пробовали перемещать свой
InsertAsync
метод внутриtry-catch block
4. проверьте наличие существующих данных ПЕРЕД выполнением вставки или используйте атрибут PK. Если ваше приложение выходит из строя при выполнении X, выясните, что вызывает сбой, и исправьте это.
5. Исключение, которое я получаю, заключается в том, что «Ошибка записи в поток отладки. Подробности: Не удается получить доступ к удаленному объекту.» Как бы я проверил
Bname
передInsertAsync
вводом?
Ответ №1:
Итак, все, что я изменил, это сохранить мой Public int Id
как Primary Key
и изменить Bname
на [Unique]
, а там, где я использовал InsertAsync
, я изменил его на InsertOrReplaceAsync