2013-08-07 2 views
1

У меня возникли проблемы с получением отдельных элементов для удаления в базе данных, используемой моим приложением. Я знаю, что метод вызван, но ничто в моем списке не удаляется. Я не получаю никаких ошибок, которые затрудняют отслеживание. Помощь была бы потрясающей.Функция удаления SQlite не удаляет записи

public class MainActivity extends Activity{ 

//Global Variables 
ListView lv; 
Intent addM, viewM; 
public DBAdapter movieDatabase; 
String tempTitle, tempYear; 
int request_Code = 1; 
int request_code2 = 2; 
SimpleCursorAdapter dataAdapter; 
Cursor cursor; 
Button addButton; 
long testID; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 



    //creates the database 
    movieDatabase = new DBAdapter(this); 
    movieDatabase.open(); 
    //movieDatabase.deleteAllMovies(); 


    //creates the intents to start the sub activities 
    addM = new Intent(this, AddMovie.class); 
    viewM = new Intent(this, MovieView.class); 


    } 
     //handles the return of the activity addMovie 
     public void onActivityResult(int requestCode, int resultCode,  
Intent data) 
     { 
      super.onActivityResult(requestCode, resultCode, data); 

      if(resultCode == RESULT_OK) 
      { 
       switch(requestCode) 
       { 
       case 1: 
        dbAddMovie(data.getStringExtra("title"), 
data.getStringExtra("year")); 
        break; 
       case 2: 
        testID = data.getLongExtra("rowid", -1); 
        dMovie(testID); 
        break; 
       } 
      } 

     } 
     //adds item to the movie list 
     public void dbAddMovie(String mT, String mY) 
     { 
      movieDatabase.open(); 
      movieDatabase.insertMovie(mT, mY); 
      Toast.makeText(this, "Movie: " + mT + " added to database",  
Toast.LENGTH_SHORT).show(); 
     } 

     //deletes an entry into the database 
     public void dMovie(long rowid) 
     { 
      //Toast.makeText(this, "Deleting: " + rowid, 
Toast.LENGTH_SHORT).show(); 
      movieDatabase.deleteMovie(rowid); 
      movieDatabase.getAllMovies(); 
     } 

     //displays the database as a list 
     public void displayListView() 
     { 
      addButton = (Button) findViewById(R.id.add); 
      addButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

        startActivityForResult(addM, 1);  
       } 
      }); 

      cursor = movieDatabase.getAllMovies(); 

      //columns to use 
      String[] columns = new String[] 
        { 
        movieDatabase.KEY_TITLE, 
        }; 

      //xml data to bind the data to 
      int[] to = new int[] 
        { 
        R.id.column2, 
        }; 

      //adapter to display the database as a list 
      dataAdapter = new SimpleCursorAdapter(this,  
R.layout.complexrow, cursor, columns, to, 0); 

      //gets the List view resource 
      lv = (ListView) findViewById(R.id.movielist); 

      //sets the list view to use the adapter 
      lv.setAdapter(dataAdapter); 

      //handles the list click events 
      lv.setOnItemClickListener(new  
AdapterView.OnItemClickListener() { 

       @Override 
       public void onItemClick(AdapterView<?> parent, View 
v, int position, 
         long id) { 

        Cursor cursor = (Cursor) 
parent.getItemAtPosition(position); 
        Bundle mDet = new Bundle(); 
        mDet.putString("title", 
cursor.getString(cursor.getColumnIndex(movieDatabase.KEY_TITLE))); 
        mDet.putString("year", 
cursor.getString(cursor.getColumnIndex(movieDatabase.KEY_YEAR))); 
        mDet.putInt("rId", position); 
        viewM.putExtras(mDet); 
        startActivityForResult(viewM, 2); 
       } 
      }); 
      //dataAdapter.notifyDataSetChanged(); 

     } 


     public void onResume() 
     { 
      super.onResume(); 
      displayListView(); 
     } 
} 

и мой coresponding dbadapter класс

public class DBAdapter { 

public static final String KEY_ROWID = "_id"; 
public static final String KEY_TITLE = "title"; 
public static final String KEY_YEAR = "year"; 
private static final String TAG = "DBAdapter"; 

private static final String DATABASE_NAME = "MovieListDB"; 
private static final String DATABASE_TABLE = "MoviesTable"; 
private static final int DATABASE_VERSION = 1; 

private static final String DATABASE_CREATE = "create table MoviesTable (_id 
integer primary key autoincrement, " + 
"title text not null, year not null);"; 

private final Context context; 

private DatabaseHelper DBHelper; 
private SQLiteDatabase db; 

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

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

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     try{ 
      db.execSQL(DATABASE_CREATE); 
     } catch (SQLException e) 
     { 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     Log.w(TAG, "Upgrading database from version " + oldVersion + " to " 
+ newVersion + 
       "which will destroy all old data"); 
     db.execSQL("DROP TABLE IF EXISTS MoviesTable"); 
     onCreate(db); 

    } 

} 

public DBAdapter open() throws SQLException 
{ 
    db = DBHelper.getWritableDatabase(); 
    return this; 
} 


public void close() 
{ 
    DBHelper.close(); 
} 

public long insertMovie(String title, String year) 
{ 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(KEY_TITLE, title); 
    initialValues.put(KEY_YEAR, year); 
    return db.insert(DATABASE_TABLE, null, initialValues); 
} 

public boolean deleteMovie(long rowID) 
{ 
    return db.delete(DATABASE_TABLE, KEY_ROWID + "='" + rowID+"'", null) >-1; 
} 

public Cursor getAllMovies() 
{ 
    return db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE, 
KEY_YEAR}, null, null, null, null, null); 
} 

public Cursor getMovie(long rowID) throws SQLException 
{ 
    Cursor mCursor = 
      db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, 
KEY_TITLE, KEY_YEAR}, KEY_ROWID + "=" + rowID, null, null, null, null, null); 
    if(mCursor != null) 
    { 
     mCursor.moveToFirst(); 
    } 
    return mCursor; 
} 

public boolean updateContact(long rowID, String title, String year) 
{ 
    ContentValues args = new ContentValues(); 
    args.put(KEY_TITLE, title); 
    args.put(KEY_YEAR, year); 
    return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowID, null) > 0; 
} 


public void deleteAllMovies() { 
    int doneDelete = 0; 
    doneDelete = db.delete(DATABASE_TABLE, null, null); 

} 

} 
+0

Вы говорите, что знаете, что это вызвано ... Каково значение 'testID' /' rowid', когда оно вызывается? – Geobits

+0

зависит от элемента, на который я нажимаю. У меня был тост в dMovie, который вернет значение в зависимости от того, что я нажал. варьировался от 0, если я ударил свой первый элемент в списке вплоть до самого последнего элемента. – user519670

+0

Не могли бы вы разместить немного кода из своего класса DBAdapter? Я предполагаю, что он расширяет SQLiteOpenHelper? Самое главное, вы вызываете getWritableDatabase(), а не getReadableDatabase()? – Aaron

ответ

1
  • Вы используете position возвращения из ListView в качестве идентификатора строки в базе данных. Это не обязательно совпадает с вашим автоинкрементным "_id" в вашей базе данных. position - это какая именно позиция в списке.

  • Возможно, вам стоит подумать об использовании movieDatabase.KEY_ROWID в качестве ключа для ваших намерений. Сейчас я вижу смесь "rowid", "rId", "_id" и KEY_ROWID. Это упростило бы то, что нужно использовать один и тот же ключ везде, когда речь идет об одном и том же.

  • Похоже, вы постоянно добавляете пучки в цель viewM. Это правда? Если это не ваше намерение, вы должны либо создать новое намерение для каждого клика, либо сначала удалить предыдущие пакеты.

+1

Я только что заметил что-то вроде этого. Я удалил приложение и переустановил его. Я нажал на элемент, третий в моем списке. Должно быть, это rowID 3, я ударил delete и удалил элемент в rowID 0, и теперь не буду делать этого больше, поэтому я думаю, что это играет определенную роль в нем. – user519670

+1

+1, хорошие предложения. Первое особенно важно. onItemClick даже дает вам идентификатор, и поскольку вы используете SimpleCursorAdapter, он должен предоставить вам соответствующий идентификатор из базы данных. Поэтому замените 'mDet.putInt (" rId ", position);' с 'mDet.putLong (" rId ", id);'. – Aaron

0

Я предполагаю, KEY_ROWID на самом деле имя столбца? Попробуйте следующее:

public boolean deleteMovie(long rowID) 
{ 
    return db.delete(DATABASE_TABLE, KEY_ROWID + "=?", new String[] { String.valueOf(rowID) }) >-1; 
} 
Смежные вопросы