如何保存数据库中的复选框状态(true和false状态)

时间:2014-04-17 22:21:32

标签: android checkbox

在我的Android应用中,我有一个数据库,其中存储Phrase个对象和Theme个对象,以及其他数据。这些短语具有属性sourceLanguage(字符串)和isSelected属性(字符串也是如此,因为SQLITE没有布尔值 - 无法回想起为什么我没有使用0和1,但那不相关)。主题包含一个或多个短语。

我有一项活动,其中为用户提供了一个主题列表listView。当他选择一个主题时,会显示一个警告对话框,其中包含checkbox个短语列表,以便他可以选择一个或多个。我想使用AlertDialog复选框中的信息更新数据库中的每个短语,将isSelected更改为" true"或者" false",具体取决于用户的选择。

我的困难在于我到目前为止在网上找到的例子允许保存" true"元素的状态,但不是" false"。因此,如果短语存储为" true",然后更改为" false",它就不会出现在selectedItems中,我也没有访问它并将其修改为" false"的引用。我已经提出了几个解决方案,但我对此没有任何信心,这就是你可以帮助我的地方。

My AlertDialog方法:

private void showAlertDialog(int themeId, String themeName) {
    // TODO Auto-generated method stub

// Build the list of phrases for respective theme and list of previously selected items
final DatabaseHandler db = new DatabaseHandler(this);
List<Phrase> allThemePhr = db.getPhrases("with_theme", themeId, null); // all phrases for selected theme 
CharSequence[] sourceLanguageAllPhr = new String[allThemePhr.size()]; // source language of all phrases for selected theme
boolean[] selectedItems = new boolean[allThemePhr.size()]; // selected items only
final List<String> sourceLanguageSelectedPhr = new ArrayList<String>();
final List<String> sourceLanguageNOTSelectedPhr = new ArrayList<String>();

for (int i = 0 ; i < allThemePhr.size() ; i++){
    sourceLanguageAllPhr[i] = allThemePhr.get(i).getSource_language();
    selectedItems[i] = false;
    if (allThemePhr.get(i).getItemSelected() == "true"){
        selectedItems[i] = true;
        sourceLanguageSelectedPhr.add(allThemePhr.get(i).getSource_language());
    }
}


// Build the dialog
@SuppressWarnings("rawtypes")
final ArrayList selectedPhrases = new ArrayList();

AlertDialog.Builder builder = new AlertDialog.Builder(PickTheme.this);
builder.setTitle(themeName)
        .setMultiChoiceItems(sourceLanguageAllPhr, selectedItems, new DialogInterface.OnMultiChoiceClickListener() {
            @SuppressWarnings("unchecked")
            @Override
            public void onClick(DialogInterface dialog, int which,
                    boolean isChecked) {
                // TODO Auto-generated method stub
                if(isChecked){
                    selectedPhrases.add(which);
                    //sourceLanguageSelectedPhr.add(selectedPhrases.get(which).toString());
                } else if (selectedPhrases.contains(which)){
                    selectedPhrases.remove(Integer.valueOf(which));
                    //sourceLanguageSelectedPhr.remove(selectedPhrases.get(which).toString());
                    //sourceLanguageNOTSelectedPhr.add(selectedPhrases.get(which).toString());
                }
            }
        })
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                //for (String sourceLanguage : sourceLanguageSelectedPhr){
                    //db.updatePhrase(sourceLanguage, "true");
                    //Log.i("selectedPhrase", selectedPhrases.get(which).toString());
                //}
            }
        })
        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub

            }
        });
    builder.create().show();
}

在我的DatabaseHelper类中,我已经定义了可用于更新短语的这些方法:

// updating a phrase

public int updatePhrase(Phrase phrase){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_PHRASE_ID, phrase.getWord_id());
values.put(COLUMN_SOURCE_LANGUAGE, phrase.getSource_language());
values.put(COLUMN_TARGET_LANGUAGE, phrase.getTarget_language());
values.put(COLUMN_PHRASE_REMINDER_DATE, phrase.getTarget_language());
values.put(COLUMN_PHRASE_THEME_ID, phrase.getTheme_id());
values.put(COLUMN_PHRASE_REMINDER_ID, phrase.getTheme_id());

int phraseUpdated = db.update(PHRASES_TABLE, values, COLUMN_PHRASE_ID + " =?", new String[] {String.valueOf(phrase.getWord_id())});
db.close();
return phraseUpdated;
}

// updating a phrase based on given source_language
public void updatePhrase(String sourceLanguage, String isSelected){
    SQLiteDatabase db = this.getWritableDatabase();
    String updateStatement = "UPDATE " + PHRASES_TABLE
                             + " SET " + COLUMN_ITEM_SELECTED + " = " + isSelected
                             + " WHERE " + COLUMN_SOURCE_LANGUAGE + " = " + sourceLanguage;
    db.execSQL(updateStatement);
}

到目前为止,我已经想到了一些解决方案,这个似乎是最好的:当选择/取消选择一个短语时,从allThemePhr获取它,相应地更新对象,然后保存它在另一个列表中。如果用户单击“确定”,请使用该列表更新数据库。我的问题是:如何将which的值与allThemePhr中的相应对象相匹配?如果我可以弄清楚如何获取复选框文本,那么这应该是可以接受的,因为它对应于source_language的{​​{1}}属性?

也许有一个更简单的解决方案?

由于

1 个答案:

答案 0 :(得分:0)

索引与词组对象在全局短语List allThemePhr中的索引之间存在匹配,因此无需查看复选框的字符串/ sourceLanguage的值。

所以,我只是创建了一个地图,用于存储索引which与复选框状态(isChecked)之间的对应关系。然后,如果用户按下&#34;确定&#34;,我遍历该地图,从allThemePhr获取相应的短语对象并更新它。

以下是最终代码:

private void showAlertDialog(int themeId, String themeName) {
// TODO Auto-generated method stub

// Build the list of phrases for respective theme and list of previously selected items
final DatabaseHandler db = new DatabaseHandler(this);
final List<Phrase> allThemePhr = db.getPhrases("with_theme", themeId, null); // all phrases for selected theme 
final Map<Integer, Boolean> selectionChanges = new HashMap<Integer,Boolean>();
CharSequence[] sourceLanguageAllPhr = new String[allThemePhr.size()]; // source language of all phrases for selected theme
boolean[] selectedItems = new boolean[allThemePhr.size()]; // selected items only


for (int i = 0 ; i < allThemePhr.size() ; i++){
    Phrase phrase = allThemePhr.get(i);
    sourceLanguageAllPhr[i] = phrase.getSource_language();


    if (phrase.getItemSelected().equals("true")){
        selectedItems[i] = true;
    }
}


// Build the dialog
AlertDialog.Builder builder = new AlertDialog.Builder(PickTheme.this);
builder.setTitle(themeName)
        .setMultiChoiceItems(sourceLanguageAllPhr, selectedItems, new DialogInterface.OnMultiChoiceClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which,
                    boolean isChecked) {

                selectionChanges.put(which, isChecked);


            }
        })
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                for (Map.Entry<Integer, Boolean> entry : selectionChanges.entrySet()){
                    Phrase phrase = allThemePhr.get(entry.getKey());

                    phrase.setItemSelected(String.valueOf(entry.getValue()));


                }
            }
        })
        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub

            }
        });
        builder.create().show();
}
相关问题