• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Android Room - problem z wstawianiem obiektu do bazy danych

Object Storage Arubacloud
0 głosów
309 wizyt
pytanie zadane 13 kwietnia 2018 w Android, Swift, Symbian przez dmn Nowicjusz (220 p.)

Hej! 

Piszę aplikację do przeglądania filmów na Androida w Javie. Chciałem przechowywać aktorów i filmy w bazie danych Room, jednak podczas inicjowania danych początkowych pojawia się błąd którego nie rozumiem. Mając praktycznie identyczne entities Movie i Person, tak jak i ich Dao podczas wstawiania aktorzy wstawiają się prawidłowo, a filmy nie.

Inicjowanie danych:

private void setupTestMovieData() {
        MovieDao dao = mDataBase.movieDao();
        dao.insertMovie(getTestMovieArray());
    }

    private Movie[] getTestMovieArray() {
        Movie[] movies = new Movie[7];
        movies[0] = new Movie("Fight club", "Thriller", R.drawable.fightclub);
        movies[1] = new Movie("Prestige", "Thriller",R.drawable.prestige);
        movies[2] = new Movie("500 days of Summer","Drama", R.drawable.the500daysofsummer);
        movies[3] = new Movie("Seven","Detective", R.drawable.kiler);
        movies[4] = new Movie("Inception","Action", R.drawable.pulpfiction);
        movies[5] = new Movie("American Hustle","Crime", R.drawable.phantomthread);
        movies[6] = new Movie("Her","Drama", R.drawable.dancerinthedark);
        return movies;
    }

    private void setupTestActorsData(){
        PersonDao dao = mDataBase.personDao();
        dao.insertPeople(getTestActorArray());
    }

    private Person[] getTestActorArray() {
        Person[] actors = new Person[11];
        actors[0] = createPerson("Brad", "Pitt", "18/12/1963", R.drawable.bradpitt);
        actors[1] = createPerson("Edward", "Norton", "18/8/1969", R.drawable.edwardnorton);
        actors[2] = createPerson("Helena", "Bonham-Carter", "26/5/1966", R.drawable.helenabonhamcarter);
        actors[3] = createPerson("Joseph", "Gordon-Levitt", "17/2/1981", R.drawable.josephgordonlevitt);
        actors[4] = createPerson("Zooey", "Deschanel", "17/1/1980", R.drawable.zooeydeschanel);
        actors[5] = createPerson("Christian", "Bale", "30/1/1974", R.drawable.christianbale);
        actors[6] = createPerson("Leonardo", "DiCaprio", "11/11/1974", R.drawable.leonardodicaprio);
        actors[7] = createPerson("Morgan", "Freeman", "1/6/1937", R.drawable.morganfreeman);
        actors[8] = createPerson("Amy", "Adams", "20/8/1974", R.drawable.amyadams);
        actors[9] = createPerson("Scarlett", "Johansson", "22/11/1984", R.drawable.scarlettjohansson);
        actors[10] = createPerson("Joaquin", "Phoenix", "28/10/1974", R.drawable.joaquinphoenix);
        return actors;
    }

wyświetlenie pobranych z bazy danych:

I/System.out: [Movie{id=23, title='null', genre='null', posterResource=null}, Movie{id=24, title='null', genre='null', posterResource=null} ... Movie{id=33, title='null', genre='null', posterResource=null}]
I/System.out: [Person{id=23, firstName='Brad', lastName='Pitt', age=55, imgResource=2131165277}, Person{id=24, firstName='Edward', lastName='Norton', age=49, imgResource=2131165286}, ... , Person{id=33, firstName='Joaquin', lastName='Phoenix', age=44, imgResource=2131165293}]

 

komentarz 14 kwietnia 2018 przez KubenQPL Maniak (62,820 p.)
Jak wygląda to "nieprawidłowe wstawienie, rashuje czy co? Pokaż jeszcze dao
komentarz 14 kwietnia 2018 przez dmn Nowicjusz (220 p.)

Nieprawidłowe wstawianie, czyli takie jak opisałem: zamiast rzeczywiście wstawić podane wartości (przekazana tablica filmów), to wstawia obiekty wypełnione nullami.

@Dao
public interface MovieDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertMovie(Movie... movie);

    @Update
    void updateMovie(Movie... movie);

    @Delete
    void deleteMovie(Movie... movie);

    @Query("SELECT * FROM person")
    List<Movie> loadAllMovie();

    @Query("DELETE FROM movie")
    void deleteAllMovies();
}
@Dao
public interface PersonDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertPeople(Person... people);

    @Update
    void updatePeople(Person... people);

    @Delete
    void deletePeople(Person... people);

    @Query("SELECT * FROM person")
    List<Person> loadAllPeople();

    @Query("DELETE FROM person")
    void deleteAllPeople();

}
komentarz 14 kwietnia 2018 przez KubenQPL Maniak (62,820 p.)
Pokaż jeszcze same modele (klasa Person i Movie)
komentarz 14 kwietnia 2018 przez dmn Nowicjusz (220 p.)
@Entity
public class Movie implements Parcelable{

    @PrimaryKey(autoGenerate = true)
    private long id = 0;
    @ColumnInfo(name="title")
    private String title;
    @ColumnInfo(name="genre")
    private String genre;
    @ColumnInfo(name="poster_src")
    private Integer posterResource;

    public Movie(long id, String title, String genre, Integer posterResource) {
        this.id = id;
        this.title = title;
        this.genre = genre;
        this.posterResource = posterResource;
    }

    @Ignore
    public Movie(String title, String genre, Integer posterResource) {
        this.title = title;
        this.genre = genre;
        this.posterResource = posterResource;
    }

    protected Movie(Parcel in){
        title = in.readString();
        genre = in.readString();
        posterResource = in.readInt();
    }

    public static final Creator<Movie> CREATOR = new Creator<Movie>() {
        @Override
        public Movie createFromParcel(Parcel in) {
            return new Movie(in);
        }

        @Override
        public Movie[] newArray(int size) {
            return new Movie[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeString(title);
        out.writeString(genre);
        out.writeInt(posterResource);
    }

    public static void addToDatabase(AppDatabase db, Movie... movies){
        db.movieDao().insertMovie(movies);
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String mTitle) {
        this.title = mTitle;
    }

    public String getGenre() {
        return genre;
    }

    public void setGenre(String mGenre) {
        this.genre = mGenre;
    }

    public void setPosterResource(Integer imgResource){
        posterResource = imgResource;
    }

    public Integer getPosterResource(){
        return posterResource;
    }

    @Override
    public String toString() {
        return "Movie{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", genre='" + genre + '\'' +
                ", posterResource=" + posterResource +
                '}';
    }
}
@Entity
public class Person implements Parcelable{

    @PrimaryKey(autoGenerate = true)
    private long id = 0;
    @ColumnInfo(name = "first_name")
    private String firstName;
    @ColumnInfo(name = "last_name")
    private String lastName;
    @ColumnInfo(name = "day_of_birth")
    private GregorianCalendar dayOfBirth;
    @ColumnInfo(name = "profile_image")
    private Integer imgResource;

    public Person(long id, String firstName, String lastName, GregorianCalendar dayOfBirth, Integer imgResource) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.dayOfBirth = dayOfBirth;
        this.imgResource = imgResource;
    }

    @Ignore
    public Person(String firstName, String lastName, GregorianCalendar dayOfBirth, Integer imgResource) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.dayOfBirth = dayOfBirth;
        this.imgResource = imgResource;
    }

    protected Person(Parcel in) {
        firstName = in.readString();
        lastName = in.readString();
        dayOfBirth = (GregorianCalendar)in.readSerializable();
        imgResource = in.readInt();
    }

    public static final Creator<Person> CREATOR = new Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel in) {
            return new Person(in);
        }

        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeString(firstName);
        out.writeString(lastName);
        out.writeSerializable(dayOfBirth);
        out.writeInt(imgResource);
    }

    public static void addToDatabase(AppDatabase db, Person... people){
        db.personDao().insertPeople(people);
    }

    /*
    * GETTERS AND SETTERS
     */

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public GregorianCalendar getDayOfBirth() {
        return dayOfBirth;
    }

    public void setDayOfBirth(GregorianCalendar dayOfBirth) {
        this.dayOfBirth = dayOfBirth;
    }

    public Integer getImgResource() {
        return imgResource;
    }

    public void setImgResource(Integer imgResource) {
        this.imgResource = imgResource;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", age=" + (GregorianCalendar.getInstance().get(YEAR) - (dayOfBirth.get(YEAR))) +
                ", imgResource=" + imgResource +
                '}';
    }
}

 

1 odpowiedź

+1 głos
odpowiedź 14 kwietnia 2018 przez KubenQPL Maniak (62,820 p.)
wybrane 14 kwietnia 2018 przez dmn
 
Najlepsza

W MovieDao podałeś złą nazwę tabeli


    @Query("SELECT * FROM person")
    List<Movie> loadAllMovie();

w Query powinno być raczej "movie" a nie "person" :)

komentarz 14 kwietnia 2018 przez dmn Nowicjusz (220 p.)
Jezu, aż mi wstyd, ale czasem jak się patrzy już tyle czasu na ten kod to nie zauważa się najprostszych rzeczy :P
komentarz 14 kwietnia 2018 przez KubenQPL Maniak (62,820 p.)
Zrozumiałe ;)

Podobne pytania

0 głosów
1 odpowiedź 165 wizyt
pytanie zadane 22 marca 2018 w Android, Swift, Symbian przez Partyjny Obywatel (1,170 p.)
0 głosów
1 odpowiedź 1,016 wizyt
pytanie zadane 26 grudnia 2016 w Java przez azybad Mądrala (5,500 p.)
0 głosów
2 odpowiedzi 615 wizyt
pytanie zadane 10 sierpnia 2018 w Android, Swift, Symbian przez fipooo Bywalec (2,880 p.)

92,568 zapytań

141,422 odpowiedzi

319,638 komentarzy

61,957 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...