gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:30:01 24 4
gpt4 key购买 nike

我是在 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();
}

我使用 android:onClick="edita_Materia" 将更新函数调用到 item_todo.xml 文件中

<!-- ... -->
<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.

最佳答案

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

关于java - Android - 我无法从 SQLite 数据库更新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44599438/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com