我正在使用SQLite
数据库来获取产品名称,数量和价格,但是当我按下add_to_cart按钮时,它会强行关闭。
This is what my debugger says, how to debug this
public void addToCart(Order order){
SQLiteDatabase db = getReadableDatabase();
String query = String.format("INSERT INTO OrderDetail(Productid,ProductName,Quantity,Price) VALUES('%s','%s','%s','%s');",
order.getProductid(),
order.getProductName(),
order.getQuantity(),
order.getPrice());
db.execSQL(query);
}
btncart = (FloatingActionButton)findViewById(R.id.btncart);
btncart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//line 49//
new Database(FoodDetails.this).addToCart(new Order(
foodId,
currentFood.getName(),
numberButton.getNumber(),
currentFood.getPrice()
));
Toast.makeText(FoodDetails.this,"Added to cart",Toast.LENGTH_SHORT).show();
}
});
这是给定的StackTrace
:
at com.k.menu.Database.Database.addToCart(Database.java:54) 在com.k.menu.FoodDetails $ 1.onClick(FoodDetails.java:49)这两个是 我从logcat获得的错误
1-19 19:43:14.767 9304-9304/com.k.menu E/AndroidRuntime: FATAL EXCEPTION: main Process: com.k.menu, PID: 9304 com.readystatesoftware.sqliteasset.SQLiteAssetHelper$SQLiteAssetException: Missing databases/eatitDb.db file (or .zip, .gz archive) in assets, or target folder not writable at android.content.res.AssetManager.openAsset(Native Method) at android.content.res.AssetManager.open(AssetManager.java:347) at android.content.res.AssetManager.open(AssetManager.java:321) at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.copyDatabaseFromAssets(SQLiteAssetHelper.java:436) at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.createOrOpenDatabase(SQLiteAssetHelper.java:400) at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getWritableDatabase(SQLiteAssetHelper.java:176) at com.k.menu.Database.Database.addToCart(Database.java:54) at com.k.menu.FoodDetails$1.onClick(FoodDetails.java:49) at android.view.View.performClick(View.java:5637) at android.view.View$PerformClick.run(View.java:22429) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6119) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
以下链接包含我的应用程序数据库和食物详细信息https://www.dropbox.com/sh/j2j4umz5wv2o7t4/AACIExIYT24SjiYlxbZ0Ut24a?dl=0
答案 0 :(得分:2)
SQLiteAssetException: 缺少资产中的databases / eatitDb.db文件(或.zip,.gz存档),或 目标文件夹不可写
指的是文件 eatitDb.db 不在 assets / databases 目录中,或者由于某种原因目标文件夹不可写。
所以1)检查复制到assets / databases文件中的文件是否名为eatitDb.db。如果不是将其复制到该位置,请清除应用程序的数据或卸载应用程序(可能不需要),然后重新运行应用程序。
2)如果文件已找到,则确保将其复制到可写入的某个位置(如果不是,则无法复制)并且您不会更改文件的权限。< / p>
getReadableDatabase
将getReadableDatabase
更改为getWriteableDatabase
无法解决问题。因为getReadableDatabase
将获得可写的数据库,如果它可以:按照: -
创建和/或打开数据库。这将是getWritableDatabase()返回的相同对象,除非出现一些问题,例如完整 磁盘,要求数据库以只读方式打开。在那种情况下,a 将返回只读数据库对象。如果问题得到解决,a 将来调用getWritableDatabase()可能会成功,在这种情况下 将关闭只读数据库对象和读/写对象 将来会被退回。
答案 1 :(得分:0)
尝试使用getWritableDatabase而不是getReadableDatabase。
答案 2 :(得分:0)
检查您的应用程序文件结构,查看database.db文件是否放置在正确的目录中。
在哪里放置数据库文件?
将您的db文件放在/src/main/assets/databases/your_db_file.db中(此文件的扩展名必须为.db或.zip)
答案 3 :(得分:0)
请将文件夹名称从数据库更改为数据库