2012-01-29 17 views
23

Ho bisogno di salvare matrice di stringhe alla base di dati, ma non ci vorrà mi lasciate che questo è quello che ho:Android: Sqlite che salva l'array di stringhe?

public long createEntry(String startTime, String endTime, String[] states) { 
     ContentValues initialValues = new ContentValues(); 
     initialValues.put(START_KEY_TIME , startTime); 
     initialValues.put(END_KEY_TIME , endTime); 
     initialValues.put(KEY_STATE, states); 
      return databaseConnect.insert(DATABASE_TABLE, null, initialValues); 
     } 

ma se ho messo string [] gli stati in esso dice che cotentvalues ​​non è in grado di prendere un argomento. come faccio a girarci intorno? Pensavo di avere 7 cose negli stati che potevo avere 7 fili separati e immagazzinare cose in ognuno e poi dopo aver rimesso tutte le stringhe in un array di stringhe o sarebbe stata una cattiva pratica?

+0

Perché è necessario salvare l'array nel database? ci deve essere qualche altra buona soluzione. –

+0

ho 7 giorni della settimana ma e lo prende come booleano (vero o falso) e ha bisogno di essere booleano e dato che non puoi salvare il booleano nel database stavo per usare un array di stringhe ma non me lo permette a causa di valori cotentali qualche idea su cosa posso fare? – user1175899

+0

È possibile memorizzare i valori booleani come numeri interi 0 (falso) e 1 (vero). –

risposta

67

Non è possibile salvare l'array di stringhe nel database. Ma puoi usare questo trucco.

1) Quindi è necessario convertirlo in stringa semplice utilizzando il metodo convertArrayToString(String[] array). Questo concatenerà tutti gli elementi della stringa usando 'comma'.

2) Quando volete recuperare questa stringa indietro dal database è possibile convertire di nuovo alla serie String utilizzando convertStringToArray(String str) metodo. Questo metodo dividerà la stringa da "virgola" e riavrai il tuo array originale.

public static String strSeparator = "__,__"; 
public static String convertArrayToString(String[] array){ 
    String str = ""; 
    for (int i = 0;i<array.length; i++) { 
     str = str+array[i]; 
     // Do not append comma at the end of last element 
     if(i<array.length-1){ 
      str = str+strSeparator; 
     } 
    } 
    return str; 
} 
public static String[] convertStringToArray(String str){ 
    String[] arr = str.split(strSeparator); 
    return arr; 
} 
+0

È la stessa cosa. Quando concatinerete String con booleano. Boolean verrà automaticamente convertito in String. Quando recupererai la Matrice di Booleani devi digitare ogni elemento in Boolean per Boolean.parseBoolean (str [i]). –

+0

ok grazie mille im just new to android – user1175899

+0

@MuhammadNabeelArif hey sto ricevendo il checkbox check value in array.now voglio memorizzarlo nel database ma row.so differente com'è possibile? per esempio: [1,2,4] questo è il mio array e voglio memorizzarlo in like: 1 then new row e store 2 then new row e 4.how è possibile?Sono nuovo in Android quindi aiuto – Google

1

Sembra che il database non sia stato progettato come dovrebbe. Se si desidera memorizzare i dati booleani nel database SQLite, è possibile memorizzare i valori booleani come numeri interi 0 (falso) e 1 (vero)

+1

yai può essere memorizzato come 0, 1 ma poiché vi sono più di un devo usare int array e contentvalues ​​non lo permettono comunque? di dover fare nuovi int per ciascuno – user1175899

7

Converti in stringa singola per salvarlo in sqlite. Successivamente, recuperarlo da sqlite come singola stringa e convertirlo nuovamente in Array of String.

String ARRAY_DIVIDER = "#a1r2ra5yd2iv1i9der"; 

public String serialize(String content[]){  
    return TextUtils.join(ARRAY_DIVIDER, content); 
} 

public String[] derialize(String content){ 
    return content.split(ARRAY_DIVIDER); 
} 
+0

Potrebbe essere tardi ma ... Non riesco a pensare a un aspetto negativo di questo metodo pigro – Lobstw

+0

@Lobstw potrebbe portare a un comportamento inaspettato se uno degli elementi di '' 'content []' '' è successo a '' ' "# a1r2ra5yd2iv1i9der"' ''. Questo sarebbe serializzato, ma in seguito alla deserializzazione, l'ambiguità risulterebbe in due elementi di stringa vuoti al posto dell'elemento di una stringa offendente. Se altre aree del programma hanno rigide aspettative sulla dimensione dell'array, questo potrebbe portare a comportamenti indesiderati. – snapfractalpop

+0

@snapfractalpop sì sì, ma fare in modo che il divisore una lunga stringa alfanumerica eviterebbe questo comportamento in ~ 100% dei casi – Lobstw

7

Sulla base di Muhammed risposta, ma gestisce lista di stringhe, invece di matrice utilizza StringBuffer invece di stringa per i valori di concatenazione e:

private static String LIST_SEPARATOR = "__,__"; 

public static String convertListToString(List<String> stringList) { 
    StringBuffer stringBuffer = new StringBuffer(); 
    for (String str : stringList) { 
     stringBuffer.append(str).append(LIST_SEPARATOR); 
    } 

    // Remove last separator 
    int lastIndex = stringBuffer.lastIndexOf(LIST_SEPARATOR); 
    stringBuffer.delete(lastIndex, lastIndex + LIST_SEPARATOR.length() + 1); 

    return stringBuffer.toString(); 
} 

public static List<String> convertStringToList(String str) { 
    return Arrays.asList(str.split(LIST_SEPARATOR)); 
} 
2

Sarebbe più facile se si converte l'array di stringhe per JSONArray, utilizzare toString e quindi recuperarlo analizzando prima in JSONArray e quindi convertirlo in array di stringhe

+0

Questo è un metodo migliore della risposta accettata perché non verrà mai morso dalla stringa di separazione (come '__, __' o '# a1r2ra5yd2iv1i9der' ecc.) Trovato in uno degli elementi dell'array –