2015-07-27 2 views
2

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

Вот код помощника базы данных:

public class PersonDatabaseHelper { 

    private static final String TAG = PersonDatabaseHelper.class.getSimpleName(); 

    // database configuration 
    // if you want the onUpgrade to run then change the database_version 
    private static final int DATABASE_VERSION = 1; 
    private static final String DATABASE_NAME = "mydatabase.db"; 

    public static String query; 

    // table configuration 
    private static final String TABLE_NAME = "person_table";   // Table name 
    private static final String PERSON_TABLE_COLUMN_ID = "_id";  // a column named "_id" is required for cursor 
    private static final String PERSON_TABLE_COLUMN_NAME = "person_name"; 
    private static final String PERSON_TABLE_COLUMN_PIN = "person_pin"; 

    private DatabaseOpenHelper openHelper; 
    private SQLiteDatabase database; 

    // this is a wrapper class. that means, from outside world, anyone will communicate with PersonDatabaseHelper, 
    // but under the hood actually DatabaseOpenHelper class will perform database CRUD operations 
    public PersonDatabaseHelper(Context aContext) { 

     openHelper = new DatabaseOpenHelper(aContext); 
     database = openHelper.getWritableDatabase(); 
    } 

    public void insertData (String aPersonName, String aPersonPin) { 

     // we are using ContentValues to avoid sql format errors 

     ContentValues contentValues = new ContentValues(); 

     contentValues.put(PERSON_TABLE_COLUMN_NAME, aPersonName); 
     contentValues.put(PERSON_TABLE_COLUMN_PIN, aPersonPin); 

     database.insert(TABLE_NAME, null, contentValues); 
    } 

    public Cursor getAllData() { 

     String buildSQL = "SELECT * FROM " + TABLE_NAME; 

     Log.d(TAG, "getAllData SQL: " + buildSQL); 

     return database.rawQuery(buildSQL, null); 
    } 

    // this DatabaseOpenHelper class will actually be used to perform database related operation 

    private class DatabaseOpenHelper extends SQLiteOpenHelper { 

     public DatabaseOpenHelper(Context aContext) { 
      super(aContext, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase sqLiteDatabase) { 
      // Create your tables here 

      String buildSQL = "CREATE TABLE " + TABLE_NAME + "(" + PERSON_TABLE_COLUMN_ID + " INTEGER PRIMARY KEY, " + 
        PERSON_TABLE_COLUMN_NAME + " TEXT, " + PERSON_TABLE_COLUMN_PIN + " TEXT)"; 

      Log.d(TAG, "onCreate SQL: " + buildSQL); 

      sqLiteDatabase.execSQL(buildSQL); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { 
      // Database schema upgrade code goes here 

      String buildSQL = "DROP TABLE IF EXISTS " + TABLE_NAME; 

      Log.d(TAG, "onUpgrade SQL: " + buildSQL); 

      sqLiteDatabase.execSQL(buildSQL);  // drop previous table 

      onCreate(sqLiteDatabase);    // create the table from the beginning 
     } 
    } 

    public void average() { 
     String query = "SELECT AVG("+PERSON_TABLE_COLUMN_PIN +") FROM "+TABLE_NAME; 
     database.rawQuery(query, null); 




    } 
} 
+0

Что вы пробовали и не работали? – gmetax

+0

В чем проблема? Обнаружение длинного нажатия? удаление записи из базы данных? Что-то другое? – wastl

+0

Для удаления записи из db см. [Этот ответ] (http://stackoverflow.com/a/7510442/2319542). Чтобы отразить изменения в списке, не забудьте вызвать 'listview.notifyDataSetChanged()' –

ответ

1

Ну, поскольку у вас есть уникальный идентификатор, связанный с каждой записью в базе данных, вы можете удалить основываясь на том, что, например, так:

public void deleteItem(int itemId){ 
    this.getWritableDatabase().delete(TABLE_NAME, PERSON_TABLE_COLUMN_ID + "=" + itemId, null); 
} 

затем, когда элемент в вашем ListView долго нажата, вы могли бы назвать этот метод, чтобы удалить его из базы данных, а затем вызвать remove(Object) на вашем Adapter (или remove(int) на List ваш Adapter), а затем notifyDataSetChanged(), чтобы обеспечить правильное обновление дисплея.

Редактировать: Для того, чтобы ответить на ваш вопрос о том, как применить длинный клик слушателя к элементу в вашем ListView, это зависит от того, как вы реализовали Adapter. Если это настраиваемый адаптер, вы можете просто установить onLongClickListener() вашему корню View (например, convertView). Если вы не используете это, вы можете попробовать прикрепление AdapterView.OnItemLongClickListener как это ваш ListView:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
    @Override 
    public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long arg3) { 
     // get the data from your list at position, i.e. data.get(position) 
     // then pass that object/id to your database helper, e.g. 

     Person p = data.get(position); 
     personDatabaseHelper.deleteItem(p.getId()); 

     data.remove(position); // or adapter.remove(p), depends on your implementation 
     adapter.notifyDataSetChanged(); // remove the object from your Adapter and notify it of the change 

     return true; 
    } 
}); 

Edit 2: Использование пользовательского адаптера

В вашем GetView() метод, добавьте следующие строки перед возвращением convertView:

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

    // your other stuff here 

    convertView.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View v) { 
      Person p = getItem(position); 

      personDatabaseHelper.deleteItem(p.getId()); 
      remove(p); 

      notifyDataSetChanged(); 
      return true; 
     } 
    }); 

    return convertView; 
} 
+0

Я пробовал это, проблема в том, что я не могу использовать getWritableDatabase(), потому что он говорит : «невозможно разрешить метод getWritableDatabase» – Alex

+0

Попробуйте изменить «this.getWritableDatabase()) на« базу данных », так как у вас уже есть экземпляр базы данных в вашем классе PersonDatabaseHelper, определенный при создании экземпляра. – Guardanis

+0

спасибо, он сработал. позвоните публичному void deleteItem из моего mainactiviy с длинным нажатием одного элемента списка? Можете ли вы показать мне код? – Alex

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