2013-02-02 7 views
12

Quali limitazioni ci sono sui tipi di dati utilizzati in una classe che verrà utilizzata da SQLite-net per rappresentare una tabella? In particolare, posso usare questo:Posso usare un elenco di stringhe in una classe destinata a SQLite?

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

... o avrò bisogno di questo:

public string[] CoconutWaterBrands { get; set; } 

... o qualcos'altro del tutto?

risposta

10

Gli ORM (ovvero la perdita di astrazione) presentano questo tipo di problema. I campi nella classe corrisponderanno alle colonne nella tabella. Se usi List o matrici allora l'ORM dovrà combinare in qualche modo quei valori nella lista in una singola colonna, per questo dovrà scegliere un qualche tipo di separatore e cosa succederebbe se il separatore apparisse all'interno del tuo valore di stringa, in ultima analisi lo farai trova lentamente te stesso nella tana del coniglio.

Non credo che array di supporto SQLite/elenco. Dovrai usare string (e dividerlo e unirlo come richiesto) o creare una nuova tabella per rappresentare la relazione uno-a-molti.

8

per fornire una soluzione più concreta alla domanda, è possibile utilizzare Newtonsoft.Json per serializzare un blob JSON:

Vale a dire

private string coconutWaterBrands; 

[Ignore] 
public List<string> CoconutWaterBrands { 
    get 
    { 
     return JsonConvert.DeserializeObject<List<string>>(coconutWaterBrands); 
    } 
    set 
    { 
     coconutWaterBrands = JsonConvert.SerializeObject(value); 
    } 
} 
+2

Forse non con [Ignora] quindi, o avrete bisogno di un'altra proprietà per ottenerla (de) serializzare. – jv42

10

Simile alla risposta di Sandy, in termini di serializzazione/deserializzazione la lista, è possibile utilizzare Text blobbed properties dal SQLite-Net Extensions library. Così, per esempio nella classe del modello:

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

dal documentation on Text blobbed properties:

proprietà Text-blobbed vengono serializzati in una proprietà di testo quando viene salvato e deserializzati quando caricato. Ciò consente di memorizzare oggetti semplici nella stessa tabella in una singola colonna.

Le proprietà di trascinamento del testo hanno un piccolo sovraccarico di serializzazione e deserializzazione degli oggetti e alcune limitazioni, ma sono il modo migliore per memorizzare oggetti semplici come Elenco o Dizionario di tipi di base o relazioni semplici. Le proprietà contenenti testo richiedono una proprietà stringa dichiarata in cui è archiviato l'oggetto serializzato.

Le proprietà con testo non possono avere relazioni con altri oggetti né relazioni inverse con quelle di origine.

Un serializzatore basato su JSON viene utilizzato se nessun altro serializzatore è stato specificato utilizzando il metodo TextBlobOperations.SetTextSerializer. Per utilizzare il serializzatore JSON, è necessario includere nel progetto un riferimento alla libreria Newtonson Json.Net, disponibile anche come pacchetto NuGet.

+6

E dal momento che C# 6 si potrebbe anche scrivere '[TextBlob (nameof (CoconutWaterBrandsBlobbed))]] per renderlo meno soggetto a errori e più riparabile. –

+1

Ah, bello, decisamente meno bello soggetto a errori. –