我想使用Room

时间:2018-09-04 01:04:49

标签: android

我进行了三项活动,我捕获了所有数据,但其中一项是从DetailActivity中捕获的,只需单击按钮并使用Room将其保存在数据库中;我的意图是将所有这些数据插入数据库中,并启动ReviewActivity,以便获取评论的数组列表,并将其插入数据库中。在我希望离线查看评论之前,一切似乎都可以正常工作,因为我认为它已保存,因此评论不会加载。 这是我的DetailActivity,

    TextView overview_tv;    ImageView image_tv;    TextView name_tv;    TextView ratings;    Context context;    TextView release_date;    ImageView backdrop_poster;    private ExpandableHeightListView trailers;    public static ArrayList<Youtube> youtube;    public static ArrayList<Review> reviews;    TrailerViewAdapter adapter;    public static DataObject data;    DataObject dataObject;    ArrayList<Review> savedReview;    private static final String IMAGE_URL = "http://image.tmdb.org/t/p/w185/";    private static final String THE_MOVIEDB_URL2 = "https://api.themoviedb.org/3/movie/";    private static final String MOVIE_QUERY2 = "api_key";    private static final String API_KEY2 = "6cc4f47bd4a64e0117e157b79072ae37";    private static String SEARCH_QUERY2 = "videos";    public static int movieId;    Button viewReviews;    Button favourite;    String movieRating;    private static final int YOUTUBE_SEARCH_LOADER = 23;    private static final int REVIEW_SEARCH_LOADER = 24;    File file;    String name;    String overview;    String releaseDate;    int switcher;    public static ArrayList<Review> favouriteReviews;    TextView trev;    AppDatabase mDb;    //Navigation arrow on the action bar    @Override    public boolean onOptionsItemSelected(MenuItem item) {        int id = item.getItemId();        if (id == android.R.id.home) {            NavUtils.navigateUpFromSameTask(this);        }        return super.onOptionsItemSelected(item);    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_detail);        mDb = AppDatabase.getInstance(getApplicationContext());        youtube = new ArrayList<Youtube>();        reviews = new ArrayList<Review>();        adapter = new TrailerViewAdapter(this, youtube);        //Credit to Paolorotolo @github        trailers = findViewById(R.id.expandable_list);        trailers.setAdapter(adapter);        trailers.setExpanded(true);        //Navigation arrow on the acton bar; check also override onOptionsItemSelected        ActionBar actionBar = this.getSupportActionBar();        if (actionBar != null) {            actionBar.setDisplayHomeAsUpEnabled(true);        }        context = getApplicationContext();        Intent intent = getIntent();        if (intent == null) {            closeOnError();        }        switcher = getIntent().getIntExtra("switch", 3);        overview_tv = findViewById(R.id.overview);        image_tv = findViewById(R.id.image);        name_tv = findViewById(R.id.name);        ratings = findViewById(R.id.ratings);        release_date = findViewById(R.id.release_date);        backdrop_poster = findViewById(R.id.backdrop_poster);        trev = findViewById(R.id.review_show);        viewReviews = findViewById(R.id.review_button);        favourite = findViewById(R.id.favourite_button);        addListenerOnRatingBar(ratings);        if (switcher != 2) {            favourite.setVisibility(View.INVISIBLE);            dataObject = (DataObject) getIntent().getParcelableExtra("array");            final String favouriteName = dataObject.getName();            final String favouriteOverview = dataObject.getOverview();            final String favouriteReleaseDate = dataObject.getReleaseDate();            ArrayList<Youtube> savedTrailer = dataObject.getTrailers();            savedReview = dataObject.getMovieReviews();            movieRating = dataObject.getRating();            name_tv.setText(favouriteName);            overview_tv.setText(favouriteOverview);            ratings.setText("Rating: " + movieRating);            release_date.setText("Release Date: " + favouriteReleaseDate);//            Toast.makeText(this, "Testing Reviews " + savedReview.get(0).getAuthor(), Toast.LENGTH_SHORT).show();            String imagePath = name_tv.getText().toString() + "0i";            String backdropPath = name_tv.getText().toString() + "1b";            try {                DataObjectAdapter.downloadImage(imagePath, image_tv, this);            } catch (Exception e) {                e.printStackTrace();            }            try {                DataObjectAdapter.downloadImage(backdropPath, backdrop_poster, context);            } catch (Exception e) {                e.printStackTrace();            }            if (savedTrailer != null) {                TrailerViewAdapter lv = new TrailerViewAdapter(DetailActivity.this, savedTrailer);                trailers.setAdapter(lv);                switcher = 3;            }        } else {            name = getIntent().getStringExtra("Name");            overview = getIntent().getStringExtra("Overview");            final String image = getIntent().getStringExtra("Image");            movieId = getIntent().getIntExtra("movieId", 1);            final String backdrop = getIntent().getStringExtra("backdrop");            releaseDate = getIntent().getStringExtra("releaseDate");            movieRating = getIntent().getStringExtra("rating");            Log.i("this", "switch " + switcher);            name_tv.setText(name);            overview_tv.setText(overview);            ratings.setText("Rating: " + movieRating);            release_date.setText("Release Date: " + releaseDate);            //load backdrop poster            Picasso.with(context)                    .load(IMAGE_URL + backdrop)                    .fit()                    .placeholder(R.drawable.placeholder_image)                    .error(R.drawable.placeholder_image)                    .into(backdrop_poster);            Picasso.with(context)                    .load(IMAGE_URL + image)                    .fit()                    .placeholder(R.drawable.placeholder_image)                    .error(R.drawable.placeholder_image)                    .into(image_tv);            getSupportLoaderManager().initLoader(YOUTUBE_SEARCH_LOADER, null, this);            //getSupportLoaderManager().initLoader(REVIEW_SEARCH_LOADER, null, this);            //loadTrailers();            //loadReviews();            //populateKeys();        }        /**         * Here manages the views(list) for reviews         */        viewReviews.setOnClickListener(new View.OnClickListener() {                                           @Override                                           public void onClick(View v) {                                               if (switcher == 3) {                                                   startActivity(new Intent(DetailActivity.this,                                                           ReviewActivity.class)                                                           .putExtra("switch", 3));                                               } else {                                                   Log.i("this", "I am from initial" + switcher);                                                   startActivity(new Intent(DetailActivity.this,                                                           ReviewActivity.class).putExtra("id", movieId));                                               }                                           }                                       }        );        favourite.setOnClickListener(new View.OnClickListener() {                                         @Override                                         public void onClick(View v) {                                             data = new DataObject();                                             data.setName(name);                                             data.setOverview(overview);                                             data.setRating(movieRating);                                             data.setReleaseDate(releaseDate);                                             data.setTrailers(youtube);//                                             data.setMovieReviews(reviews);                                             try {                                                 saveImage(name_tv.getText().toString() + "0i", image_tv);                                                 saveImage(name_tv.getText().toString() + "1b", backdrop_poster);                                             } catch (IOException e) {                                                 e.printStackTrace();                                             }                                             Toast.makeText(context,                                                     "The movie is saved as a favourite",                                                     Toast.LENGTH_LONG).show();                                             AppExecutors.getInstance().diskIO().execute(new Runnable() {                                                 @Override                                                 public void run() {                                                     mDb.dataDao().insertData(data);                                                 }                                             });                                             startActivity(new Intent(DetailActivity.this,                                                     ReviewActivity.class).putExtra("id", movieId)                                                     .putExtra(ReviewActivity.EXTRA_DATA_ID, 20));                                         }                                     }        );    }

还有我的ReviewActivity

public class ReviewActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<ArrayList<Review>>{    public static ArrayList<Review>  reviews;    public static List<DataObject> favouriteReviews;    public static RecyclerView reviewList;    ArrayList<Review> r;    private static final int REVIEW_SEARCH_LOADER = 24;    private static final String MOVIE_QUERY3 = "api_key";    private static final String API_KEY3 = "6cc4f47bd4a64e0117e157b79072ae37";    private static String SEARCH_QUERY3 = "reviews";    private static final String THE_MOVIEDB_URL3 = "https://api.themoviedb.org/3/movie/";    private static int movId;    public static final String EXTRA_DATA_ID = "extraDataId";    private static final int DEFAULT_TASK_ID = -1;    private int mTaskId = DEFAULT_TASK_ID;    DataObject data1;    AppDatabase mDb;    ReviewAdapter revAdapter;    int loaderSwitch;    @Override    protected void onResume() {        super.onResume();    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_review);        mDb = AppDatabase.getInstance(getApplicationContext());        reviews = new ArrayList<Review>();        favouriteReviews = new ArrayList<DataObject>();        reviewList = findViewById(R.id.review_list);        LinearLayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());        reviewList.setLayoutManager(layoutManager);        reviewList.setHasFixedSize(true);        int switcher = getIntent().getIntExtra("switch", 1);        Intent intent = getIntent();        if (intent == null) {            finish();        }        Log.i("this", "swithcer " + switcher);        Log.i("this loader", "Loader " + loaderSwitch);        if (switcher == 3){            DataObject dataObject = (DataObject) getIntent().getParcelableExtra("ArrayOfReviews");            if (dataObject != null){                ArrayList<Review> movieReviews = dataObject.getMovieReviews();                Toast.makeText(this, "There are reviews saved", Toast.LENGTH_LONG).show();                revAdapter = new ReviewAdapter(this, movieReviews );                reviewList.setAdapter(revAdapter);            }        } else         {            movId = getIntent().getIntExtra("id", 20);            revAdapter = new ReviewAdapter(this, reviews);            reviewList.setAdapter(revAdapter);            loadReviews();            //populateReview();        }        DividerItemDecoration decoration = new DividerItemDecoration(this, VERTICAL);        reviewList.addItemDecoration(decoration);    }    @Override    protected void onStart() {        super.onStart();        //loadReviews();    }    public static URL buildUrl3(String stringUrl) {        Uri uri = Uri.parse(THE_MOVIEDB_URL3).buildUpon()                .appendPath(stringUrl)                .appendPath(SEARCH_QUERY3)                .appendQueryParameter(MOVIE_QUERY3, API_KEY3)                .build();        URL url = null;        try {            url = new URL(uri.toString());        } catch (MalformedURLException exception) {            Log.e(TAG, "Error creating URL", exception);        }        return url;    }    public void loadReviews(){        // COMPLETED (19) Create a bundle called queryBundle        Bundle queryBundle = new Bundle();        // COMPLETED (20) Use putString with SEARCH_QUERY_URL_EXTRA as the key and the String value of the URL as the value//        queryBundle.putString(SEARCH_QUERY_URL_EXTRA, url.toString());        // COMPLETED (21) Call getSupportLoaderManager and store it in a LoaderManager variable        LoaderManager loaderManager = getSupportLoaderManager();        // COMPLETED (22) Get our Loader by calling getLoader and passing the ID we specified        Loader<ArrayList<Review>> movieReviews = loaderManager.getLoader(REVIEW_SEARCH_LOADER);        // COMPLETED (23) If the Loader was null, initialize it. Else, restart it.        if (movieReviews == null) {            loaderManager.initLoader(REVIEW_SEARCH_LOADER, queryBundle, this);        } else {            loaderManager.restartLoader(REVIEW_SEARCH_LOADER, queryBundle, this);        }    }    @Override    public Loader<ArrayList<Review>> onCreateLoader(int id, Bundle args) {        return new AsyncTaskLoader<ArrayList<Review>>(this) {            @Override            protected void onStartLoading() {                super.onStartLoading();                forceLoad();            }            @Override            public ArrayList<Review> loadInBackground() {                String g = String.valueOf(movId);                // Create URL object                URL url = buildUrl3(g);                // Perform HTTP request on the URL and receive a JSON response back                String jsonResponse = "";                try {                    jsonResponse = getResponseFromHttpUrl(url);                } catch (Exception e) {                    e.printStackTrace();                }                reviews = MovieJsonUtils.parseReview(jsonResponse);                return reviews;            }        };    }    @Override    public void onLoadFinished(Loader<ArrayList<Review>> loader, ArrayList<Review> dat) {        if (reviews != null) {            Intent intent = getIntent();            if (intent != null && intent.hasExtra(EXTRA_DATA_ID)) {                //mButton.setText(R.string.update_button);                if (mTaskId == DEFAULT_TASK_ID) {                    mTaskId = intent.getIntExtra(EXTRA_DATA_ID, DEFAULT_TASK_ID);                    AppExecutors.getInstance().diskIO().execute(new Runnable() {                        @Override                        public void run() {                            data.setMovieReviews(reviews);                            mDb.dataDao().updateData(data);                            //mDb.dataDao().insertData(data);                            final List<DataObject> task = mDb.dataDao().loadById(mTaskId);                            runOnUiThread(new Runnable() {                                @Override                                public void run() {                                    populateUI(task);                                }                            });                        }                    });                }            } else {                ReviewAdapter lv = new ReviewAdapter(ReviewActivity.this, reviews);                reviewList.setAdapter(lv);            }        }    }    @Override    public void onLoaderReset(Loader<ArrayList<Review>> loader) {    }

从MainActivity加载数据,保存的数据通过意图作为可拆分捆绑传递给其他活动,传递的数据显示在DetailActivity中,而不显示在ReviewActivity中。

或者,如果我可以从DetailActivity加载评论以及YouTube密钥,我相信我可以从那里处理数据库问题,但是两个加载器不能一起工作,应用程序崩溃;我知道两个AsyncTask同时运行可以解决此问题,但是由于配置更改的性能,我更喜欢使用Loaders

0 个答案:

没有答案