2012-01-29 12 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セピアートの文字列を持っていて、それぞれに文字列を格納しています。そして、すべての文字列を文字列配列に戻した後、それは悪い習慣でしょうか?

+0

なぜデータベースに配列を保存する必要がありますか?他にも良い解決策があるはずです。 –

+0

私は週7日ですが、それはブール値(真または偽)としてそれを取るとブール値である必要がありますし、データベースに私は文字列の配列を使用するつもりだったあなたはブール値を保存できませんので、私は何をすることができますか? – user1175899

+0

ブール値は、整数0(偽)と1(真)として格納できます。 –

答えて

67

データベースに文字列配列を保存することはできません。しかし、あなたはこのトリックを使うことができます。

1) メソッドを使用して単純な文字列に変換する必要があります。これは、文字列のすべての要素を 'カンマ'で連結します。

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

同じことです。ブール値とStringを連結するとき。 Booleanは自動的にStringに変換されます。ブール値の配列を取得するときは、入力する必要があります。Boolean.parseBoolean(str [i])によって各項目をブール値にキャストします。 –

+0

okありがとうたくさんのimはちょうどアンドロイドに新しい – user1175899

+0

@MuhammadNabeelArifねえ、私はデータベースに格納したいarray.nowのチェックボックスの値をチェックしています。例:[1,2,4]これは私の配列です。私はそれを次のように保存したい:1新しい行と2の新しい行を格納し、4.howはそれが可能ですか?私はアンドロイドの新しいので助けて – Google

1

データベースが設計されていないようです。ブール値のデータをSQLiteデータベースに保存する場合は、ブール値を整数0(偽)と1(真)として保存することができます。

+1

yaiは0,1として保存できますが、 int配列を使用しなければならないとcontentvaluesは、とにかくそれを許可していないのですか?それぞれのために新しいintを作ることよりも – user1175899

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

+0

@Lobstw '' 'content []' '' 'の要素の1つが' '' ''#a1r2ra5yd2iv1i9der "' ''。これはシリアライズされますが、デシリアライズ時にはあいまいさが原因で、問題の1つの文字列要素の代わりに2つの空の文字列要素が生成されます。プログラムの他の領域に配列サイズが厳密に指定されていると、望ましくない動作につながる可能性があります。 – snapfractalpop

+0

@snapfractalpopはい、そうですが、分数を長い英数字の文字列にすると、ほとんどの場合 – Lobstw

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

配列要素の1つにあるセパレータ文字列( '__、__'や '#a1r2ra5yd2iv1i9der'など)に決して噛まれないので、これは受け入れられた答えよりも優れた方法です –

関連する問題