2016-08-10 2 views
1

주제가 다소 다르지만 그 중 아무 것도 내 상황을 다루지 않는 스레드가 많이 있다는 것을 알고 있습니다.SQL 데이터베이스에서 항목을 제거하는 방법은 무엇입니까?

나는 listView에서 하나의 항목을 삭제하는 삭제 버튼이 있지만 앱을 닫았다가 다시 열면 항목이 다시 나타납니다 . 이 문제를 해결하는 방법을 모르겠습니다.

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

Y 이제는 현재 listView에서 항목을 삭제하는 어댑터 클래스의 항목을 제거하면됩니다. 데이터베이스에서 항목을 제거하는 기능은 사용자의 ToDoListManager.java에 없습니다. listView에서 삭제해도 데이터베이스 항목에는 영향을주지 않습니다.

당신은 당신의 ToDoListManager.java 클래스

public void deleteItem(long itemId) { 

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

에이 기능을 추가하고이

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

나는 당신이 말했듯이 아이템에 대해 해결할 수 없다고 말했습니다. listManager.deleteItem (** item **. getId()); –

+0

내 대답을 편집했습니다. 다시 시도하십시오. –

+0

'itemManager'가 알려지지 않았기 때문에 첫 번째 답변에서 오타가 발생했기 때문에이 항목을 사용할 수 없으므로이 문제는 해결할 수 없습니다 (itemManager.level()). 범위 –

0

처럼, 당신의 삭제 버튼의 OnClick에서 호출 할 수 있습니다 데이터베이스에서 데이터를 가져 오는하고 표시되기 때문에 listview에서 데이터베이스에서 행을 삭제해야합니다. 다음과 같은 몇 가지 일을 보이는 당신의 데이터베이스 어댑터 방법합니다

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

다음 목록보기 항목 삭제를 단순히이 메소드를 호출하고 인수로 행 ID를 전달합니다.

+0

이 코드를 어디에 추가합니까? –

+0

onCreate() 및 onUpgrade() 메소드와 마찬가지로 데이터베이스 도우미 클래스 내에 있습니다. –