android - 使用 simpleCursorAdapter - requery() 插入新记录后更新 ListView

标签 android sqlite listview

我了解requery() 机制,但我不了解其实现:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        datasource = new pollDataSource(this);
        datasource.open();

        Cursor values = datasource.getAllCategorie();

        String[] categorieColumns =
            {
                MySQLiteHelper.COLUMN_NOME   // Contract class constant containing the word column name

            };


            int[] mWordListItems = { R.id.categoria_label };


        SimpleCursorAdapter adapter = new SimpleCursorAdapter(
                getApplicationContext(),               // The application's Context object
                R.layout.single_list_item,             // A layout in XML for one row in the ListView
                values,                                // The result from the query
                categorieColumns,                      // A string array of column names in the cursor
                mWordListItems,                        // An integer array of view IDs in the row layout
                0);                                    // Flags (usually none are needed)


        setListAdapter(adapter);
    }




      public void onClick(View view) {
          categorie categoria = null;
        switch (view.getId()) {
        case R.id.add:

            categoria = datasource.createCategoria("pluto") ;
          break;


        case R.id.categoria_label:


          break;

        }

      }

categoria = datasource.createCategoria("pluto"); 之后我必须定义另一个:

SimpleCursorAdapter adapter = new SimpleCursorAdapter(
                    getApplicationContext(),               // The application's Context object
                    R.layout.single_list_item,             // A layout in XML for one row in the ListView
                    values,                                // The result from the query
                    categorieColumns,                      // A string array of column names in the cursor
                    mWordListItems,                        // An integer array of view IDs in the row layout
                    0);                                    // Flags (usually none are needed)


            setListAdapter(adapter);

投票数据源:

public class pollDataSource {
    // Database fields
      private SQLiteDatabase database;
      private MySQLiteHelper dbHelper;
      private String[] allCategorieColumns = { MySQLiteHelper.COLUMN_ID,
          MySQLiteHelper.COLUMN_PREF, MySQLiteHelper.COLUMN_NOME };   
      private String[] allSondaggiColumns = { MySQLiteHelper.COLUMN_ID,
              MySQLiteHelper.COLUMN_CATID, MySQLiteHelper.COLUMN_DOMANDA };   
      private String[] allRisposteColumns = { MySQLiteHelper.COLUMN_ID, 
              MySQLiteHelper.COLUMN_SONDID, MySQLiteHelper.COLUMN_RISPOSTA, 
              MySQLiteHelper.COLUMN_SELEZIONATA };


      public pollDataSource(Context context) {
            dbHelper = new MySQLiteHelper(context);
          }

      public void open() throws SQLException {
            database = dbHelper.getWritableDatabase();
          }

      public void close() {
            dbHelper.close();
          }

      public categorie createCategoria(String categoria) {
            ContentValues values = new ContentValues();
            values.put(MySQLiteHelper.COLUMN_NOME, categoria);
            values.put(MySQLiteHelper.COLUMN_PREF, 0);
            long insertId = database.insert(MySQLiteHelper.TABLE_CATEGORIE, null,
                values);
            Cursor cursor = database.query(MySQLiteHelper.TABLE_CATEGORIE,
                allCategorieColumns, MySQLiteHelper.COLUMN_ID + " = " + insertId, null,
                null, null, null);
            cursor.moveToFirst();
            categorie newCategoria = cursorToCategorie(cursor);
            cursor.close();
            return newCategoria;
          } 

      public void deleteCategoria(categorie categoria) {
            long id = categoria.getId();
            System.out.println("Categoria cancellata, id: " + id);
            database.delete(MySQLiteHelper.TABLE_CATEGORIE, MySQLiteHelper.COLUMN_ID
                + " = " + id, null);
          }

      public sondaggi createSondaggio(String domanda, int catid) {
            ContentValues values = new ContentValues();
            values.put(MySQLiteHelper.COLUMN_DOMANDA, domanda);
            values.put(MySQLiteHelper.COLUMN_CATID, catid);
            long insertId = database.insert(MySQLiteHelper.TABLE_SONDAGGI, null,
                values);
            Cursor cursor = database.query(MySQLiteHelper.TABLE_SONDAGGI,
                allSondaggiColumns, MySQLiteHelper.COLUMN_ID + " = " + insertId, null,
                null, null, null);
            cursor.moveToFirst();
            sondaggi newSondaggio = cursorToSondaggi(cursor);
            cursor.close();
            return newSondaggio;
          }


      public void deleteSondaggio(sondaggi sondaggio) {
            long id = sondaggio.getId();
            System.out.println("Sondaggio cancellato, id: " + id);
            database.delete(MySQLiteHelper.TABLE_SONDAGGI, MySQLiteHelper.COLUMN_ID
                + " = " + id, null);
          } 

      public Cursor getAllCategorie() {
            List<categorie> categorie = new ArrayList<categorie>();

            Cursor cursor = database.query(MySQLiteHelper.TABLE_CATEGORIE,
                allCategorieColumns, null, null, null, null, null);

            cursor.moveToFirst();
            while (!cursor.isAfterLast()) {
              categorie categoria = cursorToCategorie(cursor);
              categorie.add(categoria);
              cursor.moveToNext();
            }
            // Make sure to close the cursor
           // cursor.close();
            return cursor;
          }


      private categorie cursorToCategorie(Cursor cursor) {
          categorie categorie = new categorie();
          categorie.setId(cursor.getLong(0));
          categorie.setPreferita(cursor.getLong(1));
          categorie.setNome(cursor.getString(2));
            return categorie;
          }
      private sondaggi cursorToSondaggi(Cursor cursor) {
          sondaggi sondaggi = new sondaggi();
          sondaggi.setId(cursor.getLong(0));
          sondaggi.setDomanda(cursor.getString(1));
          sondaggi.setCatid(cursor.getLong(2));
          return sondaggi;
          }


}

具有相同的输入??所以基本上我会在同一个类的两个不同地方有完全相同的代码......我可以定义一个......“过程”或一个类吗?对不起,如果我太天真了,我真的是个菜鸟 :D

最佳答案

requery 游标方法已弃用。但你是对的,你必须重新加载光标,然后确保你的新光标显示在你的 ListView 上。对于快速的'n dirty 解决方案,我建议你让你的适配器成为一个领域。然后使用以下方法:

private void requery() {
    Cursor values = datasource.getAllCategorie();
    adapter.changeCursor(values);
}

它的作用是重新制作一个游标。然后通过调用 changeCursor 将旧游标换成新游标,旧游标会自动关闭。至少,您可以免于制作新的适配器。我想所有修整和修复的更复杂的方法是实现一个 CursorLoader,它会在数据库内容更改时自动执行该过程。

关于android - 使用 simpleCursorAdapter - requery() 插入新记录后更新 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13953171/

相关文章:

ios - 从 Core Data iOS 8 中删除二进制数据

java - 尝试转换现有的 SQLite 数据库以用于 Android 操作系统

java - 如何将图像放入ListView javafx中

android - 如何选择和取消选择 RecyclerView 中的项目?如何仅在回收站 View 中突出显示所选项目?

android - 自定义 ListView 条目在 JB 中有效,在 Gingerbread 中无效

android:button ="@null"不适用于较低的 API <= 19 设备

android - 如何在android中的autocompletetextview中获取所选项目的ID

android - 使用 JavaMail API 在 Android 中发送电子邮件

ruby - sqlite3-ruby gem 在 ubuntu 上找不到 sqlite3.h

c# - 如何将按钮命令绑定(bind)到成员方法?