2012-01-29 83 views
23

我需要字符串数组保存到数据库中,但它不会让我这是什么,我有:Android:Sqlite保存字符串数组?

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

,但如果我把字符串[]表示它说,cotentvalues不能带任何参数。我该如何解决这个问题。我认为我有7种状态,我可以喜欢有7 sepearte字符串和存储在每个东西,然后把所有字符串返回到字符串数组或将这是不好的做法吗?

+0

为什么需要将数组保存到数据库中?必须有其他一些好的解决方案。 – 2012-01-29 13:55:14

+0

我有7天的一周,但它需要它作为布尔(真或假),它需要是布尔值,因为你不能保存布尔值数据库我打算使用字符串数组,但它不会让我因为cotentvalues关于我能做什么的想法? – user1175899 2012-01-29 13:59:17

+0

可以将布尔值存储为整数0(假)和1(真)。 – 2012-01-29 14:03:42

回答

67

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

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

这是同样的事情。何时将用布尔值来对字符串进行分析。布尔值将自动转换为字符串。当您要检索布尔数组时,您必须通过Boolean.parseBoolean(str [i])将每个项输入到布尔值中。 – 2012-01-29 14:31:05

+0

好吧,非常感谢我只是新的Android的 – user1175899 2012-01-29 14:35:22

+0

@MuhammadNabeelArif嘿我收到checkbox check.value array.now我想将它存储在数据库,但不同的row.so它是如何posible?例如:[1,2,4]这是我的数组nd我想存储它像:1然后新的行和商店2然后新的行和4。它是否可行?我是新的android所以帮助 – Google 2013-01-01 06:01:26

1

它看起来像你的数据库没有设计它应该是。如果要将布尔值数据存储在SQLite数据库中,则可以将布尔值存储为整数0(false)和1(true)

+1

亚伊可以存储为0,1但由于有多个我必须使用int数组,contentvalues不允许在那里呢?比必须为每一个新的int – user1175899 2012-01-29 14:11:20

7

将其转换为单个字符串以将其保存在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); 
} 
+0

它可能会迟到,但......我想不出这种懒惰方法的缺点 – Lobstw 2016-07-03 01:59:38

+0

@Lobstw如果内容[]'''的其中一个元素碰巧是“ ' “#a1r2ra5yd2iv1i9der”'''。这将被序列化,但是在反序列化时,含糊不清将导致两个空字符串元素替代有问题的一个字符串元素。如果程序的其他区域对阵列大小有严格的要求,这可能会导致不希望的行为。 – snapfractalpop 2017-05-14 10:15:19

+0

@snapfractalpop是的这是正确的,但使分频器长字母数字字符串将避免在〜100%的情况下这种行为 – Lobstw 2017-05-15 00:56:56

7

基于穆罕默德的答案,但处理字符串,而不是阵列的列表,并使用StringBuffer的问题,而不是字符串值串联:

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

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

+0

这是一个比接受的答案更好的方法,因为您不会被其中一个数组元素中的分隔符字符串(比如'__,__'或'#a1r2ra5yd2iv1i9der等) – 2017-09-04 14:11:05