当前位置: 首页 > 知识库问答 >
问题:

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

宿嘉庆
2023-03-14

我是在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的图像示例。

共有1个答案

夹谷沛
2023-03-14

如果是这样,我建议调用一个函数,该函数从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没有太多的经验