Android - 我无法从SQLite数据库更新数据

时间:2017-06-16 23:56:12

标签: java android sql sqlite listview

我在Android应用程序中使用SQL相当新,我在使用listView使用它创建的表格时遇到了一些麻烦。我设法从listView更新一个元素,但它不是正确的,它始终是列表中第一个更改的元素。

我已经制作了一个只有一列的表格(我稍后会添加两个以上),以下是我如何构建它:

TaskContract_Faltas.java

class TaskContract_Faltas {
  static final String DB_NAME = "com.example.TodoList.db.tasks";
  static final int DB_VERSION = 1;
  static final String TABLE = "tasks";

  class Columns {
      static final String TASK = "task";
      static final String _ID = BaseColumns._ID;
  }
}

TaskDbHelper_Faltas

class TaskDbHelper_Faltas extends SQLiteOpenHelper {

TaskDbHelper_Faltas(Context context) {
    super(context, TaskContract_Faltas.DB_NAME, null, TaskContract_Faltas.DB_VERSION);
}

@Override
public void onCreate(SQLiteDatabase sqlDB) {
    String sqlQuery =
            String.format("CREATE TABLE %s (" +
                            "_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                            "%s TEXT)", TaskContract_Faltas.TABLE,
                    TaskContract_Faltas.Columns.TASK);

    Log.d("TaskDBHelper","Query to form table: "+sqlQuery);
    sqlDB.execSQL(sqlQuery);
}

@Override
public void onUpgrade(SQLiteDatabase sqlDB, int i, int i2) {
    sqlDB.execSQL("DROP TABLE IF EXISTS "+TaskContract_Faltas.TABLE);
    onCreate(sqlDB);
}
}

Faltas.java

ListView lista;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.faltas2);
    setTitle("Gerenciador de Faltas");

    lista = (ListView) findViewById(R.id.lista_falta);

    updateUI();

}

//...

public void edita_Materia(View view){

    final Dialog dialog = new Dialog(Faltas2.this);
    dialog.setContentView(R.layout.janela_faltas_add);

    TextView titulo = (TextView) dialog.findViewById(R.id.Titulo_Dialog);
    titulo.setText("Editar Matéria");

    Button cancelarBotao = (Button) dialog.findViewById(R.id.botao_cancelar);
    Button aceitarBotao = (Button) dialog.findViewById(R.id.botao_aceitar);
    final EditText nome_materia = (EditText) dialog.findViewById(R.id.texto_disciplina_falta);

    // The error starts here
    TextView texto = (TextView) findViewById(R.id.Titulo_disciplina);
    nome_materia.setText(texto.getText().toString(), TextView.BufferType.EDITABLE);

    final String teste = texto.getText().toString();
    // From here        

    cancelarBotao.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dialog.dismiss();
        }
    });

    aceitarBotao.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String task = nome_materia.getText().toString();

            String sql = String.format("UPDATE %s SET %s = '%s' WHERE %s = '%s'",
                    TaskContract_Faltas.TABLE,
                    TaskContract_Faltas.Columns.TASK,
                    task,
                    TaskContract_Faltas.Columns.TASK,
                    teste);

            Log.d("Faltas2", "A ID eh: " + TaskContract_Faltas.Columns._ID);

            helper = new TaskDbHelper_Faltas(Faltas2.this);
            SQLiteDatabase sqlDB = helper.getWritableDatabase();
            sqlDB.execSQL(sql);
            updateUI();
            dialog.dismiss();
        }
    });

    dialog.show();
}

private void updateUI() {

    helper = new TaskDbHelper_Faltas(Faltas2.this);
    SQLiteDatabase sqlDB = helper.getReadableDatabase();
    Cursor cursor = sqlDB.query(TaskContract_Faltas.TABLE,
            new String[]{TaskContract_Faltas.Columns._ID, TaskContract_Faltas.Columns.TASK},
            null, null, null, null, null);

    ListAdapter listAdapter = new SimpleCursorAdapter(
            this,
            R.layout.item_todo,
            cursor,
            new String[]{TaskContract.Columns.TASK},
            new int[]{R.id.Titulo_disciplina},
            0
    );
    lista.setAdapter(listAdapter);
    visi_info();
}

我使用item_todo.xml

调用更新功能到android:onClick="edita_Materia"文件中
<!-- ... -->
<ImageButton
    android:id="@+id/botao_editar"
    android:src="@drawable/ic_edit_black_24dp"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:scaleType="fitCenter"
    android:adjustViewBounds="true"
    android:onClick="edita_Materia"
    android:background="@drawable/botao_borda_falta"
    android:layout_alignParentTop="true"
    android:layout_alignParentEnd="true"
    android:contentDescription="@string/botao_materia" />
<!-- ... -->

我知道我没有得到正确的ID,但我似乎找不到从listView获取正确元素的方法。如果您查看String sql行,我只会从比较字符串数据的行中到达元素,而不是通过ID。有人可以帮助我吗?谢谢!

编辑:来自列表本身的图片。 Image example for the listView.

1 个答案:

答案 0 :(得分:1)

当您点击按钮acceitarBotao时,您是否尝试更新列表项? 如果是这样,我建议调用一个函数,从sqlite获取该sprcific ID的数据(点击的listitem的位置是id)并更新该特定列表项,然后调用方法notifyDatasetChanged,以通知适配器sprcific列表item已更改,因此它会正确地列出listview。