4

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 のネイティブ クラスです。

さて、DBにテーブルを作成した後:

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

連絡先のリストにデータを入力したら、DB に保存します。次のように1つずつ保存してみました:

connection.InsertWithChildren(contact,true);

すべてのリストをまとめて:

connection.InsertAllWithChildren(listOfContacts, true);

保存する前に、リストが正しく入力されていると確信しています。しかし、sqlite からその値を読み取ると、次のようになります。

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

PhoneNumbers フィールドと MailAddresses フィールドに値が表示されませんが、blob フィールドにはシリアル化された値が入力されています。

中毒で、ブロブ化されたフィールドを手動で逆シリアル化しようとすると、Json.net から例外が発生します (つまり、この方法で実行します)。

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

私は何が間違っていますか?ありがとうございました

4

1 に答える 1

2

データベースからリレーションシップを取得するにはWithChildren、SQLite-Net 拡張機能が提供するメソッドのいずれかを使用する必要があります。

これらの行を変更してみてください:

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

これに:

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

PhoneNumberテーブルは text プロパティでシリアル化されているため、テーブルも必要ありません。したがって、次の行を削除できます。

connection.CreateTable<Contact.PhoneNumber>();
于 2015-09-15T09:45:40.753 に答える