2016-11-03 3 views
-1

Я показываю listview с строками базы данных. При щелчке по строке появляется диалоговое окно с (редактируемыми) элементами этой строки.SQLite Database не обновляет строку, несмотря на возвращение 1

public class ViewDataActivity extends ListActivity { 

private ListView listView; 

HashMap<Integer, String> results = new HashMap<Integer, String>();; 
ArrayList<String> dataValues = new ArrayList<String>(); 
ArrayList<Integer> keyValues = new ArrayList<Integer>(); 

ArrayAdapter<String> arrayAdapter; 

Integer itemKey; 
String itemValue; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Intent intent = getIntent(); 
    results = (HashMap<Integer, String>) getIntent().getSerializableExtra(MainActivity.EXTRA_MESSAGE); 

    for(Map.Entry<Integer, String> entry: results.entrySet()) { 
     keyValues.add(entry.getKey()); 
     dataValues.add(entry.getValue()); 
    } 

    // Display items 
    listView = getListView(); 
    View v = getLayoutInflater().inflate(R.layout.list_view_header, null); 
    listView.addHeaderView(v); 

    arrayAdapter = new ArrayAdapter<String>(
      this, 
      android.R.layout.simple_list_item_1, 
      dataValues); 

    listView.setAdapter(arrayAdapter); 

    // Make Items clickable 
    listView.setChoiceMode(CHOICE_MODE_SINGLE); 
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      Log.d("List position clicked", String.valueOf(listView.getCheckedItemPosition())); 
      itemKey = keyValues.get(listView.getCheckedItemPosition()-1); 
      itemValue = dataValues.get(listView.getCheckedItemPosition()-1); 
      showInputBox(itemKey, itemValue); 
     } 
    }); 

} 

// Show dialog with values 
public void showInputBox(final Integer itemKey, String listItemValue){ 
    final Dialog dialog=new Dialog(ViewDataActivity.this); 
    dialog.setTitle("Edit Item"); 
    dialog.setContentView(R.layout.list_item_edit_popup); 
    TextView txtMessage=(TextView)dialog.findViewById(R.id.txtmessage); 
    txtMessage.setText("Update"); 
    txtMessage.setTextColor(Color.parseColor("#ff2222")); 

    String[] listItemValues = listItemValue.split(","); 

    final String liCategory = listItemValues[2]; 
    final String liDescription = listItemValues[3]; 
    final String liAmount = listItemValues[4]; 

    EditText editText1=(EditText)dialog.findViewById(R.id.txtinput1); 
    EditText editText2=(EditText)dialog.findViewById(R.id.txtinput2); 
    EditText editText3=(EditText)dialog.findViewById(R.id.txtinput3); 

    editText1.setText(liCategory); 
    editText2.setText(liDescription); 
    editText3.setText(liAmount); 

    Button bt=(Button)dialog.findViewById(R.id.btdone); 
    bt.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // Write new Values 
      dbHelper.updateExpense(itemKey, liCategory, liDescription, liAmount); 
      // Refresh ListView 
      arrayAdapter.notifyDataSetChanged(); 
      dialog.dismiss(); 
     } 
    }); 
    dialog.show(); 
} 

}

Но когда я обновить значения в диалоговом окне и нажмите кнопку, диалоговое окно закроется, но строка не обновляется в базе данных. Выполняется обновление:

public boolean updateExpense(Integer id, String category, String description, String amount) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(COLUMN_CATEGORY, category); 
    contentValues.put(COLUMN_DESCRIPTION, description); 
    contentValues.put(COLUMN_AMOUNT, amount); 
// Returns 1 but no update  
Log.d("DBUpdate", String.valueOf(db.update(TABLE_NAME, contentValues, COLUMN_ID + " = ? ", new String[] { Integer.toString(id) }))); 
    return true; 
} 

Что мне не хватает?

+0

Почему бы не использовать [CursorLoader] (https://developer.android.com/reference/android/content/CursorLoader.html), чтобы обновить ListView без базы данных запроса? –

+0

* Что мне не хватает? * Код, в котором вы проверяете, что есть * без обновления * – Selvin

+0

@Selvin Вы можете уточнить? Тот же код, который использовался для заполнения списка, может использоваться для проверки того, была ли обновлена ​​строка. – Jay

ответ

0

Сложно сказать, что код, который вы показываете нам, является неполным, но если вы используете database.beginTransaction();, убедитесь, что вы используете после вашего запроса на обновление. Также не забудьте database.endTransaction(); в вашем заявлении finally.

+0

Это весь код, показывающий соответствующий диалог и операцию обновления db. Дайте мне знать, если вам нужна какая-либо конкретная информация. – Jay

+0

Хорошо, тогда, возможно, попробуйте обернуть свой вызов в вышеуказанные методы. Может помочь .. – vkislicins

+0

Также, когда вы говорите, что база данных не обновлялась - откуда вы это знаете? Вы вытащили db из телефона и проверили? – vkislicins

Смежные вопросы