2015-09-15 1 views
1

J'essaye de mapper une classe complexe dans sqlite mais quelque chose semble être faux parce que quand je récupère mes objets les champs complexes sont vides. Peu de temps, ma classe est quelque chose de similaire:Utilisation de Textblobbed dans sqlite-net-extensions

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 
} 

J'ai évidemment une classe pour séparée PhoneNumber:

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

tandis que la classe ContactEmail est une classe native de WinPhone.

Eh bien, après avoir créé les tables dans DB:

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

et ont peuplé ma liste de contact Je les enregistrer dans DB. J'ai essayé comme sauver un par un avec:

connection.InsertWithChildren(contact,true); 

comme toute la liste togheter:

connection.InsertAllWithChildren(listOfContacts, true); 

et je suis sûr que la liste est remplie correctement avant de l'enregistrer. Mais quand je lis ses valeurs de sqlite:

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

Je ne peux pas voir les valeurs dans mes champs PHONENUMBERS et MailAddresses, alors qu'ils sont remplis de valeur sérialisée dans leurs champs de blobbed.

Dans la dépendance, en essayant de désérialiser manuellement les champs blobbed, je reçois une exception Json.net (c.-à-faire de cette façon.):

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

ce que je me trompe? Merci

Répondre

1

Afin de récupérer les relations de la base de données, vous devez utiliser l'une des méthodes WithChildren fournies par SQLite-Net Extensions.

Essayez de changer ces lignes:

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

à ceci:

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

Vous aurez pas besoin de deux tables PhoneNumber, parce qu'ils sont dans la propriété sérialisés texte. Donc, vous pouvez supprimer cette ligne:

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

Merci, J'ai juste essayé de lire les valeurs avec la méthode GetAllWithChildren, il lance une exception via Json Deserializer. Le message d'exception est 'Error converting value" +393487373383 "pour taper Windows.ApplicationModel.Contacts.Contact' – Caio

+0

Vous semble avoir enregistré un numéro de téléphone ("+393487373383") dans la propriété 'PhoneNumbersBlobbed', puis vous avez tenté de le désérialiser un JSON. Vous ne devriez jamais utiliser la propriété 'PhoneNumbersBlobbed' directement. – redent84

+0

Non, je n'ai pas utilisé directement le champ blobbed, j'ai simplement déclaré comme requis l'objet complexe décoré par son champ chaîne blobbed et sauvegardé toute la liste comme écrit dans le premier post. – Caio