2016-05-11 8 views
-1

Ich versuche, eine Liste von Büchern zu speichern, aber wenn ich die Tabelle lese, bekomme ich nur ein Buch.Android: sqlite speichert nur einen Artikel

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

Hier habe ich eine für lus, die die Werte in Buch ändert und in diesem lus habe ich diesen Code zu setzen, so dass mit jedes neue Buch das Buch wird gespeichert:

... 
//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() 
); 

Danach verwende ich diesen Code zu erhalten alle Bücher aus der Datenbank, das ist, wo ich nur 1 Buch bekommen ...

... 

//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. 
    } 

    ... 

Ausgang ist immer nur ein Buch ...

+0

Ihr Cursor bewegt letzter Punkt und Ihre Schleife stoppen nach einer Iteration. Ändern Sie einfach für cursor.movetofirsrt –

Antwort

2

Nur sollten Sie

Book book = new Book(); 

bewegen Looping

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()); 
    } 

und auch überprüfen cursor.moveToFirst();

+0

Ich habe dies getan, aber jetzt bekomme ich eine Liste der gleichen Bücher. –

1

Sie können auf diese Weise tun:

ändern cursor.moveToLast()-cursor.moveToFirst() und immer wieder neue Buch Objekt innerhalb Schleife erstellen.

Grund: Du fordert Cursor

+0

Ich habe das getan, aber jetzt bekomme ich eine Liste der gleichen Bücher. –

+0

@AlbinGjoka, stellen Sie sicher, dass Sie das gleiche Buch in db einfügen –

1

versucht dies,

ersetzen

cursor.moveToLast(), um cursor.moveToFirst() Letzten Artikel

1

Es gibt zwei Probleme zu bekommen dein Code.

  1. Sie müssen das Buchobjekt innerhalb der Schleife erstellen.

  2. Bewegen Sie zuerst den Cursor an die erste Position &, und rufen Sie dann den Datensatz ab.

Modified Code: -

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

Ich habe dies getan, aber jetzt bekomme ich eine Liste der gleichen Bücher. –

+0

@Albin Ich habe den gleichen Code auf meiner Maschine verwendet und getestet, es funktioniert gut. Ich habe die komplette Methode aktualisiert, bitte benutze sie so wie sie ist. –

+0

sehr seltsam, aber ich habe das Problem gefunden. –

0

Sie benötigen zwei Ort ändern

  1. Bewegung der Book book = new Book(); Looping;
  2. Änderung cursor.moveToLast() zu cursor.moveToFirst().

So:

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; 
    } 

By the way, sollten Sie nicht alle Bücher bekommen wie dieses

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

sollte, aber ich mag dieses

List<Book> bookList = dbHelper.getBooks(); 
for(int i = 0, count = bookList.size(); i < count; i++){ 
    ... 
} 
Verwandte Themen