2012-01-29 22 views
23

tengo que ahorrar matriz de cadenas a la base de datos pero no me deja esto es lo que tengo:Android: ¿Sqlite ahorra matriz de cadenas?

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); 
     } 

pero si pongo string [] estados en los que dice que cotentvalues ​​no es capaz de tomar un argumento. ¿Cómo puedo solucionar eso? Estaba creo que tengo cosas en 7 estados pude me gusta tener cadena 7 sepearte y almacenar cosas en cada uno y luego después de poner todas las cadenas de nuevo en una matriz de cadenas o de que hubiera una mala práctica?

+0

¿por qué es necesario guardar la matriz en la base de datos? debe haber alguna otra buena solución. –

+0

tengo 7 días de la semana pero y lo toma como booleano (verdadero o falso) y NECESITA ser booleano y como no se puede guardar booleano en la base de datos, iba a usar una matriz de cadenas pero no me lo permite debido a valores comunes alguna idea sobre lo que puedo hacer? – user1175899

+0

Puede almacenar los valores booleanos como enteros 0 (falso) y 1 (verdadero). –

Respuesta

67

No puede guardar la matriz de cadenas en la base de datos. Pero puedes usar este truco.

1) Así que hay que convertirlo en cadena sencilla usando convertArrayToString(String[] array) método. Esto concatenará todos los elementos de cadena usando 'coma'.

2) Cuando usted recuperar esta Cadena de vuelta de la base de datos se podría convertir de nuevo a la matriz de cuerdas utilizando convertStringToArray(String str) método. Este método dividirá la cadena de 'coma' y obtendrá su matriz original de nuevo.

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

Es lo mismo. Cuando concatute Cadena con booleano. Boolean se convertirá automáticamente a String. Cuando va a recuperar de nuevo la matriz de booleanos que tiene que escribir cada elemento fundido en booleana por Boolean.parseBoolean (str [i]). –

+0

ok gracias im una gran cantidad apenas nuevo a Android – user1175899

+0

@MuhammadNabeelArif hey yo estoy haciendo casilla valor facturado array.now quiero almacenarla en la base de datos, pero diferentes row.so cómo es Posible? por ejemplo: [1,2,4] esta es mi matriz y quiero almacenarla en like: 1 luego nueva fila y almacenar 2 luego nueva fila y 4. ¿cómo es posible?Soy nuevo en Android, así que ayuda – Google

1

Parece que a la base de datos no está diseñado como debe ser. Si desea almacenar los datos booleanos en la base de datos SQLite, puede almacenar los valores booleanos como enteros 0 (falso) y 1 (verdadero)

+1

yai puede almacenar como 0, 1 pero ya que hay más de una i tiene que usar int array y contentvalues ​​no permite eso de todos modos alrededor de eso? que tener que hacer una nueva int para cada uno – user1175899

7

Conviértalo en una Cadena para guardarlo en sqlite. Más tarde, recuperar de nuevo de SQLite como una sola cadena y convertirla de nuevo a array de cadenas.

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

Puede ser tarde, pero ... No puedo pensar en un inconveniente para este método perezoso – Lobstw

+0

@Lobstw podría conducir a un comportamiento inesperado si uno de los elementos de '' 'content []' '' resulta ser '' '" # a1r2ra5yd2iv1i9der "' ''. Esto se serializaría, pero luego de la deserialización, la ambigüedad daría como resultado dos elementos de cadena vacíos en lugar del elemento de cadena que ofende. Si otras áreas del programa tienen expectativas estrictas del tamaño de la matriz, esto podría conducir a un comportamiento no deseado. – snapfractalpop

+0

@snapfractalpop Sí, eso es correcto, pero hacer del divisor una cadena alfanumérica larga evitaría este comportamiento en ~ 100% de los casos – Lobstw

7

Basado en respuesta Muhammed pero maneja lista de cadenas en lugar de la matriz y utiliza StringBuffer en lugar de cuerdas para los valores de concatenación:

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

Sería más fácil si convierte el array de Strings a JSONArray, utilizar toString y luego, recuperarlo mediante el análisis por primera vez en JSONArray y luego, convertirlo en una matriz de cadenas

+0

Este es un método mejor que la respuesta aceptada porque nunca será mordido por la cadena de separación (como '__, __' o '# a1r2ra5yd2iv1i9der', etc.) que se encuentra en uno de los elementos de la matriz –