java - 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);
}
}
}
解决方案
推荐阅读
- go - golang http server 拖尾日志 kubeapi 代理
- python - 如何使用beautifulSoup提取html5元素如
- python - 使用 isalpha() 替换文本中的字符
- html - 需要帮助以 HTML 和 SCSS 显示图像
- sql-server - 查询完成后立即删除临时表
- ruby - Ruby - 当键可能是字符串或进一步的哈希时安全导航哈希
- airflow - 使用 Pub/Sub 消息触发 Cloud Composer DAG
- visual-studio-2019 - Visual Studio 2019 - 发布到文件夹不会发布所有文件
- python - 你如何使用 gcloud 的多 CPU 来加速你的 Python 程序?
- string - 未找到 str 的匹配方法