web-dev-qa-db-fra.com

Android: tableau de chaînes de sauvegarde SQLite?

J'ai besoin de sauvegarder un tableau de chaînes dans la base de données, mais cela ne me le permet pas. Voici ce que j'ai

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

Mais si je mets des états string[] dans, cela signifie que les valeurs de contenu ne peuvent pas prendre d'argument. Comment puis-je contourner ça? Je pensais avoir 7 éléments dans des états, puis-je aimer avoir 7 chaînes distinctes et stocker des éléments dans chaque unité, puis les replacer ensuite dans un tableau de chaînes? Ou serait-ce une mauvaise pratique? 

28
user1175899

Vous ne pouvez pas enregistrer le tableau String dans la base de données. Mais vous pouvez utiliser cette astuce.

1) Vous devez donc le convertir en chaîne simple à l'aide de la méthode convertArrayToString(String[] array). Cela concaténera tous les éléments de chaîne en utilisant 'virgule'.

2) Lorsque vous souhaitez récupérer cette chaîne dans la base de données, vous pouvez la reconvertir en un tableau de chaînes à l'aide de la méthode convertStringToArray(String str). Cette méthode séparera la chaîne de 'virgule' et vous retrouverez votre tableau d'origine.

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

Basé sur la réponse de Muhammed mais gère List de Strings au lieu de array et utilise StringBuilder au lieu d'allouer plusieurs Strings lors de la concaténation de valeurs:

private static final String LIST_SEPARATOR = "__,__";

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

    // Remove last separator
    stringBuilder.setLength(stringBuilder.length() - LIST_SEPARATOR.length());

    return stringBuilder.toString();
}

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

Convertissez-le en chaîne unique pour l'enregistrer dans sqlite . Plus tard, récupérez-le à partir de sqlite en tant que chaîne unique et convertissez-le en tableau 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);
}
9
Aung Thiha

Il serait plus facile de convertir le tableau de chaînes en JSONArray, d’utiliser toString puis de le récupérer en l’analysant d’abord dans JSONArray, puis en le convertissant en tableau de chaînes.

3
jiahao

Il semble que votre base de données n’est pas conçue comme il se doit. Si vous souhaitez stocker les données booléennes dans la base de données SQLite, vous pouvez stocker les valeurs booléennes sous forme d'entiers 0 (false) et 1 (true).

1
Yaqub Ahmad