无法使用SQLiteAssetHelper打开数据库

时间:2018-01-20 11:14:53

标签: java android sqlite

我正在使用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

4 个答案:

答案 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()可能会成功,在这种情况下   将关闭只读数据库对象和读/写对象   将来会被退回。

getReadableDatabase

答案 1 :(得分:0)

答案 2 :(得分:0)

检查您的应用程序文件结构,查看database.db文件是否放置在正确的目录中。

在哪里放置数据库文件?

将您的db文件放在/src/main/assets/databases/your_db_file.db中(此文件的扩展名必须为.db或.zip)

答案 3 :(得分:0)

请将文件夹名称从数据库更改为数据库