首页 > 解决方案 > java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“int android.database.sqlite.SQLiteDatabase.getVersion()”

问题描述

嘿嘿:)

我查看了同一个主题的几个问题,但我没有找到解决问题的方法。我的添加到包的按钮不起作用这里的任何人都知道如何帮助我原因:java.lang.NullPointerException:尝试在空对象上调用虚拟方法'int android.database.sqlite.SQLiteDatabase.getVersion()'在 com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getReadableDatabase(SQLiteAssetHelper.java:254) 在 com.yanistk.tkfood.Database.Database.getCarts(Database. java:26) 在 com.yanistk.tkfood.Cart.loadListFood(Cart.java:102) 在 com.yanistk.tkfood.Cart.onCreate(Cart.java:63)

日志猫:

 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.database.sqlite.SQLiteDatabase.getVersion()' on a null object reference
        at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getWritableDatabase(SQLiteAssetHelper.java:178)
        at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getReadableDatabase(SQLiteAssetHelper.java:254)
        at com.yanistk.tkfood.Database.Database.getCarts(Database.java:26)
        at com.yanistk.tkfood.Cart.loadListFood(Cart.java:102)
        at com.yanistk.tkfood.Cart.onCreate(Cart.java:63)
        at android.app.Activity.performCreate(Activity.java:6662)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6077) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 
2020-06-15 17:16:35.213 1759-1908/system_process E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008cdf
2020-06-15 17:16:35.213 1759-1908/system_process E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008824
2020-06-15 17:16:35.587 2379-14186/com.google.android.gms.persistent E/SQLiteDatabase: Error inserting service_kind=0 source=16 tag=Measurement.PackageMeasurementTaskService.UPLOAD_TASK_TAG target_package=com.google.android.gms requires_charging=0 source_version=200414000 required_network_type=0 flex_time=506000 target_class=com.google.android.gms.measurement.PackageMeasurementTaskService runtime=1592237795535 retry_strategy={"maximum_backoff_seconds":{"3600":0},"initial_backoff_seconds":{"30":0},"retry_policy":{"0":0}} required_idleness_state=0 period=1014000 last_runtime=0 task_type=0 job_id=-1 user_id=0
    android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: pending_ops.tag, pending_ops.target_class, pending_ops.target_package, pending_ops.user_id (code 2067)
        at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
        at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
        at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
        at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
        at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1474)
        at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1343)
        at aozt.a(:com.google.android.gms@200414022@20.04.14 (040700-294335909):147)
        at aozi.a(:com.google.android.gms@200414022@20.04.14 (040700-294335909):182)
        at aozi.a(:com.google.android.gms@200414022@20.04.14 (040700-294335909):25)
        at aozi.a(:com.google.android.gms@200414022@20.04.14 (040700-294335909):177)
        at aovr.run(:com.google.android.gms@200414022@20.04.14 (040700-294335909):8)
        at srw.b(:com.google.android.gms@200414022@20.04.14 (040700-294335909):14)
        at srw.run(:com.google.android.gms@200414022@20.04.14 (040700-294335909):2)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at sxw.run(:com.google.android.gms@200414022@20.04.14 (040700-294335909):0)
        at java.lang.Thread.run(Thread.java:761)
2020-06-15 17:21:35.235 1759-2314/system_process E/ActivityManager: Found activity ActivityRecord{73a2e8e u0 com.yanistk.tkfood/.MainActivity t74 f} in proc activity list using null instead of expected ProcessRecord{d5573e 16555:com.yanistk.tkfood/u0a80}

数据库

package com.yanistk.tkfood.Database;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;

import com.google.firestore.v1.StructuredQuery;
import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;
import com.yanistk.tkfood.model.Order;

import java.util.ArrayList;
import java.util.List;

public class Database extends SQLiteAssetHelper {
    private static final String DB_NAME="jsonDB.db";
    private static final int DB_VER=1;
    public Context context;

    public Database(Context context) {
        super(context, DB_NAME, null, DB_VER);
        this.context=context;
    }

    public List<Order> getCarts(){
        SQLiteDatabase db=this.getReadableDatabase();
        SQLiteQueryBuilder qb=new SQLiteQueryBuilder();
        String[]sqlSelect={"ProductName","ProductId","Quantity","Price","Discount"};
        String sqlTable="OrderDetail";
        qb.setTables(sqlTable);

        Cursor c=qb.query(db,sqlSelect,null,null,null,null,null);
        final List<Order>result=new ArrayList<>();
        if (c.moveToFirst()){
            do {
                result.add(new Order(c.getString(c.getColumnIndex("ProductId")),
                        c.getString(c.getColumnIndex("ProductName")),
                        c.getString(c.getColumnIndex("Price")),
                        c.getString(c.getColumnIndex("Quantity")),
                        c.getString(c.getColumnIndex("Discount"))
                ));

            }while (c.moveToNext());
        }
        return result;

    }
    public void addToCart(Order order){
        SQLiteDatabase db=this.getReadableDatabase();
        String query=String.format("INSERT OR REPLACE INTO OrderDetail(ProductId,ProductName,Quantity,Price,Discount) VALUES('%s','%s','%s','%s','%s');",
                order.getProductId(),
                order.getProductName(),
                order.getPrice(),
                order.getQuantity(),
                order.getDiscount());
        db.execSQL(query);

    }
    public void cleanCart(){
        SQLiteDatabase db=this.getReadableDatabase();
        String query=String.format("DELETE FROM OrderDetail");
        db.execSQL(query);

    }
}

购物车.java

package com.yanistk.tkfood;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.yanistk.tkfood.Common.Common;
import com.yanistk.tkfood.Database.Database;
import com.yanistk.tkfood.model.Order;
import com.yanistk.tkfood.model.Request;
import com.yanistk.tkfood.viewHolder.CartAdapter;

import java.util.ArrayList;
import java.util.List;

public class Cart extends AppCompatActivity {
    RecyclerView recyclerView;
    RecyclerView.LayoutManager layoutManager;
    FirebaseDatabase database;
    DatabaseReference requests;
    TextView txtTotalPrice;
    Button btnPlace;

    List<Order> cart=new ArrayList<>();
    CartAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cart);
        database=FirebaseDatabase.getInstance();
        requests=database.getReference("Requests");

        //Init
        recyclerView=(RecyclerView)findViewById(R.id.listCart);
        recyclerView.setHasFixedSize(true);
        layoutManager=new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);

        txtTotalPrice=(TextView)findViewById(R.id.total);
        btnPlace=(Button)findViewById(R.id.btnPlace);
        btnPlace.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showAlertDialog();

            }
        });

        loadListFood();
    }

    private void showAlertDialog() {
        AlertDialog.Builder alertDialog=new AlertDialog.Builder(Cart.this);
        alertDialog.setTitle("Un pas de plus");
        alertDialog.setMessage("Entrer votre address(Le lieu de livraion): ");
        final EditText edtAddress=new EditText(Cart.this);
        LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT
        );
        edtAddress.setLayoutParams(lp);
        alertDialog.setView(edtAddress);
        alertDialog.setPositiveButton("Envoyer", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Request request=new Request(
                        Common.currentUser.getName(),
                        Common.currentUser.getPhone(),
                        edtAddress.getText().toString(),
                        txtTotalPrice.getText().toString(),
                        cart
                );
                //submit to firebase
                requests.child(String.valueOf(System.currentTimeMillis()))
                        .setValue(request);

                //delete cart
                new Database(getBaseContext()).cleanCart();
                Toast.makeText(Cart.this, "Merci de passer la commande", Toast.LENGTH_SHORT).show();
                finish();
            }
        });
        alertDialog.show();

    }

    private void loadListFood() {
        cart=new Database(this).getCarts();
        adapter=new CartAdapter(cart,this);
        recyclerView.setAdapter(adapter);

        //calculate total
        int total=0;
        for (Order order:cart){
            total+=(Integer.parseInt(order.getPrice()))*(Integer.parseInt(order.getQuantity()));
            txtTotalPrice.setText(total);
        }
    }
}

标签: javaandroidsqlite

解决方案


推荐阅读