14

SQLite-netがテーブルを表すために使用するクラスで使用されるデータ型にはどのような制限がありますか?具体的には、これを使用できますか?

public List<string> CoconutWaterBrands { get; set; }

...またはこれが必要になります:

public string[] CoconutWaterBrands { get; set; }

...または他の何か?

4

3 に答える 3

19

Sandy's Answerと同様に、リストのシリアル化/逆シリアル化に関しては、 SQLite-NetExtensionsライブラリText blobbed propertiesから使用できます。たとえば、Modelクラスでは次のようになります。

public class SomethingToDoWithCoconuts
{
    [TextBlob(nameof(CoconutWaterBrandsBlobbed))]
    public List<string> CoconutWaterBrands { get; set; }
    public string CoconutWaterBrandsBlobbed { get; set; } // serialized CoconutWaterBrands
}

テキストブロブプロパティに関するドキュメントから:

テキストブロブされたプロパティは、保存時にテキストプロパティにシリアル化され、ロード時に逆シリアル化されます。これにより、単純なオブジェクトを同じテーブルの1つの列に格納できます。

テキストブロブプロパティには、オブジェクトのシリアル化と逆シリアル化のオーバーヘッドがわずかにあり、いくつかの制限がありますが、基本タイプのリストやディクショナリ、または単純な関係などの単純なオブジェクトを格納するための最良の方法です。テキストブロブプロパティには、シリアル化されたオブジェクトが格納されている宣言された文字列プロパティが必要です。

テキストブロブプロパティは、他のオブジェクトとの関係や、その親との逆の関係を持つことはできません。

TextBlobOperations.SetTextSerializerメソッドを使用して他のシリアライザーが指定されていない場合は、JSONベースのシリアライザーが使用されます。JSONシリアライザーを使用するには、Newtonsoft Json.Netライブラリへの参照がプロジェクトに含まれている必要があり、NuGetパッケージとしても利用できます。

于 2016-03-12T21:37:28.523 に答える
11

ORM(別名抽象化リーク)には、この種の問題があります。クラスのフィールドは、テーブルの列に対応します。リストまたは配列を使用する場合、ORMは、リスト内のこれらの値を1つの列に何らかの方法で組み合わせる必要があります。そのため、ある種のセパレーターを選択する必要があり、セパレーターが文字列値内に表示された場合、最終的にはゆっくりとウサギの穴に自分を見つけてください。

SQLite-netが配列/リストをサポートしているとは思いません。文字列を使用する(および必要に応じて分割して結合する)か、1対多の関係を表す新しいテーブルを作成する必要があります。

于 2013-02-02T16:45:35.340 に答える
11

質問に対するより具体的な解決策を提供するために、Newtonsoft.Jsonを使用してJSONBLOBにシリアル化できます。

つまり

private string coconutWaterBrands;

[Ignore]
public List<string> CoconutWaterBrands { 
    get
    {
        return JsonConvert.DeserializeObject<List<string>>(coconutWaterBrands);
    } 
    set
    {
        coconutWaterBrands = JsonConvert.SerializeObject(value);
    }
}
于 2015-07-08T12:39:10.490 に答える