Как я могу остановить дублирование элементов в базе данных SQLite?

#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