我是在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
行,我只能从比较字符串数据的行中访问元素,而不是通过Ids。有人能帮我吗?谢谢!
编辑:来自列表本身的图像。listView的图像示例。
如果是这样,我建议调用一个函数,该函数从sqlite中获取特定ID的数据(单击的列表的位置是ID)并更新该特定列表项,然后调用方法在通知适配器该列表项已更改,因此它将正确地取消列表视图的日期。
我想从数据库中检索名称。但我总是收到错误: 数据库Java语言 它不断返回错误 android.database.CursorIndexOutOfBoundsException:请求索引-1,大小为1,字符串名称=helper.getProductNameT(cur); 有人知道我的编码哪里出错了吗?
这是提供用户输入的主活动 } 这是Add_prople类 公共类Add_people扩展AppCompatActivity实现视图。OnClickListener{private EditText name EditText;private EditText ageEditText;private EditText heightEditText;private EditText weightede
问题内容: 我尝试从资产目录复制SQLite数据库,以便以后访问。但是我做不到! DatabaseHelper很简单: 尝试了一切!我尝试玩扩展!但是我仍然收到一个错误:复制数据库时出错: 我检查了模拟器,我的文件在那里,所以我应该可以写它!请任何帮助!真让我发疯! UPD 我试图将其放在SD卡上,并且可以正常工作。但仍然无法理解为什么我无法将其写入应用程序数据文件夹。 问题答案: 我使用此助手,
我想知道ehcache是否有办法检测数据库更新/插入(spring/java,hibernate web应用程序),并使用数据库中的当前(最新)数据刷新其缓存。如果没有,检测数据库更新的最佳方法是什么,以保持与缓存和数据库之间的数据同步?
我试图使用SQLite建立一个数据库来存储用户名和密码,但每当我在模拟器上注册一个帐户时,它就会出错。此外,如果我只是尝试登录而没有注册,它将出错。这只是我的第二篇帖子,所以如果我在发帖时有什么可以做得更好的,请告诉我! } 下面是DbHelper附带的登录类 } 这里是REGISTER类。 } 这是我运行上面描述的场景时得到的错误日志。 致命异常:主进程:com。适应。教程4,PID:4807A
附注。我对Sqlite没有太多的经验