I am rather new using SQL in Android apps, and I am having some trouble to update the table I have created with a listView I use with it. I manage to update an element from the listView, but it's not the right one, it's always the first one from the list that changes.
I have made a table with only one column (I shall add more two later on) and here is how i build it:
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();
}
I make a call to the update function into the item_todo.xml
file using 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" />
<!-- ... -->
I understand that I am not getting the right ID but I can't seem to find a way to get the right element from the listView. If you take a look on the String sql
line, I only reach the element from a row comparing a string data, and not through Ids. Can someone help me with that? Thanks!
EDIT: Image from the List itself. Image example for the listView.