java - 我需要显示我保存在房间数据库中的一些数据。我忘记添加什么到代码中或者缺少什么?

标签 java android sqlite android-recyclerview android-room

因此,在这个项目中,我将电影的“评级”保存到我的房间数据库中。我知道我的电影名称和电影评分存储在数据库中,但我只是不知道如何访问数据以在显示所有评分的 fragment 中显示它。

到目前为止,这是我的代码。

RatingActorAdapter.java

public class RatingMovieAdapter extends RecyclerView.Adapter<RatingMovieAdapter.ViewHolder> {
private List<Movie> movieList;
private LayoutInflater mInflater;

public RatingMovieAdapter(Context context, List<Movie> movieList) {
    this.movieList = movieList;
    this.mInflater = LayoutInflater.from(context);
}

@Override
public RatingMovieAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = mInflater.inflate(R.layout.list_movies_rating, parent, false);
    ViewHolder holder = new ViewHolder(view);
    return holder;
}

@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {

}

@Override
public void onBindViewHolder(RatingMovieAdapter.ViewHolder holder, int position, List<Object> payloads) {

    super.onBindViewHolder(holder,position, payloads);

    Movie item = this.movieList.get(position);
    holder.movieName.setText(item.getMovieName());
    holder.movieRate.setText(item.getRatingMovie());
}

@Override
public int getItemCount() {
    return movieList.size();
}

public class ViewHolder extends RecyclerView.ViewHolder{
    TextView movieRate;
    TextView movieName;
    public ViewHolder(View itemView) {
        super(itemView);
        movieRate =  itemView.findViewById(R.id.ratingFilmGrade);
        movieName =  itemView.findViewById(R.id.ratingFilmText);
    }
}

RatingFragment.java

public class RatingFragment extends Fragment {


private RecyclerView recyclerViewMovies;
List<Movie> items;
//private RecyclerView.LayoutManager layoutManager;
private RatingMovieAdapter ratingMovieAdapter;

public RatingFragment(){

}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    super.onCreateView(inflater,container,savedInstanceState);
    View view = inflater.inflate(R.layout.fragment_rating, container, false);

    MovieDao movieDao = db.movieDao();       
    List<Movie> movieList = movieDao.getMovies();

    this.recyclerViewMovies = (RecyclerView) view.findViewById(R.id.movieRecyclerView);
    this.ratingMovieAdapter = new RatingMovieAdapter(getActivity(), this.items);
    this.recyclerViewMovies.setAdapter(this.ratingMovieAdapter);
    this.recyclerViewMovies.setLayoutManager(new LinearLayoutManager(getActivity()));

    View rootView = inflater.inflate(R.layout.fragment_rating, container, false);
    return rootView;

}

AppDatabase.java

@Database(entities = {Movie.class}, version =4, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
    public abstract MovieDao movieDao();
}

在主要 Activity 中,我可以全局访问数据库:

public class MainActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener {
    public static AppDatabase db;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        db = Room.databaseBuilder(this, AppDatabase.class, "top_actor_baza")
                .allowMainThreadQueries()
                .fallbackToDestructiveMigration()
                .build()

    }
....
...
...
...
}

MovieDao.java

public interface MovieDao {

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

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insert(Movie movies);

    @Update
    void update(Movie movies);
}

电影.java

@Entity
public class Movie {

//    @PrimaryKey(autoGenerate = true)
//    public int uid;

    @PrimaryKey @NonNull
    public String movieName;

    @ColumnInfo(name = "rating_movie")
    public String ratingMovie;

    @ColumnInfo(name = "year")
    public String year;

    /*public Movie(int uid, String movieName, String ratingMovie, String year) {
        this.uid = uid;
        this.movieName = movieName;
        this.ratingMovie = ratingMovie;
        this.year = year;

    }*/

//    public int getUid() {
//        return uid;
//    }
//
//    public void setUid(int uid) {
//        this.uid = uid;
//    }

    public String getMovieName() {
        return movieName;
    }

    public void setMovieName(String movieName) {
        this.movieName = movieName;
    }

    public String getRatingMovie() {
        return ratingMovie;
    }

    public void setRatingMovie(String ratingMovie) {
        this.ratingMovie = ratingMovie;
    }

    public String getYear() {
        return year;
    }

    public void setYear(String year) {
        this.year = year;
    }
}

fragment_ rating.xml

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/scrollView2"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">


        <TextView
            android:id="@+id/textView2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginLeft="8dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginRight="8dp"
            android:gravity="center"
            android:text="Top rated movies"
            android:textSize="24sp"
            android:visibility="visible"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/actorRecyclerView" />

        <android.support.v7.widget.RecyclerView
            android:id="@+id/movieRecyclerView"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:layout_marginStart="8dp"
            android:layout_marginLeft="8dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginRight="8dp"
            android:layout_marginBottom="8dp"
            android:scrollbars="vertical"
            android:visibility="visible"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.501"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView2" />

        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginLeft="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginRight="8dp"
            android:gravity="center"
            android:text="Top rated actors"
            android:textSize="24sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <android.support.v7.widget.RecyclerView
            android:id="@+id/actorRecyclerView"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:layout_marginStart="8dp"
            android:layout_marginLeft="8dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginRight="8dp"
            android:scrollbars="vertical"
            android:visibility="visible"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView" />
    </android.support.constraint.ConstraintLayout>

</ScrollView>

列表电影评级.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">


    <TextView
        android:id="@+id/ratingFilmGrade"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </TextView>

    <TextView
        android:id="@+id/ratingFilmText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


</LinearLayout>

现在我认为这几乎是您需要的所有类和布局,以帮助我。如果您需要的话,我还可以添加显示如何将数据保存到数据库的类,但我认为到目前为止一切都很好。

如果可以的话请帮忙。谢谢。

最佳答案

Android Room 被设计为 Android 架构 组件的一部分。从 fragment 访问数据库是一个坏主意。

使用MVVM模式并创建一个RatingViewModel类,其字段类型为LiveData <List<Movie>> ,它将从类 MovieRepository 接收数据并订阅您的 recyclerview

这种模式的例子太多了,我喜欢this one from Google codelab

您还可以在 my github todo-app project 上查看如何执行此操作

关于java - 我需要显示我保存在房间数据库中的一些数据。我忘记添加什么到代码中或者缺少什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58240040/

相关文章:

android - Jetpack Compose - 无法为脚手架底部栏的高度设置动画

java - 在 Android 上用 Java 获取 SQLite SUM

ios - 如何使用 Titanium 将 db 文件保存在文档目录中

java - 使用pom编译src.jar和.jar

java - 如何从 java eclipse DOM 上的 XML 文件获取 href 值

java - 在主循环的函数参数中找不到符号?

android - 打开/qemu.conf失败,错误: 2

android - 单击 span 和 div 中包含的文本

android:多语言数据库问题

java - 如何在 Java 中将一个 Json 节点插入到另一个 Json 节点中?