Android: SQLite сохраняет строковый массив? - PullRequest
30 голосов
/ 29 января 2012

Мне нужно сохранить строковый массив в базе данных, но он не позволит мне. Вот что у меня есть:

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

Но если я добавлю string[] состояний, это говорит о том, что значения содержимого не могут принимать аргумент. Как мне обойти это? Я думал, что у меня есть 7 вещей в состояниях, могу ли я иметь 7 отдельных строк и хранить вещи в каждой, а затем потом поместить все строки обратно в массив строк? Или это будет плохая практика?

Ответы [ 5 ]

80 голосов
/ 29 января 2012

Вы не можете сохранить массив строк в базе данных. Но вы можете использовать этот трюк.

1) Таким образом, вы должны преобразовать его в простую строку, используя метод convertArrayToString(String[] array). Это объединит все элементы строки с помощью запятой.

2) Когда вы извлекаете эту строку обратно из базы данных, вы можете преобразовать ее обратно в массив строк, используя метод convertStringToArray(String str). Этот метод отделит строку от запятой, и вы получите исходный массив обратно.

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;
}
12 голосов
/ 23 июня 2015

На основании ответа Мухаммеда, но обрабатывает List из String с вместо массива и использует StringBuilder вместо выделения многих String с при конкатенации значений:

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));
}
9 голосов
/ 13 октября 2014

Преобразуйте его в одну строку, чтобы сохранить в sqlite. Позже, извлеките его обратно из sqlite как одну строку и преобразуйте обратно в 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);
}
3 голосов
/ 29 августа 2015

Было бы проще, если вы конвертируете массив Strings в JSONArray, используете toString, а затем извлекаете его, сначала анализируя в JSONArray, а затем конвертируете его в массив Strings

1 голос
/ 29 января 2012

Похоже, ваша база данных разработана не так, как должно быть. Если вы хотите сохранить логические данные в базе данных SQLite, вы можете сохранить логические значения в виде целых чисел 0 (false) и 1 (true)

...