如何修复“ java.util.ArrayList无法转换为”

时间:2019-04-23 21:23:06

标签: android

我无法将数据从改造传输到房间。我从API下载数据,但是当我尝试在会议室数据库中获取数据时,收到错误消息:

  

“由以下原因引起:java.lang.ClassCastException:java.util.ArrayList无法   强制转换为”。

调试显示

中的错误
 newsDao.insert((News) news);

AND

.subscribe(new Consumer<List<News>>()

这是我的代码。

import android.arch.persistence.room.Room;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import java.util.List;
import burtsev.a.k.news.Model.News;
import burtsev.a.k.news.Retrofit.NewsAPI;
import burtsev.a.k.news.Retrofit.RetrofitClient;
import burtsev.a.k.news.Room.NewsDao;
import burtsev.a.k.news.Room.NewsDatabase;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
import retrofit2.Retrofit;

public class Splash extends AppCompatActivity {
    public static Splash instance;
    public NewsDatabase newsDatabase;

    NewsAPI newsAPI;
    CompositeDisposable compositeDisposable = new CompositeDisposable();
    NewsDao newsDao;

    public static Splash getInstance() {
        return instance;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);
        newsDatabase = Room.databaseBuilder(getApplicationContext(),
                NewsDatabase.class, "database")
                .allowMainThreadQueries()
                .build();
        newsDao = newsDatabase.newsDao();
        Retrofit retrofit = RetrofitClient.getInstance();
        newsAPI = retrofit.create(NewsAPI.class);
        fetchData();

    }

    private void fetchData() {
        compositeDisposable.add(newsAPI.getNews().subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<List<News>>() {
                    @Override
                    public void accept(List<News> news) throws Exception {

                        Intent intent = new Intent(Splash.this, NewsListFragment.class);
                        // intent.putExtra("news", (Serializable) news);
                        newsDao.insert((News) news);
                        startActivity(intent);


                    }
                }));
    }

    @Override
    protected void onStop() {
        compositeDisposable.clear();
        super.onStop();
    }

    public NewsDatabase getNewsDatabase() {
        return newsDatabase;
    }


}

1 个答案:

答案 0 :(得分:0)

您正在尝试插入列表,但是您正在尝试将其强制转换为对象。

所以news不是News模型。它是List<News>。如果要插入所有新闻对象。您可以尝试foreach,也可以在DAO内创建一个新函数,该函数将立即插入所有列表。

foreach;

for(News anews: news){
    newsDao.insert(anews);
}

一次插入。 DAO类中的新功能应该是;

@Insert(onConflict = OnConflictStrategy.REPLACE) 
void insertAllNews(List<News> news); 

您需要使用subscibe

newsDao.insertAllNews(news);