2015-02-08 4 views
1

У меня есть ListView с SQL DataBase. Значения для него могут быть добавлены динамически с двумя EditText.Как удалить строку на базе данных SQL

Я хочу знать, как удалить строку в моем SQL DataBase. Теперь я могу просто удалить строку rowId, поэтому вся строка со всеми значениями будет удалена. Но я хочу, чтобы только строка была удалена, чтобы там были последовательные номера.

Например, ListView.

1 Text1 
2 Text2 
3 Text3 
4 Text4 

С моим кодом он хотел бы, что если бы я удалить строку 3:

1 Text1 
2 Text2 
4 Text4 

Но я хочу, чтобы это выглядело, как при удалении строки 3:

1 Text1 
2 Text2 
3 Text4 

Мой код :

Основная информация

private void listViewItemLongClick() { 
     ListView myList = (ListView) findViewById(R.id.list); 
     myList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View viewClicked, final int position, final long id) { 

       AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
         //Set header 
         builder.setTitle("delete"); 
         builder.setMessage("Are you sure ? "); 
           //set the OK button with an onClickListener 
         builder.setPositiveButton("yes", new DialogInterface.OnClickListener() { 
          //edit the userinput 
          public void onClick(DialogInterface dialog, int whichButton) { 
           myDb.deleteRow(id); 
           populateListView(); 
          } 
         }).setNegativeButton("no", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         // Do nothing. 
        } 
       }).show(); 

       return false; 
      } 
     }); 
    } 

DBAdapter

public class DBAdapter { 

    private static final String TAG = "DBAdapter"; //used for logging database version changes 

    // Field Names: 
    public static final String KEY_ROWID = "_id"; 
    public static final String KEY_WDH = "task"; 
    public static final String KEY_KG = "date"; 

    public static final String[] ALL_KEYS = new String[]{KEY_ROWID, KEY_WDH, KEY_KG}; 

    public static final String DATABASE_NAME = "dbToDo"; 
    public static final String DATABASE_TABLE = "mainToDo"; 
    public static final int DATABASE_VERSION = 2; // The version number must be incremented each time a change to DB structure occurs. 

    //SQL statement to create database 
    private static final String DATABASE_CREATE_SQL = 
      "CREATE TABLE " + DATABASE_TABLE 
        + " (" + KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
        + KEY_WDH + " TEXT NOT NULL, " 
        + KEY_KG + " TEXT" 
        + ");"; 

    private final Context context; 
    private DatabaseHelper myDBHelper; 
    private SQLiteDatabase db; 


    public DBAdapter(Context ctx) { 
     this.context = ctx; 
     myDBHelper = new DatabaseHelper(context); 
    } 

    // Open the database connection. 
    public DBAdapter open() { 
     db = myDBHelper.getWritableDatabase(); 
     return this; 
    } 

    // Close the database connection. 
    public void close() { 
     myDBHelper.close(); 
    } 

    // Add a new set of values to be inserted into the database. 
    public long insertRow(String task, String date) { 
     ContentValues initialValues = new ContentValues(); 
     initialValues.put(KEY_WDH, task); 
     initialValues.put(KEY_KG, date); 

     // Insert the data into the database. 
     return db.insert(DATABASE_TABLE, null, initialValues); 
    } 

    // Delete a row from the database, by rowId (primary key) 
    public boolean deleteRow(long rowId) { 
     String where = KEY_ROWID + "=" + rowId; 
     return db.delete(DATABASE_TABLE, where, null) != 0; 
    } 

    // Return all data in the database. 
    public Cursor getAllRows() { 
     String where = null; 
     Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, where, null, null, null, null, null); 
     if (c != null) { 
      c.moveToFirst(); 
     } 
     return c; 
    } 

    // Get a specific row (by rowId) 
    public Cursor getRow(long rowId) { 
     String where = KEY_ROWID + "=" + rowId; 
     Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, 
       where, null, null, null, null, null); 
     if (c != null) { 
      c.moveToFirst(); 
     } 
     return c; 
    } 

    // Change an existing row to be equal to new data. 
    public boolean updateRow(long rowId, String task, String date) { 
     String where = KEY_ROWID + "=" + rowId; 
     ContentValues newValues = new ContentValues(); 
     newValues.put(KEY_WDH, task); 
     newValues.put(KEY_KG, date); 
     // Insert it into the database. 
     return db.update(DATABASE_TABLE, newValues, where, null) != 0; 
    } 


    private static class DatabaseHelper extends SQLiteOpenHelper { 
     DatabaseHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase _db) { 
      _db.execSQL(DATABASE_CREATE_SQL); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) { 
      Log.w(TAG, "Upgrading application's database from version " + oldVersion 
        + " to " + newVersion + ", which will destroy all old data!"); 

      // Destroy old database: 
      _db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 

      // Recreate new database: 
      onCreate(_db); 
     } 
    } 


} 

ответ

0

Это грязно, потому что это выглядит как будто это ваш столбец идентификаторов и вы пытаетесь устранить пробелы. Это не очень хорошая практика, но есть механизм для этого. Концептуально это будет 4-х ступенчатый процесс.

  1. Создайте новую временную таблицу с той же структурой (включая поле с автоматической добавочной идентификацией).
  2. Переместите оставшиеся строки из основного стола в таблицу темп. Я собирался написать это, но псевдо-код для этого уже существует повсюду. Например, here's an answer to a similar question с хорошим (в том числе отказ от ответственности, что я пощажу об этом плохой идеей).
  3. Оставьте исходный стол.
  4. Переименуйте таблицу темпа в название исходной таблицы.

Обратите внимание, что вы переписываете всю таблицу каждый раз, когда выполняете удаление, поэтому это решение не масштабируется хорошо.

Лучшим способом сделать это было бы добавление целочисленного поля неидентификатора в вашу таблицу, в котором вы сохраняете всегда неизменное целочисленное значение. Это будет вашей ответственностью за сохранение этой области. Например ...

При исходном населении ваших данных установите это поле равным полю идентификации.

В вашем «удалить строку» рутинной

// Delete a row from the database, by rowId (primary key) 
public boolean deleteRow(long rowId) { 
    String where = KEY_ROWID + "=" + rowId; 
    boolean myReturnValue; 
    myReturnValue = db.delete(DATABASE_TABLE, where, null) != 0; 
    db.execSQL("UPDATE " + DATABASE_TABLE + " SET MyNewNonIdentitySequentialIntegerField = MyNewNonIdentitySequentialIntegerField -1) WHERE KEY_ROWID > " + String.valueOf(rowId) + ";") ; 
    return myReturnValue; 
} 

При установке или сразу же после вставки новой записи вам необходимо заполнить его, установив его равным MAX (MyNewNonIdentitySequentialIntegerField) + 1.