Java 如何从不同的片段访问房间数据库?
在我的应用程序中,我有一个TabLayout,每个选项卡都由一个片段表示。我在数据库中有几个表。对于每个表,我希望有一个选项卡,可以显示表的内容列表。要访问数据库,我需要在上下文中传递,但它只能从MainActivity中访问。如何从每个片段访问数据库实例 下面是一些代码: ElectronicsDatabase.javaJava 如何从不同的片段访问房间数据库?,java,android,database,android-room,Java,Android,Database,Android Room,在我的应用程序中,我有一个TabLayout,每个选项卡都由一个片段表示。我在数据库中有几个表。对于每个表,我希望有一个选项卡,可以显示表的内容列表。要访问数据库,我需要在上下文中传递,但它只能从MainActivity中访问。如何从每个片段访问数据库实例 下面是一些代码: ElectronicsDatabase.java @Database(entities = {Smartphone.class, Tablet.class, Laptop.class, VideoGameCo
@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在访问数据库时还有其他用途?谢谢。要获得更多详细信息来回答您的问题,请查看以下代码实验室: