2016-08-10 2 views
1

Я знаю, что есть много потоков с более или менее одинаковой темой, но ни одна из них не охватывает мою ситуацию:Как удалить элемент в базе данных SQL?

У меня есть кнопка удаления, которая удаляет один элемент в спискеView, но когда вы закрываете приложение и снова открываете его, элементы снова появляются , Я не знаю, как это исправить.

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper { 
public static final String DATABASE_NAME = "todo.db"; 
public static final int DATABASE_VERSION = 1; 
public static final String ITEMS_TABLE = "items"; 

private static DatabaseHelper instance = null; 

public static DatabaseHelper getInstance(Context context) { 

    if(instance == null) { 
     instance = new DatabaseHelper(context); 
    } 
    return instance; 
} 

private DatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 

    String createQuery = "CREATE TABLE " + ITEMS_TABLE + " (" + 
      "_id INTEGER PRIMARY KEY AUTOINCREMENT," + 
      "description TEXT NOT NULL, " + 
      "completed INTEGER NOT NULL DEFAULT 0)"; 
    db.execSQL(createQuery); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    } 
} 

кнопка работает нормально, но не удаляет permently я не знаю, если это код или, если это то, где я помещаю его в мой MainActivity, если кто-то пожалуйста, скажите, что было бы очень признательно.

MainActivity.java

public class MainActivity extends AppCompatActivity { 

private static final String LOG_TAG = "ToDoApp"; 

private ToDoListManager listManager; 
private ToDoItemAdapter adapter; 

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

    ListView todoList = (ListView) findViewById(R.id.todo_list); 

    listManager = new ToDoListManager(getApplicationContext()); 

    adapter = new ToDoItemAdapter(
      this, 
      listManager.getList() 
    ); 

    todoList.setAdapter(adapter); 

    ImageButton addButton = (ImageButton) findViewById(R.id.add_item); 
    addButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onAddButtonClick(); 
     } 
    }); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
} 

private void onAddButtonClick() { 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setTitle(R.string.add_item); 

    final EditText input = new EditText(this); 
    input.setInputType(InputType.TYPE_CLASS_TEXT); 
    builder.setView(input); 

    builder.setPositiveButton(
      R.string.ok, 
      new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        ToDoItem item = new ToDoItem(
          input.getText().toString(), 
          false 
        ); 
        listManager.addItem(item); 
        adapter.swapItems(listManager.getList()); 
       } 
      }); 

    builder.setNegativeButton(
      R.string.cancel, 
      new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
       } 
      }); 

    builder.show(); 
} 

private class ToDoItemAdapter extends ArrayAdapter<ToDoItem> { 

    private Context context; 
    private List<ToDoItem> items; 
    private LayoutInflater inflater; 

    public ToDoItemAdapter(
      Context context, 
      List<ToDoItem> items 
    ) { 
     super(context, -1, items); 

     this.context = context; 
     this.items = items; 
     this.inflater = LayoutInflater.from(context); 
    } 

    public void swapItems(List<ToDoItem> items) { 
     this.items = items; 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getCount() { 
     return items.size(); 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     final ItemViewHolder holder; 

     if(convertView == null) { 

      convertView = inflater.inflate(R.layout.to_do_item_layout, parent, false); 


      holder = new ItemViewHolder(); 
      holder.itemDescription = (TextView) convertView.findViewById(R.id.item); 
      holder.itemState = (CheckBox) convertView.findViewById(R.id.checkBox); 
      convertView.setTag(holder); 
     }else { 
      holder = (ItemViewHolder) convertView.getTag(); 
     } 


     holder.itemDescription.setText(items.get(position).getDescription()); 
     holder.itemState.setChecked(items.get(position).isComplete()); 

     holder.itemState.setTag(items.get(position)); 

     convertView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       ToDoItem item = (ToDoItem) holder.itemState.getTag(); 
       item.toggleComplete(); 
       listManager.updateItem(item); 
       notifyDataSetChanged(); 
      } 
     }); 
     ImageButton deleteButton = (ImageButton) convertView.findViewById(R.id.delete_Button); 
     deleteButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       items.remove(items.get(position)); 
       notifyDataSetChanged(); 
      } 
     }); 

     holder.itemState.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       ToDoItem item = (ToDoItem) holder.itemState.getTag(); 
       item.toggleComplete(); 
       listManager.updateItem(item); 
       notifyDataSetChanged(); 

      } 
     }); 

     return convertView; 
    } 
} 

public static class ItemViewHolder{ 
    public TextView itemDescription; 
    public CheckBox itemState; 
    } 
} 

ToDoListManager.java

public class ToDoListManager { 

private DatabaseHelper dbHelper; 

public ToDoListManager(Context context) { 

    dbHelper = DatabaseHelper.getInstance(context); 
} 

public List<ToDoItem> getList() { 

    SQLiteDatabase db = dbHelper.getReadableDatabase(); 
    Cursor cursor = db.rawQuery(
      "SELECT * FROM " + DatabaseHelper.ITEMS_TABLE, 
      null 
    ); 

    List<ToDoItem> items = new ArrayList<>(); 

    if(cursor.moveToFirst()) { 
     while(!cursor.isAfterLast()) { 

      ToDoItem item = new ToDoItem(
        cursor.getString(cursor.getColumnIndex("description")), 
        cursor.getInt(cursor.getColumnIndex("completed")) != 0, 
        cursor.getLong(cursor.getColumnIndex("_id")) 
      ); 
      items.add(item); 
      cursor.moveToNext(); 
     } 
    } 
    cursor.close(); 
    return items; 
} 

public void addItem(ToDoItem item) { 

    ContentValues newItem = new ContentValues(); 
    newItem.put("description", item.getDescription()); 
    newItem.put("completed", item.isComplete()); 

    SQLiteDatabase db = dbHelper.getWritableDatabase(); 
    db.insert(DatabaseHelper.ITEMS_TABLE, null, newItem); 


} 

public void updateItem(ToDoItem item) { 

    ContentValues editItem = new ContentValues(); 
    editItem.put("description", item.getDescription()); 
    editItem.put("completed", item.isComplete()); 

    SQLiteDatabase db = dbHelper.getWritableDatabase(); 

    String[] args = new String[] { String.valueOf(item.getId()) }; 

    db.update(DatabaseHelper.ITEMS_TABLE, editItem, "_id=?", args); 

    } 
} 

ToDoItem.java

public class ToDoItem { 

private String description; 
private boolean isComplete; 
private long id; 

public ToDoItem(String description, boolean isComplete) { 
this(description, isComplete, -1); 
} 
public ToDoItem(String description,boolean isComplete,long id) { 
    this.description = description; 
    this.isComplete = isComplete; 
    this.id = id; 
} 

public String getDescription() { 
    return description; 
} 

public boolean isComplete() { 
    return isComplete; 
} 

public void toggleComplete() { 
    isComplete = !isComplete; 
} 
public long getId() {return id;} 

@Override 
public String toString() { 

    return getDescription(); 
    } 
} 

ответ

1

у ou просто удалите элементы в классе адаптера, из-за чего элемент удаляется из текущего спискаView. но у вас нет функции в вашем ToDoListManager.java, которые удаляют элементы из вашей базы данных. удаление из спискаView не влияет на ваши элементы базы данных.

вы можете добавить эту функцию в свой ToDoListManager.java класс

public void deleteItem(long itemId) { 

    SQLiteDatabase db = dbHelper.getWritableDatabase(); 
    db.delete(DatabaseHelper.ITEMS_TABLE, "_id = ?", 
      new String[] { String.valueOf(itemId) }); 
} 

и вызвать его из OnClick вашего удаления баттона, как этот

ImageButton deleteButton = (ImageButton) convertView.findViewById(R.id.delete_Button); 
     deleteButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       long itemId = items.get(position).getId(); 
       items.remove(items.get(position)); 
       listManager.deleteItem(itemId); 
       notifyDataSetChanged(); 
      } 
     }); 
+0

Я сделал так, как вы сказали, и он говорит, что не может разрешить для items listManager.deleteItem (** item **. GetId()); –

+0

Я отредактировал свой ответ. попробуйте еще раз –

+0

'listManager.deleteItem (item.getId());' это не может быть разрешено, потому что в 'onclick' scope' item' неизвестно, это было опечатка в моем первом ответе, вам нужно использовать список 'items' в масштаб –

0

Поскольку вы извлечения данных из базы данных и отображения его в listview, вам также нужно удалить строку из базы данных. сделать метод в вас адаптер базы данных, которая выглядит некоторые вещи, как это:

public boolean deleteItem(Long id) { 
     return Db.delete(DATABASE_TABLE,"_id="+id,null) > 0; 
    } 

затем список просмотра элемента удаления, просто вызовите этот метод и передать идентификатор строки в качестве аргумента.

+0

Я новичок в этом, вы можете сказать где я могу добавить этот бит кода, пожалуйста? –

+0

Внутри вашего вспомогательного класса базы данных, как и методы onCreate() и onUpgrade(). –

Смежные вопросы