Как сохранить ObservableCollection в ObservableCollection в xamarin.forms с Sqlite.net - PullRequest
0 голосов
/ 21 января 2020

Последние 3 дня я пытался сохранить свою коллекцию в своей базе данных. Я пробовал это разными способами ... безуспешно. Последнее, что я попробовал - это сериализовать мою коллекцию и сохранять ее в байте [] при каждом изменении коллекции. И при запуске appstart я попытался сделать его сериализацию в своей коллекции.

Я просто пытаюсь показать самые важные вещи.

Я могу без проблем сохранить и перезагрузить этот класс из своей базы данных.

[Serializable]
    public class MainElement : INotifyPropertyChanged
    {        
        public event PropertyChangedEventHandler PropertyChanged;
        public static int count = 0;
        [PrimaryKey]
        public int Id { get; set; }
        public string Name { get; set; }

        public byte[] _elements;

        private ObservableCollection<SecondElement> elements;


        [OneToMany]
        public ObservableCollection<SecondElement> Elements 
        {
            get
            {
                return elements;
            }
            set 
            { 
                elements = value;
                this.SerializeElementsFromMainElement();
                //_elements = ExtensionAndDb.SerializeElementsFromMainElement(elements);
                OnPropertyChanged();
            }
        }

        public MainElement()
        {
            Id = count++;
            Elements = new ObservableCollection<SecondElement>();
            this.DeSerializeElementsFromMainElement();
            //Elements = ExtensionAndDb.DeSerializeElementsFromMainElement(_elements);  
        }    

        public void OnPropertyChanged([CallerMemberName] string propertyname = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyname));
        }
        public void DeSerializeElementsFromMainElement()
        {            
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream stream = new MemoryStream(_elements);
            using (stream)
            {
                Elements = bf.Deserialize(stream) as ObservableCollection<SecondElement>;
            }
        }
        public void SerializeElementsFromMainElement()
        {
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream stream = new MemoryStream();
            using (stream)
            {
                bf.Serialize(stream, Elements);
                _elements = stream.ToArray();
            }
        }
    }

Каждый MainElement хранится в MainList (ObservableCollection). Все хорошо.

Но я не могу сохранить или перезагрузить public byte[] _elements; из / в коллекцию.

Я знаю, что мой код не хорош, но если у кого-то есть идея или она может показать мне как сохранить public ObservableCollection<SecondElement> Elements с моим классом вместе в Sqlite, я был бы очень благодарен. Я пытался в течение 3 дней

, если вам нужно больше кода, дайте мне знать.

Спасибо заранее.

1 Ответ

0 голосов
/ 22 января 2020

Согласно вашему описанию, вы хотите сериализовать и десериалировать ie ObservableCollection, я предлагаю вам использовать Newtonsoft. Json для этого.

Установка Newtonsoft . Json в первую очередь пакетом Nuget.

Например, я делаю один пример:

public class person
{
    public string username { get; set; }
    public int age { get; set; }
}

public ObservableCollection<person> persons { get; set; }
private string list;
    public Page13()
    {
        InitializeComponent();
        persons = new ObservableCollection<person>()
        {
            new person(){username="cherry",age=12},
            new person(){username="barry",age=14}
        };

    }

Btn1.clicked - для сериализации данных, Btn2.clicked - для десериализации данных. .

 private void Btn1_Clicked(object sender, EventArgs e)
    {
         list = Newtonsoft.Json.JsonConvert.SerializeObject(persons);

    }

    private void Btn2_Clicked(object sender, EventArgs e)
    {
        var myValue = Newtonsoft.Json.JsonConvert.DeserializeObject<ObservableCollection<person>>(list) ;
    }   

Если Observablecollection изменился, вы можете запросить эти данные по Id или другому, а затем обновить эти данные.

Вот статья об обновлении, вставке и сохранении данных в sqlite, Вы можете посмотреть:

https://dzone.com/articles/register-and-login-using-sqlite-in-xamarinforms

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...