Java 如何从不同的片段访问房间数据库?

Java 如何从不同的片段访问房间数据库?,java,android,database,android-room,Java,Android,Database,Android Room,在我的应用程序中,我有一个TabLayout,每个选项卡都由一个片段表示。我在数据库中有几个表。对于每个表,我希望有一个选项卡,可以显示表的内容列表。要访问数据库,我需要在上下文中传递,但它只能从MainActivity中访问。如何从每个片段访问数据库实例 下面是一些代码: ElectronicsDatabase.java @Database(entities = {Smartphone.class, Tablet.class, Laptop.class, VideoGameCo

在我的应用程序中,我有一个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());
Context appContext= getApplicationContext(); 

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


但是我建议你使用它来访问你的数据库

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

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

db = ElectronicsDatabase
                .getInstance(getApplicationContext());
Context appContext= getApplicationContext(); 
然后将它存储在一个Repo类中,这样您就可以在任何时候、任何地方再次使用它,而不用担心它

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

 getContext() Or getActivity().
我不想详细介绍上下文,但是

如果您想进一步了解什么是真正的上下文,可以从这里开始:

试着像
db=ElectronicsDatabase.getInstance(getContext())从您的片段以及如何从自定义ArrayAdapter类访问此数据库?不建议在适配器中使用访问数据库、使用viewModel并将数据传递给适配器。由于提到了viewModels,我最喜欢您的回答。我只是想知道,您的意思是将房间数据库实例存储在viewModel中并在片段之间访问它,还是viewModels在访问数据库时还有其他用途?谢谢。要获得更多详细信息来回答您的问题,请查看以下代码实验室: