Удаление данных в SQLIte через ListView - PullRequest
0 голосов
/ 24 июня 2018

Я хочу удалить строку в моей базе данных через ListView. Мне уже удалось отобразить данные в виде списка. Я работаю с OnItemLongClickListener, который затем открывает диалог, чтобы удалить элемент, на который нажали. Я не могу заставить фактический метод удаления работать.

Метод OnCLickListener:

public boolean onItemLongClick(AdapterView<?> adapterView, View view, final int position, long id) {
            build = new AlertDialog.Builder(ZeigeFaecherListe.this);
            build.setTitle("Fach löschen?" + faecherListe.get(position));
            build.setMessage("Willst du das Fach wirklich löschen?");

            build.setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    dialogInterface.cancel();
                }
            });

            build.setPositiveButton("Löschen", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialogInterface, int i) {
                    myDb.loescheFach(position);

                    Toast.makeText(getApplicationContext(), faecherListe.get(position) + " gelöscht.", Toast.LENGTH_LONG).show();
                    myDb.zeigeFaecher();
                    dialogInterface.cancel();
                }
            });

            AlertDialog alert = build.create();
            alert.show();
        return true;
        }
    });

Фактический метод удаления:

public int loescheFach(int position){
    SQLiteDatabase db = this.getWritableDatabase();
    return db.delete("Fach_table","FACHID=?", new String[]{String.valueOf(position)});
}

Ответы [ 3 ]

0 голосов
/ 24 июня 2018

Вы передаете позицию ArrayList в SQLite для удаления оператора. Вы должны передать FACHID (в вашем случае) в качестве аргумента для удаления оператора.

Поскольку ваш размещенный код неполон, я предполагаю, что он указан ниже.

....
....

build.setPositiveButton("Löschen", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialogInterface, int i) {
               // myDb.loescheFach(position);

               // first get an id from ArrayList using position faecherListe.get(position)

               // then pass that id to your method 
               myDb.loescheFach(id);

                Toast.makeText(getApplicationContext(), faecherListe.get(position) + " gelöscht.", Toast.LENGTH_LONG).show();
                myDb.zeigeFaecher();
                dialogInterface.cancel();
            }
        });

....
....
0 голосов
/ 25 июня 2018

Первая позиция не будет равно rowid / id строки в таблице.Предполагая, что у вас есть столбец id , определенный как your_id_column INTEGER PRIMARY KEY (или с ключевым словом AUTOINCREMENT, который не имеет реальной разницы) и что вы не указываете значение при вставке строкитогда первый id будет, вероятно, равен 1, затем 2, затем 3 ... и т. д.

Однако position (3-й параметр, переданный в onItemClick / onItemLongClick) дляпервый элемент в списке будет 0, затем 1, затем 2 и т. д. Таким образом, вы никогда не удалите правильную строку (щелчок по первому элементу ничего не удалит, нажатие по второму элементу удалит первый), а при удалении строк он становится еще большерассинхронизировано.

4-ый переданный параметр ( длинный идентификатор ) будет rowid / id, ЕСЛИ И ТОЛЬКО ЕСЛИ используется CursorAdapter (т.е. Курсор являетсяисходные данные для ListView).В этом случае курсор ДОЛЖЕН иметь столбец с именем _id .Однако выглядит так, как будто faecherListe является источником, а при использовании метода get это ArrayList / List.Таким образом, переданный id будет иметь то же значение position , за исключением длинного.

Теперь, если faecherListe были ArrayList<object_that_reflects_the_columns_of_the_table_including_id> затем при условии получения getId вы можете использовать long retrieved_id = faecherListe.get(position).getId().Тем не менее, комментарии: -

Я полагаю, у вас есть ArrayList of String, поэтому вы получаете значение String из ArrayList - Shashanth 10 часов назад

Ye

У вас просто есть ArrayList и, следовательно, нет никаких средств для определения идентификатора, если только те данные, которые хранятся в строке, не гарантированно являются уникальными.

Пример

Этопример использования object_that_reflects_the_columns_of_the_table_including_id в этом случае Feacher класса, который просто имеет имя и id

Feacher.java

Это совершенно новый класс, который позволяет вам иметь ArrayList со всеми соответствующими данными / полями / столбцами (особенно столбец id ).то есть вы можете иметь ArrayList

public class Feacher {

    private String name;
    private long id;

    public Feacher(String feacher_name) {
        this(feacher_name,-1);
    }

    public Feacher(String feacher_name, long feacher_id) {
        this.name = feacher_name;
        this.id = feacher_id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String toString() {
        return name + " ID(" + String.valueOf(id) + ")";
    }
}

DBHelper

Это помощник базы данных (подкласс SQLiteOpenHelper): -

public class DBHelper extends SQLiteOpenHelper {

    public static final String DBNAME = "feacher.db";
    public static final int DBVERSION = 1;

    public static final String TB_FEACHER = "feacher";
    public static final String COL_FEACHER_ID = BaseColumns._ID;
    public static final String COL_FEACHER_NAME = "feacher_name";

    SQLiteDatabase mDB;


    public DBHelper(Context context) {
        super(context, DBNAME, null, DBVERSION);
        mDB = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String crtsql = "CREATE TABLE IF NOT EXISTS " + TB_FEACHER +
                "(" +
                COL_FEACHER_ID + " INTEGER PRIMARY KEY," +
                COL_FEACHER_NAME + " TEXT" +
                ")";
        db.execSQL(crtsql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }

    public long addFeacher(String feacher_name) {
        ContentValues cv = new ContentValues();
        cv.put(COL_FEACHER_NAME,feacher_name);
        return mDB.insert(TB_FEACHER,null,cv);
    }

    public ArrayList<Feacher> getAllAsFeacherArrayList() {
        ArrayList<Feacher> rv = new ArrayList<>();
        Cursor csr = mDB.query(
                TB_FEACHER,
                null,
                null,
                null,
                null,
                null,
                null
        );
        while (csr.moveToNext()) {
            rv.add(new Feacher(
                    csr.getString(csr.getColumnIndex(COL_FEACHER_NAME)),
                    csr.getLong(csr.getColumnIndex(COL_FEACHER_ID))
                    )
            );
        }
        return rv;
    }

    public int deleteFeacher(long id) {
        return mDB.delete(
                TB_FEACHER,
                COL_FEACHER_ID + "=?"
                ,new String[]{String.valueOf(id)}
                );
    }
}
  • the deleteFeacher метод удаления строки в соответствии с id ,
  • addFeacher метод, позволяющий добавить некоторые тестовые данные.
  • getAllAsFeacherArrayList возвращает все данные какArrayList (примечание использует конструктор, который устанавливает id )

MainActivity.java

Активность, имеющая ListView.

public class MainActivity extends AppCompatActivity {

    ListView mListView;
    ArrayAdapter<Feacher> mAdapter;
    DBHelper mDBHlpr;
    ArrayList<Feacher> mFeacherList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mListView = this.findViewById(R.id.listview);
        mDBHlpr = new DBHelper(this);
        addDataForTesting();
        displayAdapter();
    }

    private void displayAdapter() {
        if (mFeacherList == null) {
            mFeacherList = mDBHlpr.getAllAsFeacherArrayList();
        } else {
            mFeacherList.clear();
            for (Feacher f: mDBHlpr.getAllAsFeacherArrayList()) {
                mFeacherList.add(f);
                mAdapter.notifyDataSetChanged();
            }
        }
        if (mAdapter == null) {
            mAdapter = new ArrayAdapter<Feacher>(this,android.R.layout.simple_list_item_1,mFeacherList);
            mListView.setAdapter(mAdapter);
            mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
                     mDBHlpr.deleteFeacher(mAdapter.getItem(i).getId());
                     displayAdapter();
                    return true;
                }
            });
        }
    }

    private void addDataForTesting() {
        mDBHlpr.addFeacher("Feacher 001");
        mDBHlpr.addFeacher("Feacher 002");
        mDBHlpr.addFeacher("Feacher 003");
    }
}
  • Обратите внимание на простоту, а также во избежание случайного удаления onItemLongClick.Важнейшим битом является mDBHlpr.deleteFeacher(mAdapter.getItem(i).getId());, который получает идентификатор от предмета (объекта, Учителя), по которому щелкнули в соответствии с позицией.

activity_main.xml

Очень простоймакет

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
    <ListView
        android:id="@+id/listview"
        android:layout_margin="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#FFAAAAFF"
        >
    </ListView>
</LinearLayout>

Результат

Вот снимок экрана после 3-го запуска, так что было добавлено 9 строк и 2 строки удалены (2 и 5 идентификатора примечания отсутствуют).Список будет обновлен после удаления, поэтому строка исчезнет почти сразу после завершения длинного щелчка.

enter image description here

0 голосов
/ 24 июня 2018

Вы путаете свою позицию в списке с идентификатором, они могут не совпадать.

Измените myDb.loescheFach(position); на myDb.loescheFach(id);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...