【问题标题】:Android: SQLite saving string array?Android:SQLite 保存字符串数组?
【发布时间】:2012-01-29 13:53:13
【问题描述】:

我需要将一个字符串数组保存到数据库中,但它不会让我这样做。这就是我所拥有的:

 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[] states,它表示内容值不能接受参数。我该如何解决?我在想我有 7 个州的东西,我可以有 7 个单独的字符串并在每个字符串中存储东西,然后将所有字符串放回字符串数组吗?或者那是不好的做法?

【问题讨论】:

  • 为什么需要将数组保存在数据库中?一定有其他好的解决方案。
  • 我一周有 7 天,但它以布尔值(true 或 false)的形式输入,它需要是布尔值,因为你不能将布尔值保存到数据库中,所以我打算使用字符串数组,但是它不会让我因为 cotentvalues 对我能做什么有任何想法?
  • 您可以将布尔值存储为整数 0 (false) 和 1 (true)。
  • 可以使用整数值来存储标志值。例如。对于星期日和星期二,该值将是 01010000(二进制)或类似的值。话虽如此,您实际上应该将七个布尔值存储在单独的列中。
  • 另一种方法可能是使用 JSONObject,如 [此处](stackoverflow.com/questions/5703330/…) 所述

标签: android android-sqlite


【解决方案1】:

您不能将字符串数组保存到数据库中。但是你可以使用这个技巧。

1) 所以你必须使用convertArrayToString(String[] array) 方法将它转换成简单的字符串。这将使用“逗号”连接字符串的所有元素。

2) 当您从数据库中检索此字符串时,您可以使用convertStringToArray(String str) 方法将其转换回字符串数组。此方法会将字符串从 'comma' 中拆分出来,然后您将得到原始数组。

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

【讨论】:

  • 是一样的。当您将字符串与布尔值连接时。布尔值将自动转换为字符串。当您检索布尔数组时,您必须通过 Boolean.parseBoolean(str[i]) 将每个项目类型转换为布尔值。
  • @MuhammadNabeelArif 嘿,我在数组中得到复选框选中的值。现在我想将它存储在数据库中但不同的行中。那么它怎么可能?例如:[1,2,4] 这是我的数组,我想将它存储在:1 然后是新行并存储 2 然后是新行和 4.它是如何可能的?我是 android 新手所以帮助跨度>
  • 这很简单,考虑每条记录 1,2,4 等单独的条目,现在为每个条目准备一行并将其插入到数据库中。您需要了解 db 的基础知识。这是一个快速教程'androidhive.info/2011/11/android-sqlite-database-tutorial'
  • 从技术上讲,我认为最好使用 StringBuilder 来构建数字字符串,尽管编译器可能会优化它。
  • 如果数组的任何元素包含',',这将不起作用
【解决方案2】:

基于 Muhammed 的回答,但处理 Strings 的 List 而不是数组,并在值连接期间使用 StringBuilder 而不是分配许多 Strings:

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

【讨论】:

    【解决方案3】:

    将其转换为单个字符串以将其保存在 sqlite 中。 稍后,从 sqlite 将其作为单个字符串检索回来,并将其转换回字符串数组。

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

    【讨论】:

    • 可能已经晚了,但是......我想不出这种懒惰方法的缺点
    • @Lobstw 如果content[] 的元素之一恰好是"#a1r2ra5yd2iv1i9der",它可能会导致意外行为。这将被序列化,但在反序列化时,歧义将导致两个空字符串元素代替有问题的一个字符串元素。如果程序的其他区域对数组大小有严格的要求,这可能会导致不良行为。
    • @snapfractalpop 是的,没错,但将分隔符设为长字母数字字符串将在 ~100% 的情况下避免这种行为
    • @Lobstw 在大多数情况下,我同意。我评论指出,这些 0.001% 案例的背景可能很重要。例如,如果这导致一些错误,然后导致其他依赖错误保证的代码领域的某种安全漏洞,那么 0.001% 可以迅速增长到包括脚本小子等。
    【解决方案4】:

    如果将字符串数组转换为 JSONArray,使用 toString,然后通过首先解析为 JSONArray 来检索它,然后将其转换为字符串数组,会更容易

    【讨论】:

    • 这是一种比公认答案更好的方法,因为您永远不会被其中一个数组元素中的分隔符字符串(如 __,__#a1r2ra5yd2iv1i9der 等)咬住
    【解决方案5】:

    您的数据库似乎没有按应有的方式设计。如果要将布尔数据存储在 SQLite 数据库中,可以将布尔值存储为整数 0(假)和 1(真)

    【讨论】:

    • yai 可以存储为 0, 1 但由于有多个我必须使用 int 数组并且 contentvalues 无论如何都不允许这样做?而不是必须为每个人制作新的 int
    猜你喜欢
    • 2016-03-02
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 2021-06-19
    • 2011-10-18
    • 2021-04-20
    • 2013-11-14
    相关资源
    最近更新 更多