Ich bin ziemlich neu mit SQL in Android-Apps, und ich habe einige Probleme, um die Tabelle, die ich mit einer ListView erstellt habe ich mit ihm zu aktualisieren. Ich kann ein Element aus der listView aktualisieren, aber es ist nicht das richtige, es ist immer das erste Element aus der Liste, das sich ändert.Android - Ich kann Daten von SQLite-Datenbank nicht aktualisieren
Ich habe eine Tabelle gemacht mit nur einer Spalte (Ich werde mehr zwei später hinzufügen) und hier ist, wie ich es bauen:
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();
}
Ich mache einen Aufruf an die Update-Funktion in die item_todo.xml
Datei 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" />
<!-- ... -->
mit Ich verstehe, dass ich nicht die richtige ID bekommen, aber ich kann nicht einen Weg zu finden scheinen Holen Sie sich das richtige Element aus der listView. Wenn Sie einen Blick auf die Zeile String sql
werfen, erreiche ich das Element nur aus einer Zeile, die einen String-Daten vergleicht, und nicht durch Ids. Kann mir jemand dabei helfen? Vielen Dank!
EDIT: Bild aus der Liste selbst.
wenn Sie den Wert in Text hinzufügen, um die ID auch zu speichern und verwenden Sie die ID in "edita_Materia" –
Ich verstehe nicht. Kannst du mir zeigen, wie ich eine solche ID speichern kann? Der Anruf kommt von einem XML-'android: onClick', ich bin mir nicht sicher, wie genau ich eine ID bekommen kann, die von ihm kommt. –
Wie stellen Sie einen Wert in Text ein ..? –