android - ROOM 数据库的空指针异常
问题描述
我正在使用 android studio 开发一个 android 应用程序我的应用程序有 ROOM 数据库当我存储在数据库中时出现运行时错误,我无法解决它
这是我的数据库代码
@Database(entities = {Cart.class},version = 1,exportSchema = false)
public abstract class CartDatabase extends RoomDatabase {
private static Context context;
public abstract CartDAO cartDAO();
private static CartDatabase instance;
public static CartDatabase getInstance() {
if (instance == null) {
instance = Room.databaseBuilder(context.getApplicationContext(), CartDatabase.class, "Cart")//if we want in memory builder ithink we can add it here
.allowMainThreadQueries().build();
}
return instance;
}
}
这插入到数据库代码中
addBTn.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
Cart cart=new Cart();
cart.setName( (String) productNameTxt.getText() );
cart.setPrice(Integer.parseInt( (String ) productPriceTxt.getText() ));
CartDatabase.getInstance( ).cartDAO().insertToCart( cart );
Toast.makeText(getActivity(),"Item added successfully",Toast.LENGTH_SHORT).show();
}
} );
这就是错误
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.queueskip, PID: 3544
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
at com.example.queueskip.Database.Local.CartDatabase.getInstance(CartDatabase.java:25)
at com.example.queueskip.ui.home.HomeFragment$2$1$1.onClick(HomeFragment.java:169)
at android.view.View.performClick(View.java:5721)
at android.widget.TextView.performClick(TextView.java:10936)
at android.view.View$PerformClick.run(View.java:22620)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7406)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
解决方案
你是空的,如果你在你的方法中创建一个参数而不是将它存储在你的类中Context
会更好。Context
getInstance()
CartDatabase
试试下面的代码
public static CartDatabase getInstance(Context context) {
if (instance == null) {
instance = Room.databaseBuilder(context, CartDatabase.class, "Cart")//if we want in memory builder ithink we can add it here
.allowMainThreadQueries().build();
}
return instance;
}
然后在你的
onClick()
CartDatabase.getInstance(getApplicationContext()).cartDAO().insertToCart(cart);
推荐阅读
- javascript - 如何在 Three.js 中创建一个弯曲的世界?
- reactjs - 从后端单独和异步加载的项目排序表
- r - 将字符转换为日期格式为 yyyyww
- flutter - Flutter inappwebview 滚动在 NestedScrollView TabBarView 内不起作用
- java - 为什么公共池的并行度与可用处理器的数量不同?
- python - 如何在 Amazon Linux 2 上使用 ansible 修复“无法导入所需的 Python 库(botocore 或 boto3)”?
- flutter - 用手势检测器拖动
- laravel - Laravel Intervention\Image Package 给出错误
- java - 如何在一条线上的四个网格中表示一个玩家
- database - 在 FirebaseRecyclerAdapter 函数上从 firebase 数据库获取数据的错误