在我的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}}属性?
也许有一个更简单的解决方案?
由于
答案 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();
}