如何使用Room创建数据库的新实例?

时间:2019-07-15 10:22:31

标签: java android database android-room

我的应用类似于食谱应用。我想创建一个配方列表,当用户打开应用程序时可以看到该列表,可以单击该列表,并且在单击新列表时创建该列表,其中显示了制作配方的步骤。

我正在使用Room Persistence库执行此操作,并且该应用程序在“看到食谱列表”之前运行良好,可以单击这些食谱。当前,当单击某个食谱时,所有发生的事情是再次将用户重定向到原始食谱列表(即他们已经在进行的活动)。如何创建新的数据库实例,当用户单击配方时可以用配方成分填充该数据库?

我不确定我想要什么正确的措词-我需要数据库的新实例吗?我需要在Room数据库中添加第二个实体吗?我是否需要为“食谱中的步骤”制作第二个DAO和ViewModel?

adapter.setOnRecipeClickListener(new RecipeAdapter.OnRecipeClickListener() {
    @Override
    public void onRecipeClick(Recipe recipe) {
        Intent intent = new Intent(GroupRecipesActivity.this, 
        SpecificRecipeActivity.class);
        intent.putExtra(AddEditRecipeActivity.EXTRA_RECIPE_ID, 
        recipe.getId());
        intent.putExtra(AddEditRecipeActivity.EXTRA_RECIPE_NAME, 
        recipe.getRecipeName());
        startActivityForResult(intent, SPECIFIC_RECIPE_REQUEST);

这是新的类,我希望在其中有一个“刷新”(新表)数据库,可以在其中添加特定的配方说明:

package com.oscebosskey.obkm6;

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;

import java.util.List;

public class SpecificRecipeActivity extends AppCompatActivity {
    private RecipeViewModel recipeViewModel;

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

        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setHasFixedSize(true);

        final RecipeAdapter adapter = new RecipeAdapter();
        recyclerView.setAdapter(adapter);

        recipeViewModel = 
        ViewModelProviders.of(this).get(RecipeViewModel.class); 
        recipeViewModel.getAllRecipes().observe(this, new 
        Observer<List<Recipe>>() {
            @Override
            public void onChanged(List<Recipe> recipes) {
                adapter.submitList(recipes);
            }
        });
    }
}

我认为此问题是由于对Room数据库的命名法缺乏了解-请原谅这个新手!

1 个答案:

答案 0 :(得分:0)

使用已有的代码,似乎您在尝试添加新配方时试图更新回收站视图。

我认为您的viewModel会执行以下操作:

var allRecipes  : LiveData<List<Recipes>> = repository.getAllRecipes()

存储库所在位置:

class MessagesRepository(private val recipeDAO: recipeDAO) {
   fun getAllRecipes() : LiveData<List<Recipe>> {
       return messagesDAO.getAllRecipes()
   }
}

还有DAO:

@Dao  
interface RecipesDAO {
  @Query("Select * From Recipes")
  fun getAllRecipes() : LiveData<List<Recipes>>
}

在您的RecipeAdapter中:

class RecipeAdapter internal constructor(val context: Context?, recipeList : ArrayList<Recipes>) : RecyclerView.Adapter<ContactsRecyclerAdapter.ContactsViewHolder>() {
    fun setRecipeList(recipeList : List<Recipes>) {
      this.emailListSet = ArrayList(emailListSet)
      notifyDataSetChanged()
    }
}

然后您需要更改为:

 recipeViewModel.getAllRecipes().observe(this, new 
    Observer<List<Recipe>>() {
        @Override
        public void onChanged(List<Recipe> recipes) {
            adapter.setRecipeList(recipes);
            adapter.notifyDatasetChanges();
        }
    });

要更新配方列表,我假设用户将在“回收者”视图中单击某个项目,然后您将显示一个新的片段或活动,使他们可以更新配方。但是,更新配方不会更新您的回收站视图。您将需要观察配方表的内容,然后重新绘制。

您不需要新的DAO,可以使用现有的DAO。不过,很高兴看到您的更多房间实体代码。