2016-05-11 3 views
-1

Im пытается сохранить список книг, но когда я читаю таблицу, я получаю только одну книгу.Android: sqlite сохраняет только один предмет

DatabaseHelper.java

... 

@Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(
       "CREATE TABLE IF NOT EXISTS "+ TABLE_NAME +" (id TEXT PRIMARY KEY,title TEXT, description TEXT)" 
     ); 
    } 

public boolean insertBook (String id, String title, String publisher, String format, 
           String description, String creator, String category, String language, String date) 
    { 
     SQLiteDatabase db = getWritableDatabase(); 
     ContentValues contentValues = new ContentValues(); 
     contentValues.put("id", id); 
     contentValues.put("title", title); 
     contentValues.put("description", description); 
     db.insert(TABLE_NAME, null, contentValues); 
     db.close(); 
     return true; 
    } 

public List<Book> getBooks() 
    { 
     Book book = new Book(); 
     List<Book> bookList = new ArrayList<Book>(); 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor= db.rawQuery("select * from tblbooks", null); 

     if (cursor.moveToLast()) { 
      do { 
       book.setId(cursor.getString(cursor.getColumnIndex("id"))); 
       book.setTitle(cursor.getString(cursor.getColumnIndex("title"))); 
       book.setDescription(cursor.getString(cursor.getColumnIndex("description"))); 

       bookList.add(book); 

      } while (cursor.moveToNext()); 
     } 
     return bookList; 
    } 
... 

MainActivity.java

Здесь у меня есть для СЗП, который изменяет значения в книге, и в этом СЗП я поставил этот код так, что с каждая новая книга книга будет сохранена:

... 
//Save books localy 
dbHelper.insertBook( //the value of book changes, I've tested it so this is not the problem 
    book.getId(), 
    book.getTitle(), 
    book.getDescription() 
); 

После этого я использую этот код для получить все книги из базы данных, это где я получаю только 1 книгу ...

... 

//Get bookshelf of local database 
    for (int i = 0; i < dbHelper.getBooks().size(); i++) { 
      bookList.add(dbHelper.getBooks().get(i)); <-- should put all books in this list. 
    } 

    ... 

выход всегда только одна книга ...

+0

Курсор перемещается в последний элемент и останов вашего цикла после одной итерации. просто измените для cursor.movetofirsrt –

ответ

2

Просто вы должны двигаться

Book book = new Book(); 

внутри контура

if (cursor.moveToFirst()) { 
     do { 
      Book book = new Book();//here 

      book.setId(cursor.getString(cursor.getColumnIndex("id"))); 
      book.setTitle(cursor.getString(cursor.getColumnIndex("title"))); 
      book.setDescription(cursor.getString(cursor.getColumnIndex("description"))); 

      bookList.add(book); 

     } while (cursor.moveToNext()); 
    } 

, а также проверить cursor.moveToFirst();

+0

Я сделал это, но теперь я получаю список тех же книг. –

1

Вы можете сделать это так:

Изменения от cursor.moveToLast() к cursor.moveToFirst() и всегда создавать новый книгу объекта внутри цикла.

Причина: Вы запрашиваете курсор, чтобы получить последний элемент

+0

Я сделал это, но теперь я получаю список тех же книг. –

+0

@AlbinGjoka, убедитесь, что вы вставляете ту же книгу в db –

1

попробовать это,

Заменить

cursor.moveToLast() для cursor.moveToFirst()

1

Есть два вопроса, в ваш код.

  1. необходимо создать объект Book внутри цикла.

  2. Сначала переместите курсор в первую позицию &, затем возьмите запись.

Модифицированный код: -

public List<Book> getBooks() 
    { 
     List<Book> bookList = new ArrayList<Book>(); 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor= db.rawQuery("select * from tblbooks", null); 

     if (cursor.moveToFirst()) { // change here 
        do { 
     Book book = new Book(); // need to add here 

    book.setId(cursor.getString(cursor.getColumnIndex("id"))); 
         book.setTitle(cursor.getString(cursor.getColumnIndex("title"))); 
         book.setDescription(cursor.getString(cursor.getColumnIndex("description"))); 

         bookList.add(book); 

        } while (cursor.moveToNext()); 
     cursor.close(); 
       } 
     } 
     return bookList; 
    } 
+0

Я сделал это, но теперь я получаю список тех же книг. –

+0

@Albin Я использовал тот же код на своей машине и протестировал его отлично. Я обновил полный метод, пожалуйста, используйте как есть. –

+0

очень странно, но я нашел проблему. –

0

Вам нужно изменить два места

  1. Подведите Book book = new Book(); внутри цикла;
  2. изменение cursor.moveToLast() до cursor.moveToFirst().

Как это:

public List<Book> getBooks() { 
     List<Book> bookList = new ArrayList(); 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor= db.rawQuery("select * from "+TABLE_NAME, null); 
     if (cursor.moveToFirst()) { 
      do { 
       Book book = new Book(); 
       book.setId(cursor.getString(cursor.getColumnIndex("id"))); 
       book.setTitle(cursor.getString(cursor.getColumnIndex("title"))); 
       book.setDescription(cursor.getString(cursor.getColumnIndex("description"))); 
       bookList.add(book); 
      } while (cursor.moveToNext()); 
     } 
     return bookList; 
    } 

Кстати, вы не должны получить все книги, как этот

for (int i = 0; i < dbHelper.getBooks().size(); i++) 

но хотел бы это

List<Book> bookList = dbHelper.getBooks(); 
for(int i = 0, count = bookList.size(); i < count; i++){ 
    ... 
} 
Смежные вопросы