Добавление в базу данных комнаты

Я пытаюсь добавить данные в свою базу данных, но не знаю, как заставить метод выполняться. Я уже создал интерфейс доступа к данным и метод вставки. Я могу ошибаться, но я также не уверен, что вставляю правильные поля. Это мой первый раз, когда я использую комнату. Это метод addToFavourites внизу в «mFavorites» onSetClickListener.

*Кинокласс добавлен ниже

public class DetailActivity extends AppCompatActivity {

    public static final String KEY_EXAMPLE = "hNCmb-4oXJA";
    private static final String KEY_ID = "id";
    private static final String KEY_URL = "key";
    private static final String KEY_NAME = "name";

    private RequestQueue mRequestQueue;
    private MovieDataBase database;
    ArrayList<TrailerRequest> mTrailerList;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.movie_detail_actvity);
        ImageView imageView = findViewById(R.id.image_iv);


        mRequestQueue = Volley.newRequestQueue(this);

        mTrailerList = new ArrayList<>();


        /* database instance */
        database = MovieDataBase.getInstance(getApplicationContext());


        ImageView mFavourites = findViewById(R.id.fav_image_view);
        ImageView mPlayTrailer = findViewById(R.id.trailer_image_view);



        // String intents for catching the data (String constants) from Main activity for displaying data in the detail activity
        Intent intent = getIntent();
        String posterUrl = intent.getStringExtra(Constants.EXTRA_URL);
        String title = intent.getStringExtra(Constants.TITLE_TEXT);
        String overview = intent.getStringExtra(Constants.OVERVIEW_TEXT);
        String releaseDate = intent.getStringExtra(Constants.RELEASE);
        String voteAverage = intent.getStringExtra(Constants.VOTE_AVERAGE);
        final String movieId = intent.getStringExtra(MOVIE_ID);


        // Detail activity title TextView
        TextView textView = findViewById(R.id.title_text_view);
        // Detail activity OverView TextView
        TextView overViewText = findViewById(R.id.plot_synopsis_text_view);
        // Detail activity ReleaseDate TextView
        TextView releaseTextView = findViewById(R.id.release_date_text_view);
        // Detail activity user ratings TextView
        TextView voteAverageTextView = findViewById(R.id.user_rating_text_view);

        TextView movieIdTextView = findViewById(R.id.movie_id);


        // Load Detail activity ImageView using Picasso
        Picasso.get()
                .load(Utils.buildPosterUrl(posterUrl))
                .fit()
                .centerInside()
                .placeholder(R.drawable.ic_launcher_background)
                .error(R.drawable.sample_7)
                .into(imageView);


        // set data on to views
        textView.setText(title);
        overViewText.setText(overview);
        releaseTextView.setText(releaseDate);
        voteAverageTextView.setText(String.format(getString(R.string.user_rating_tv), voteAverage));
        movieIdTextView.setText(movieId);


        mFavourites.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 addToFavourites(args????)//I don't know what to do here 
                Toast.makeText(DetailActivity.this, "Added to Favourites", Toast.LENGTH_SHORT).show();
            }
        });

        mPlayTrailer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                playTrailer();
            }
        });

        mReadReviews.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(DetailActivity.this, "Show Reviews", Toast.LENGTH_SHORT).show();
            }
        });


    }



    private void playTrailer() {

        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com/watch?v = " + KEY_URL));
        startActivity(intent);

    }


    private void addToFavourites(final Movies movies) {
        AppExecutors.getInstance().diskIO().execute(new Runnable() {
            @Override
            public void run() {
                database.movieDao().insert(movies);
            }
        });
    }



    @Dao
    public interface MovieDao {
        @Insert(onConflict = OnConflictStrategy.REPLACE)
        void insert(example.android.popularmoviesvolley.Models.Movies[] movies);

        @Delete
        void delete(Movies[] movie);

        @Query("DELETE FROM movie_table")
        void deleteAllMovies();


        //This is where we get all movies displayed in the recycler view (COME BACK TO THIS!!)
        @Query("SELECT * FROM movie_table")
        LiveData<List<Movie>> getAllMovies();


    }

@Entity(tableName = "movie_table") Открытый класс Movies реализует Parcelable {

@PrimaryKey
private int id;

private String mId;

private String mOriginalTitle;

private String mPosterPath;

private String mOverview;

private String mReleaseDate;

private String mVoteAverage;


public Movies(String id, String posterPath, String originalTitle, String overview, String release_date, String voteAverage) {
    this.mId = id;
    this.mPosterPath = posterPath;
    this.mOriginalTitle = originalTitle;
    this.mOverview = overview;
    this.mReleaseDate = release_date;
    this.mVoteAverage = voteAverage;


}


@Ignore
public Movies(Parcel parcel) {
    mId = parcel.readString();
    mOriginalTitle = parcel.readString();
    mPosterPath = parcel.readString();
    mOverview = parcel.readString();
    mReleaseDate = parcel.readString();
    mVoteAverage = parcel.readString();
}

@Ignore
@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(mId);
    dest.writeString(mOriginalTitle);
    dest.writeString(mPosterPath);
    dest.writeString(mOverview);
    dest.writeString(mReleaseDate);
    dest.writeString(mVoteAverage);
}

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

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

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


public String getmOriginalTitle() {
    return mOriginalTitle;
}

public void setmOriginalTitle(String mOriginalTitle) {
    this.mOriginalTitle = mOriginalTitle;
}


public String getmOverview() {
    return mOverview;
}

public void setmOverview(String mOverview) {
    this.mOverview = mOverview;
}

public String getmReleaseDate() {
    return mReleaseDate;
}

public void setmReleaseDate(String mReleasedate) {
    this.mReleaseDate = mReleasedate;
}

public String getmPosterPath() {
    return mPosterPath;
}

public void setmPosterPath(String mPosterPath) {
    this.mPosterPath = mPosterPath;
}

public String getmVoteAverage() {
    return mVoteAverage;
}

public void setmVoteAverage(String mVoteAverage) {
    this.mVoteAverage = mVoteAverage;
}

public String getmId() {
    return mId;
}

public void setmId(String mId) {
    this.mId = mId;
}

//Database ID
public void setId(int id) {
    this.id = id;
}

что такое movieDao()? Что это за метод insert?

jhamon 13.04.2019 01:45

Дао (данные доступа к объекту). Вставка — это простой метод вставки для SQLite, но на этот раз с использованием Room. Я могу показать вам весь гитхаб, потому что мне надоел этот проект. :(

StanleyManoah 13.04.2019 01:52

Люди не могут сказать вам, правильно ли вы вставляете данные, если вы не показываете, как выглядит класс данных и как он вставляется. На данный момент код, который вы разместили, предназначен только для графического интерфейса.

jhamon 13.04.2019 01:54

Я понимаю, что вы имеете ввиду. Я добавил интерфейс Dao внизу, помогает ли это, или я должен также добавить объект Movie?

StanleyManoah 13.04.2019 02:01

вопрос скорее в том, что такое Models.Movies (которое, вероятно, следует называть Models.Movie)?

Martin Zeitler 13.04.2019 02:53

@pureskill75 MovieDao и Models.Movies являются соответствующей частью; остальное шум.

Martin Zeitler 13.04.2019 02:59

@MartinZeitler Я добавил Models.Movies ниже.

StanleyManoah 13.04.2019 14:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

addToFavourites(args????)

Похоже, ваш метод addToFavourites принимает объект Movies, поэтому убедитесь, что этот объект снабжен аннотацией @Entity и имеет @PrimaryKey (уникальный для всех фильмов). Затем передайте его.

Я также заметил, что у вас есть два оператора вставки в вашем DAO, принимающие объект Movie. Я ДУМАЮ, что это правильно:

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insert(example.android.popularmoviesvolley.Models.Movies[] movies);

Так что убери другую

Затем в вашем классе RoomDatabase убедитесь, что у вас есть что-то вроде:

  @Database(entities = {Movies.class}, version = 1, exportSchema = false)
  public abstract class MyDatabase extends RoomDatabase {
     ...
  }

Если это не отвечает на ваш вопрос, обновите свой пост и покажите свой класс фильмов.

Редактировать

    Intent intent = getIntent();
    String posterUrl = intent.getStringExtra(Constants.EXTRA_URL);
    String title = intent.getStringExtra(Constants.TITLE_TEXT);
    String overview = intent.getStringExtra(Constants.OVERVIEW_TEXT);
    String releaseDate = intent.getStringExtra(Constants.RELEASE);
    String voteAverage = 
    intent.getStringExtra(Constants.VOTE_AVERAGE);
    final String movieId = intent.getStringExtra(MOVIE_ID);

    Movies movies = new Movies(movieId, posterUrl, title, overview, 
    releaseDate, voteAverage);

     mFavourites.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             addToFavourites(movies)//I don't know what to do here 
            Toast.makeText(DetailActivity.this, "Added to Favourites", 
            Toast.LENGTH_SHORT).show();
        }
    });

Я включил все в пост, включая класс Models.Movies, я также удалил другой оператор вставки. Добавить в избранное определенно берет объект фильма, но я просто не знаю, как его передать.

StanleyManoah 13.04.2019 14:45

Извините, ваш вопрос не имеет большого смысла. Недостаточно информации. Чтобы передать переменную методу, вы просто заключаете переменную в круглые скобки. Вы хотите спросить: «Как мне создать экземпляр объекта Movies для передачи в метод?»

AzraelPwnz 13.04.2019 14:58

Да именно так? (Извините, весь мой проект терпит неудачу, и у меня есть проблемы с IDE и проблемы с решением кода)

StanleyManoah 13.04.2019 15:02

Отредактировал мой ответ, чтобы показать экземпляр вашего класса и передать его методу addToFavourites.

AzraelPwnz 13.04.2019 15:06

Другие вопросы по теме