Решено - программа не достигнет цикла - PullRequest
1 голос
/ 10 июля 2019

У меня есть база данных SQlite и представление списка, заполненное новостными статьями. Я могу добавлять статьи в избранное просто отлично. Когда я пытаюсь удалить его, он не работает.

Я следовал руководству по CodingWithMitch и убедился, что мои операторы SQl идентичны, но моя программа не работает.

Избранное Деятельность

//Deleting favorites
favoritesList.setOnItemLongClickListener(new 
AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, 
int position, long id) {

    //final ArrayList<ListViewDetails> details = new ArrayList<>();
    //Cursor takes in a ListViewDetails object for a specific new article
    final Cursor cursor = databaseHelper.getID(details.get(position));

    //This is to test if the correct list view object is retrieved - Works
    Log.i("Test", details.get(position).link);

    //So the code won't reach this point and therefore nothing is executed
    int favoriteId = -1;  
    while (cursor.moveToNext()) {
        favoriteId = cursor.getInt(0);       
    }
        if (favoriteId > -1) {
            if (databaseHelper.delete(favoriteId) > 0) {

            Toast.makeText(getApplicationContext(), "Deleted", Toast.LENGTH_SHORT).show();
            Log.i("Delete", "It works!");
            adapter.remove(details.get(position));
            adapter.notifyDataSetChanged();     

            }
         }

DatabaseHelper класс

public static final String COL0 = "ID";
public static final String COL1 = "TITLE";
public static final String COL2 = "PHOTO_URL";

@Override
public void onCreate(SQLiteDatabase db) {
    String sql = "CREATE TABLE " + TABLE_NAME + " ( " +
            COL0 + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
...

public Cursor getID(ListViewDetails listViewDetails){
    SQLiteDatabase db = this.getWritableDatabase();
    String sql = "SELECT * FROM " + TABLE_NAME + " WHERE " +
            COL1 + " = '" + listViewDetails.getLink() + "'" +
            " AND " + COL2 + " = '" + listViewDetails.getTitle() + "'";       
    return db.rawQuery(sql,null);
}

public Integer delete(int id) {
    SQLiteDatabase db = this.getWritableDatabase();
    return db.delete(TABLE_NAME, "ID = ?", new String[] {String.valueOf(id)});
}

Просто пытаюсь выяснить, почему код не достигнет цикла while.

UPDATE Неосторожная ошибка с синтаксисом SQL. Решение принято.

1 Ответ

1 голос
/ 11 июля 2019

Если не извлечено ни одной строки, цикл while завершится без ввода тела.

Это наиболее вероятный сценарий.

Узнайте, почему Курсор может быть пустым.Я считаю, что вы не сопоставили столбцы со значениями в методе getID класса DatabaseHelper .

То есть: -

 String sql = "SELECT * FROM " + TABLE_NAME + " WHERE " +
        COL1 + " = '" + listViewDetails.getLink() + "'" +
        " AND " + COL2 + " = '" + listViewDetails.getTitle() + "'";

Должно быть: -

 String sql = "SELECT * FROM " + TABLE_NAME + " WHERE " +
        COL1 + " = '" + listViewDetails.getTitle() + "'" +
        " AND " + COL2 + " = '" + listViewDetails.getLink() + "'";

то есть COL1 - это заголовок, а COL2 - это ссылка

  • Я бы предложил не использовать COL1 COl2 и т. Д.,но с использованием описательных имен, например COL_TITLE и COL_LINK (такие ошибки менее вероятны).
...