将Arraylist的每个项目添加到Room DB

时间:2019-01-15 14:22:46

标签: android arraylist android-room

我正在制作一个食谱应用程序,在其中我可以从使用JSON的网站获取食谱列表。

我将配方添加到ArrayList中,然后尝试将其添加到数据库中。当我保存应用程序的状态时,总是收到以下消息:我的ArrayList为null,而我将其填充到我的AsyncTask的postExecute中。

这是我的代码

公共类MainActivity扩展了AppCompatActivity的LifecycleOwner {

private static final String LOG_TAG = MainActivity.class.getSimpleName();
private ArrayList<Recipe> mRecipes;
private AppDatabase mDb;
private Recipe recipe;
private boolean isAlreadyInDB;

private static final String RECIPE_LIST = "instanceRecipeList";

@Override
protected void onSaveInstanceState(Bundle outState) {
    if (mRecipes != null) {
        outState.putParcelableArrayList(RECIPE_LIST, mRecipes);
    }
    super.onSaveInstanceState(outState);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState != null && savedInstanceState.containsKey(RECIPE_LIST)) {
        mRecipes = savedInstanceState.getParcelableArrayList(RECIPE_LIST);
        Log.d(LOG_TAG, "mymessage mRecipes are " + mRecipes);
        setFragment();
    }
    Log.d(LOG_TAG, "mymessage mRecipes are " + mRecipes);
    mDb = AppDatabase.getInstance(getApplicationContext());

    if (mRecipes != null) {
        setFragment();
    } else {
        GetRecipes getRecipes = new GetRecipes();
        getRecipes.execute();
    }
}

private void setFragment() {
    RecipeListFragment recipeListFragment = new RecipeListFragment();
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction()
            .add(R.id.placeholder, recipeListFragment)
            .commit();
    Log.d(LOG_TAG, "mymessage fragment set");
}


private class GetRecipes extends AsyncTask<URL, Void, String> {

    @Override
    protected String doInBackground(URL... urls) {
        URL searchRecipeObjectUrl = NetworkUtils.createUrl();
        String jsonString = "";
        try {
            jsonString = NetworkUtils.makeHttpRequest(searchRecipeObjectUrl);
        } catch (IOException e) {
            Log.e(LOG_TAG, "mymessage Problem making the HTTP request.", e);
        }
        return jsonString;
    }

    @Override
    protected void onPostExecute(String jsonString) {
        mRecipes = JsonUtils.extractFeatureFromJson(jsonString);
        Log.d(LOG_TAG, "mymessage mRecipes onPostExecute " + mRecipes);

        AppExecutors.getInstance().diskIO().execute(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < mRecipes.size(); i++) {
                    recipe = mRecipes.get(i);
                    String recipeName = recipe.getRecipeName();
                    if (!isRecipeInDB(recipeName)) {
                        mDb.recipesDao().insertRecipe(recipe);
                        Log.d(LOG_TAG, "mymessage adding to db " + recipeName);
                        Log.d(LOG_TAG, "mymessage recipes are" + mDb.recipesDao().loadAllRecipes());
                    } else {
                        Log.d(LOG_TAG, "mymessage recipe is already in db " + recipeName);
                    }
                }
            }
        });
    }
}

public boolean isRecipeInDB(String recipeName) {

    LiveData<String> recipeIsInDB = mDb.recipesDao().searchRecipesByName(recipeName);
    recipeIsInDB.observe(this, new Observer<String>() {
        @Override
        public void onChanged(@Nullable String nameChecked) {
            if (nameChecked != null) {
                isAlreadyInDB = true;
            } else if (nameChecked == null) {
                isAlreadyInDB = false;
            }
        }
    });
    return isAlreadyInDB;
}

}

我希望添加一个显示数据库数据的片段,但是它始终为空并且不会显示任何内容,因为ArrayList始终为null。 不用介意所有这些日志记录,我正在尝试调试。

0 个答案:

没有答案