исключение нулевого указателя с базой данных ROOM - PullRequest
0 голосов
/ 08 октября 2019

Я занимаюсь разработкой приложения для Android с использованием android studio. У моего приложения есть база данных 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)

Ответы [ 3 ]

3 голосов
/ 08 октября 2019

Ваш 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);
0 голосов
/ 08 октября 2019

Вы получаете это, потому что вы не передаете никакого контекста в базу данных CartDatabase. Вы можете просто добавить параметр контекста в ваш метод getInstance, например ...

public static CartDatabase getInstance(Context context) {
if (instance == null) {
    instance = Room.databaseBuilder(context, CartDatabase.class, "Cart").allowMainThreadQueries().build();
}
return instance;

}

А затем вам нужно вызывать подобные действия ...

CartDatabase.getInstance(getApplicationContext()).cartDAO().insertToCart(cart);
0 голосов
/ 08 октября 2019

Добавьте конструктор и передайте ему контекст из действия:

В своем действии:

CartDatabase cart = new CartDatabase(this);

и в классе CartDatabase:

   public CartDatabase(Context             context){
    this.context=context;
     }

илипередать контекст в класс, используя getInstance из вашей деятельности:

CartDatabase.getInstanse(this).cartDAO().insertToCart( cart);

и в классе CartDatabase:

public static CartDatabase getInstance(Context context) ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...