2016-01-27 2 views
2

Я знаю, что вопрос не новый, но все остальные примеры, которые я нашел здесь, не работали. Вот почему я пишу вам.Обновление и удаление строки в списке

Я создал приложение для книг, в котором вы можете сохранить bookdata из googlebooks и сохранить данные в sqlite db. Буклетные данные будут отображаться в виде списка. Если вы нажмете на строку, все данные строки будут отображаться в EdittExts в другом действии - выглядит как подробный просмотр книги. Некоторые примеры фотографий: Listview; detailed bookview

Теперь я хочу дать возможность пользователю редактировать эти книги. Я внедрил некоторый код для обновления и делит информацию, и я получаю информацию из Logcat, что создается Db, но когда я возвращаюсь в ListView, данные не обновляются или не удаляются.

Я использовал видео под названием «Android Studio Tutorial - 37 - Обновление базы данных» из YouTube, чтобы преобразовать для моего решения

Может быть, вы можете мне помочь.

После моего кода для Info Book:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_book_info); 
     bookDBHelper = new BookDBHelper(this); 
     Typeface myTypeface = Typeface.createFromAsset(getAssets(), "Lobster.ttf"); 
     TextView myTextView = (TextView) findViewById(R.id.yourbookinfo); 
     myTextView.setTypeface(myTypeface); 

     btn_update = (Button) findViewById(R.id.button_update); 

     Intent intent = getIntent(); 

     String secret_title = intent.getStringExtra(BookDataListActivity.EXTRA_MSG1); 
     Secret_editText_title = (EditText) findViewById(R.id.secret_edittext_title); 
     Secret_editText_title.setText(secret_title); 

     String book_title = intent.getStringExtra(BookDataListActivity.EXTRA_MSG1); 
     passedbooktitle = (EditText) findViewById(R.id.passed_booktitle); 
     passedbooktitle.setText(book_title); 

     String book_author = intent.getStringExtra(BookDataListActivity.EXTRA_MSG2); 
     passedbookauthor = (EditText) findViewById(R.id.passed_bookauthor); 
     passedbookauthor.setText(book_author); 

     String book_date = intent.getStringExtra(BookDataListActivity.EXTRA_MSG3); 
     passedbookdate = (EditText) findViewById(R.id.passed_bookdate); 
     passedbookdate.setText(book_date); 

     String book_rating = intent.getStringExtra(BookDataListActivity.EXTRA_MSG4); 
     passedbookrating = (EditText) findViewById(R.id.passed_bookrating); 
     passedbookrating.setText(book_rating); 

     String book_shelf = intent.getStringExtra(BookDataListActivity.EXTRA_MSG5); 
     passedbookshelf = (EditText) findViewById(R.id.passed_bookshelf); 
     passedbookshelf.setText(book_shelf); 

    } 


    public void updateBookInfo(View view){ 
     bookDBHelper = new BookDBHelper(getApplicationContext()); 
     sqLiteDatabaseBooks = bookDBHelper.getWritableDatabase(); 

     secret_editText_titel = Secret_editText_title.getText().toString(); 

     String booktitle, bookauthor, bookdate, bookrating, bookshelf; 
     booktitle = passedbooktitle.getText().toString(); 
     bookauthor = passedbookauthor.getText().toString(); 
     bookdate = passedbookdate.getText().toString(); 
     bookrating = passedbookrating.getText().toString(); 
     bookshelf = passedbookshelf.getText().toString(); 
     int count = bookDBHelper.updateEditedBookInfo(secret_editText_titel, 
       booktitle,bookauthor, bookdate, bookrating, bookshelf, sqLiteDatabaseBooks); 
     Toast.makeText(getApplicationContext(), count+" book updated", Toast.LENGTH_LONG).show(); 
     finish(); 

    } 

    public void deleteBook(View view){ 
     bookDBHelper = new BookDBHelper(getApplicationContext()); 
     sqLiteDatabaseBooks = bookDBHelper.getWritableDatabase(); 
     bookDBHelper.deleteBookInformation(secret_editText_titel, sqLiteDatabaseBooks); 
     Toast.makeText(getBaseContext(), "Book deleted", Toast.LENGTH_LONG).show(); 
    } 

И для моего BookDBHelper:

public int updateEditedBookInfo(String old_title, String new_title, String new_author, 
            String new_date, String new_rating, 
            String new_shelf, SQLiteDatabase sqLiteDatabase){ 
     ContentValues contentValues = new ContentValues(); 
     contentValues.put(BookContent.NewBookInfo.BOOK_TITLE, new_title); 
     contentValues.put(BookContent.NewBookInfo.BOOK_AUTHOR, new_author); 
     contentValues.put(BookContent.NewBookInfo.BOOK_DATE, new_date); 
     contentValues.put(BookContent.NewBookInfo.BOOK_RATING, new_rating); 
     contentValues.put(BookContent.NewBookInfo.BOOK_SHELF, new_shelf); 

     String selection = BookContent.NewBookInfo.BOOK_TITLE + " = ?"; 
     String [] selection_args = {old_title}; 
     int count = sqLiteDatabase.update(BookContent.NewBookInfo.TABLE_NAME_BOOKS, contentValues, selection, selection_args); 
     return count; 
    } 

    public void deleteBookInformation(String book_title,SQLiteDatabase sqLiteDatabase){ 
    String selection = BookContent.NewBookInfo.BOOK_TITLE+ " =?"; 
    String [] selection_args = {book_title}; 
    sqLiteDatabase.delete(BookContent.NewBookInfo.TABLE_NAME_BOOKS, selection, selection_args); 
} 

Edit, как спросил activity_book_info.XML

<?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.kasutwentyseven.gui4selfshelf.Books.BookInfoActivity" 
    android:background="@color/Background"> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/yourbookinfo" 
     android:id="@+id/yourbookinfo" 
     android:textSize="25dp" 
     android:textColor="@color/Textcolor" 
     android:gravity="center_horizontal" 
     android:textStyle="bold" 
     /> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/yourbookinfo" 
     android:layout_alignParentStart="true" 
     android:id="@+id/linearLayout5"> 

     <LinearLayout 
      android:orientation="horizontal" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

      <ImageView 
       android:layout_width="100dp" 
       android:layout_height="match_parent" 
       android:id="@+id/passed_bookimage" /> 

      <LinearLayout 
       android:orientation="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 

       <EditText 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:id="@+id/passed_booktitle" /> 

       <EditText 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:id="@+id/passed_bookauthor" /> 

       <EditText 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:id="@+id/passed_bookdate" /> 

       <EditText 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:id="@+id/passed_bookrating" /> 

       <EditText 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:id="@+id/passed_bookshelf" /> 
      </LinearLayout> 
     </LinearLayout> 
    </LinearLayout> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/linearLayout5" 
     android:layout_alignParentStart="true" 
     android:id="@+id/linearLayout6"> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/btn_update" 
      android:id="@+id/button_update" 
      android:onClick="updateBookInfo"/> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/btn_delete" 
      android:id="@+id/btn_delete_book" 
      android:onClick="deleteBook"/> 
    </LinearLayout> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/linearLayout6"> 

     <EditText 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/secret_edittext_title" /> 
    </LinearLayout> 
</RelativeLayout> 
+0

Вы можете разместить свой файл макета? – 0X0nosugar

+0

Я полагаю, что Тосты показывают, что действительно есть строки базы данных, обновленные/удаленные. Если это так, следующим шагом будет показать изменения в ListView. База данных и ListView обычно не тесно связаны, для этого вам нужно будет работать с CursorLoader/SimpleCursorAdapter. Поэтому после изменений в db вам нужно загрузить данные в ListView, как и в начале. – 0X0nosugar

+0

@ 0X0nosugar Хорошо. но что происходит, чем со «старыми» данными –

ответ

0

С помощью @ 0x0nosugar (спасибо за это) Я за унд решение:

к updatebookinfo: Я добавил:

Intent intent = new Intent(getApplicationContext(), BookDataListActivity.class); 
startActivity(intent); 

и для удаления:

public void DeleteData(){ 
    btn_delete_book.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Integer deletedRows = bookDBHelper.deleteDate(passedbooktitle.getText().toString()); 
      if (deletedRows > 0) { 
       Toast.makeText(getApplicationContext(), " Book deleted", Toast.LENGTH_LONG).show(); 
       Intent intent = new Intent(getApplicationContext(), BookDataListActivity.class); 
       startActivity(intent); 
       finish(); 
      } else { 
       Toast.makeText(getApplicationContext(), " Book not deleted", Toast.LENGTH_LONG).show(); 
      } 
     } 

    }); 

В BookDBHelper:

public Integer deleteDate (String book_title){ 
    SQLiteDatabase sqLiteDatabase = this.getWritableDatabase(); 
    String selection = BookContent.NewBookInfo.BOOK_TITLE+ " = ?"; 
    String[] selection_args = {book_title}; 
    return sqLiteDatabase.delete(BookContent.NewBookInfo.TABLE_NAME_BOOKS,selection, selection_args); 
} 

метода в списке activitiy:

@Override 
public void onResume(){ 
    super.onResume(); 
    bookListDataAdapter.notifyDataSetChanged(); 

} 
+0

Вы знаете, как вы начинаете деятельность в списке сейчас, вы можете назвать «finish();» там сразу после начала операции с данными и выполните то же самое для активности активности после (повторного) запуска активности списка. Таким образом, вы не рискуете, что пользователь нажмет «назад» и перейдет к более старой версии этого действия. Этого никогда не может быть, но мне нравится быть в безопасности :) – 0X0nosugar

+0

@ 0X0nosugar Я должен снова вас беспокоить. Моя операция удаления не работает. Я отредактировал и добавил метод deleteBook в своей книге BookInfoactivity и deleteBookInformation для операции BookDBHelper. Я получаю книгу ответов удаленной, но после возобновления BookListActivity книга не удалена. Какие-либо предложения? –

+0

хорошо, ваше сообщение о успехе Toast «самоподтверждено»;) Как и в случае с «update()», вы можете проверить возвращаемое значение «delete()». Если он не равен 1, то вы знаете, что что-то не так с запросом (например, строка была явно в базе данных, но ваш запрос «выбор» не соответствовал требуемой строке). Кстати, это может быть опечатка здесь на SO, но убедитесь, что вы пишете «=?» в запросе, а не «=?» – 0X0nosugar

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