【问题标题】:How to access Room database from different fragments?如何从不同的片段访问 Room 数据库?
【发布时间】:2020-01-12 09:07:44
【问题描述】:

在我的应用程序中,我有一个 TabLayout,每个选项卡都由一个片段表示。我在数据库中有几个表。对于每个表,我想要一个显示表内容列表的选项卡。要访问数据库,我需要传入一个上下文,但它只能从 MainActivity 中获得。如何从每个分片访问一个数据库实例?

这里有一些代码: ElectronicsDatabase.java

@Database(entities = {Smartphone.class, Tablet.class,
        Laptop.class, VideoGameConsole.class}, version = 1)
public abstract class ElectronicsDatabase extends RoomDatabase {

    public abstract SmartphoneDao getSmartphoneDao();
    public abstract TabletDao getTabletDao();
    public abstract LaptopDao getLaptopDao();
    public abstract VideoGameConsoleDao getVideoGameConsoleDao();

    private static final String DB_NAME = "products.db";

    private static ElectronicsDatabase db;

    public static ElectronicsDatabase getInstance(Context context)
    {
        if (db == null)
        {
            db =buildDatabaseInstance(context);
        }
        return db;
    }

    private static ElectronicsDatabase buildDatabaseInstance(Context context)
    {
        return Room.databaseBuilder(context, ElectronicsDatabase.class,
                DB_NAME).allowMainThreadQueries().build();
    }
}

在主要活动中,我像这样访问它:

db = ElectronicsDatabase
                .getInstance(getApplicationContext());

【问题讨论】:

  • 从你的片段中尝试db = ElectronicsDatabase.getInstance(getContext());
  • 还有如何从自定义的 ArrayAdapter 类访问这个数据库?
  • 不建议在适配器中使用访问数据库,使用 viewModel 并将数据传递给适配器。

标签: java android database android-room


【解决方案1】:

在您的片段中,您可以使用getActivity() 来访问您的父活动的上下文。

但我建议您使用viewModel 访问您的数据库。

【讨论】:

  • 我最喜欢你的回答,因为我提到了 viewModels。我只是想知道,您的意思是您将 Room Database 实例存储在 viewModel 中并在片段之间访问它,还是 viewModel 在数据库访问方面还有其他用途?
  • 谢谢。要获得更多详细信息来回答您的问题,请查看此代码实验室:codelabs.developers.google.com/codelabs/…
【解决方案2】:

尝试使用 ViewModel 在任何 Activity 或 Fragment 中访问数据库

ViewModel 是一个类,负责为 UI 组件(活动或片段)准备和管理数据

【讨论】:

    【解决方案3】:

    在您需要通过 Room 访问数据库的上下文的情况下,最好传递 非 UI 上下文,以避免无缘无故传递不必要的信息导致 可能的内存泄漏

    您可以从您的基本活动或您的主要活动中访问将称为 ApplicationContext 的非 UI 上下文。就像这样:

    Context appContext= getApplicationContext(); 
    

    然后将其存储在 Repo 类中,这样您就可以随时随地轻松使用它,无需担心。

    但是,如果您需要一个与在屏幕上绘图相关的上下文,例如膨胀 XML,那么在这种情况下,您将需要一个 UI 上下文,以免丢失 UI 细节,例如您的主题。在这种情况下,您可以使用以下方法从片段内部获取上下文:

     getContext() Or getActivity().
    

    我不会详细介绍上下文,但是,

    如果您想了解更多关于 Context 的真正含义,您可以从这里开始: https://medium.freecodecamp.org/mastering-android-context-7055c8478a22

    【讨论】:

      猜你喜欢
      • 2014-06-02
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多