Использование Textblobbed в sqlite-net-extensions

Я пытаюсь отобразить сложный класс в sqlite, но что-то кажется неправильным, потому что, когда я извлекаю свои объекты, сложные поля пусты. Вкратце, мой класс чем-то похож:

 public class Contact
 {
    [PrimaryKey, AutoIncrement]
    public int Id { set; get; }
    public string Name { set; get; }
    public string Status { set; get; }

    [TextBlob("PhoneNumbersBlobbed")]
    public List<PhoneNumber> PhoneNumbers { set; get; }
    public string PhoneNumbersBlobbed { get; set; } // serialized PhoneNumbers

    [TextBlob("MailAddressesBlobbed")]
    public List<ContactEmail> MailAddresses { set; get; }
    public string MailAddressesBlobbed { get; set; } // serialized MailAddresses
 }

У меня, очевидно, есть отдельный класс для PhoneNumber:

     public class PhoneNumber
     {          
        public string Number { set; get; }
        public bool IsVerified { set; get; }
        public string AttrString { set; get; }  
    }

в то время как класс ContactEmail является собственным классом WinPhone.

Итак, после создания таблиц в БД:

 connection.CreateTable<Contact.PhoneNumber>();
 connection.CreateTable<Contact>();

и заполнив свой список контактов, я сохраняю их в БД. Я попытался сохранить один за другим с помощью:

connection.InsertWithChildren(contact,true);

как весь список вместе:

connection.InsertAllWithChildren(listOfContacts, true);

и я уверен, что список правильно заполнен, прежде чем сохранить его. Но когда я читаю его значения из sqlite:

var list = connection.Table<Contact>().ToList();
connection.UpdateAll(list ,true);

Я не вижу значений в своих полях PhoneNumbers и MailAddresses, хотя они заполнены сериализованными значениями в своих полях blobb.

В зависимости от того, пытаясь вручную десериализовать блоббированные поля, я получаю исключение из Json.net (т.е. делаю так):

 foreach (Contact pc in list)
        {
            try
            {
                Contact.PhoneNumber[] numbs = JsonConvert.DeserializeObject<PhoneContact.PhoneNumber[]>(pc.PhoneNumbersBlobbed);
            }
            catch {
                ;
            }
        }

что я не так? Спасибо


person Caio    schedule 15.09.2015    source источник


Ответы (1)


Чтобы получить отношения из базы данных, вы должны использовать любой из WithChildren методов, предоставляемых SQLite-Net Extensions.

Попробуйте изменить эти строки:

var list = connection.Table<Contact>().ToList();
connection.UpdateAll(list ,true);

К этому:

var list = connection.GetAllWithChildren<Contact>();

Вам также не понадобится таблица PhoneNumber, потому что они сериализуются в текстовом свойстве. Таким образом, вы можете удалить эту строку:

connection.CreateTable<Contact.PhoneNumber>();
person redent84    schedule 15.09.2015
comment
Спасибо, я только что попытался прочитать значения с помощью метода GetAllWithChildren, он выдает исключение через Json Deserializer. Сообщение об исключении: Error converting value "+393487373383" to type Windows.ApplicationModel.Contacts.Contact - person Caio; 17.09.2015
comment
Похоже, вы сохранили номер телефона (+393487373383) в свойстве PhoneNumbersBlobbed, а затем попытались десериализовать его как JSON. Вы никогда не должны использовать свойство PhoneNumbersBlobbed напрямую. - person redent84; 17.09.2015
comment
Нет, я не использовал непосредственно поле blobbed, я просто объявил по мере необходимости сложный объект, декорированный его строковым полем blobbed, и сохранил весь список, как написано в первом посте. - person Caio; 18.09.2015