我很新的在Android應用程序中使用SQL,我有一些麻煩來更新我創建的表與我使用的listView。我設法從listView更新一個元素,但它不是正確的,它總是第一個從列表中更改。Android - 我無法從SQLite數據庫更新數據
我已經做了表只有一列(我將稍後添加更多二),這裏是我如何構建它:
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
行,我只能從一行比較字符串數據到達元素,而不是通過Ids。有人可以幫助我嗎?謝謝!
編輯:圖片從列表本身。 Image example for the listView.
當你在texto中添加值時,也保存id並在「edita_Materia」中使用id –
我不明白。你能告訴我如何保存這樣的身份證嗎?這個調用來自一個XML'android:onClick',我不確定如何從中取回一個id。 –
你如何在texto ..中設置一個值? –