java - 添加到房间数据库
问题描述
我正在尝试将数据添加到我的数据库中,但我不确定如何让该方法执行。我已经创建了一个数据访问接口和一个插入方法。我可能是错的,但我也不确定我是否插入了正确的字段。这是我第一次使用房间。这是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") 公共类电影实现 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;
}
解决方案
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();
}
});
推荐阅读
- java - 当你在java中将一个数组分配给另一个数组时会发生什么?
- javascript - Bugsnag 通知错误 undefined is not an object
- android - How can Activity and its Views lifecycles overlap in android
- java - 将时间向后移动几秒钟时的输出错误
- python - Random seed for order of elements in Python's Set to List conversion
- arrays - WebdriverJS Expect Arrays to be equal ignoring order
- python - Pandas: filling NaNs only in rows intervals for which lower bound is given
- reactjs - 如何在 gatsby 中使用谷歌标签管理器
- javascript - node_modules 包导入上的意外标识符
- angular - 如何在模板驱动的表单中获取表单组验证结果?