【问题标题】:Using Textblobbed in sqlite-net-extensions在 sqlite-net-extensions 中使用 Textblobbed
【发布时间】:2015-12-11 11:12:58
【问题描述】:

我正在尝试在 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
 }

我显然有一个单独的电话号码类:

     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 字段中看不到值,而它们的 blobbed 字段中填充了序列化值。

上瘾,试图手动反序列化斑点字段,我从 Json.net 得到一个异常(即这样做):

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

我怎么了? 谢谢

【问题讨论】:

    标签: c# json sqlite sqlite-net-extensions


    【解决方案1】:

    为了从数据库中检索关系,您必须使用 SQLite-Net Extensions 提供的任何 WithChildren 方法。

    尝试更改这些行:

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

    到这里:

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

    您也不需要PhoneNumber 表,因为它们正在文本属性中进行序列化。所以你可以删除这一行:

    connection.CreateTable<Contact.PhoneNumber>();
    

    【讨论】:

    • 谢谢,我只是尝试使用 GetAllWithChildren 方法读取值,它通过 Json Deserializer 抛出异常。异常消息是Error converting value "+393487373383" to type Windows.ApplicationModel.Contacts.Contact
    • 听起来您在PhoneNumbersBlobbed 属性中保存了一个电话号码(“+393487373383”),然后您尝试将其反序列化为 JSON。你永远不应该直接使用PhoneNumbersBlobbed 属性。
    • 不,我没有直接使用 blobbed 字段,我只是根据需要声明了由其 blobbed 字符串字段装饰的复杂对象,并将所有列表保存在第一篇文章中。
    猜你喜欢
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多