Java android.database.sqlite.SQLiteCantoPendDatabaseException:未知错误(代码14 sqlite_CANTOPEN):无法打开数据库

Java android.database.sqlite.SQLiteCantoPendDatabaseException:未知错误(代码14 sqlite_CANTOPEN):无法打开数据库,java,database,firebase,sqlite,android-studio,Java,Database,Firebase,Sqlite,Android Studio,我在网站上读到了很多关于这个问题的文章,但我无法理解。我在这一步上陷得太久了。我如何解决这个问题 Logcat输出 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.test123"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> &l

我在网站上读到了很多关于这个问题的文章,但我无法理解。我在这一步上陷得太久了。我如何解决这个问题

Logcat输出

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test123">

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <activity android:name=".Cart"></activity>
    <activity android:name=".FoodDetail" />
    <activity android:name=".FoodList" />
    <activity
        android:name=".Home"
        android:label="@string/title_activity_home"
        android:theme="@style/AppTheme.NoActionBar" />
    <activity android:name=".SignUp" />
    <activity android:name=".SignIn" />
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
根据logcat,这是由SQLiteCantoPendDatabaseException引起的

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test123/com.example.test123.Cart}: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14 SQLITE_CANTOPEN): Could not open database
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3304)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3443)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2040)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:224)
    at android.app.ActivityThread.main(ActivityThread.java:7520)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
 Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14 SQLITE_CANTOPEN): Could not open database
    at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:215)
    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:197)
    at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:505)
    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:206)
    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:198)
    at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:915)
    at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:895)
    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:786)
    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:733)
    at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getReadableDatabase(SQLiteAssetHelper.java:264)
    at Database.Database.getCarts(Database.java:24)
    at com.example.test123.Cart.loadListFood(Cart.java:58)
    at com.example.test123.Cart.onCreate(Cart.java:54)
    at android.app.Activity.performCreate(Activity.java:7894)
    at android.app.Activity.performCreate(Activity.java:7881)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3279)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3443) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2040) 
    at android.os.Handler.dispatchMessage(Handler.java:107) 
    at android.os.Looper.loop(Looper.java:224) 
    at android.app.ActivityThread.main(ActivityThread.java:7520) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) 
Database.java

public class Database extends SQLiteAssetHelper {
private static final String DB_NAME="QODB.db";
private static  final int DB_ver=1;
public Database(Context context) {
    super(context, DB_NAME,null,DB_ver);
}

public List<Order> getCarts()
{
    SQLiteDatabase db = 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("Quantity")),
                    c.getString(c.getColumnIndex("Price")),
                    c.getString(c.getColumnIndex("Discount"))
            ));

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

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

}

public  void  cleanCart(Order order)
{
    SQLiteDatabase db = getReadableDatabase();
    String query = String.format("DELETE FROM orderDetail");
    db.execSQL(query);
}
public class Cart extends AppCompatActivity {

RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager;

FirebaseDatabase database;
DatabaseReference request;
TextView txtTotalPrice;
FButton btnPlace;

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

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cart);

    //Firebase
    database = FirebaseDatabase.getInstance();
    request=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 = (FButton)findViewById(R.id.btnPlaceOrde);

    loadListFood();
}

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

    //Calculate total price
    int total =0;
    for(Order order:cart)
        total+=(Integer.parseInt(order.getPrice()))*(Integer.parseInt(order.getQuantity()));

    Locale locale = new Locale("en","US");
    NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);

    txtTotalPrice.setText(fmt.format(total));
}
公共类数据库扩展SQLiteAssetHelper{
私有静态最终字符串DB_NAME=“QODB.DB”;
专用静态最终整数DB_ver=1;
公共数据库(上下文){
super(上下文、数据库名称、null、数据库版本);
}
公共列表getCarts()
{
SQLiteDatabase db=getReadableDatabase();
SQLiteQueryBuilder qb=新的SQLiteQueryBuilder();
字符串[]sqlSelect={“产品名称”、“产品ID”、“数量”、“价格”、“折扣”};
字符串sqlTable=“OrderDetail”;
qb.可设置表(sqlTable);
游标c=qb.query(db,sqlSelect,null,null,null,null,null);
最终列表结果=新建ArrayList();
if(c.moveToFirst())
{
做{
添加(新订单(c.getString(c.getColumnIndex(“ProductId”)),
c、 getString(c.getColumnIndex(“ProductName”),
c、 getString(c.getColumnIndex(“数量”),
c、 getString(c.getColumnIndex(“价格”)),
c、 getString(c.getColumnIndex(“折扣”))
));
}而(c.moveToNext());
}
返回结果;
}
公共无效addToCart(订单)
{
SQLiteDatabase db=getReadableDatabase();
String query=String.format(“插入到OrderDetail(ProductId、ProductName、数量、价格、折扣)值('%s'、'%s'、'%s'、'%s');”,
order.getProductId(),
order.getProductName(),
order.getQuantity(),
order.getPrice(),
order.get折扣());
execSQL(查询);
}
公共无效清洁车(订单)
{
SQLiteDatabase db=getReadableDatabase();
字符串查询=String.format(“从orderDetail中删除”);
execSQL(查询);
}
Cart.java

public class Database extends SQLiteAssetHelper {
private static final String DB_NAME="QODB.db";
private static  final int DB_ver=1;
public Database(Context context) {
    super(context, DB_NAME,null,DB_ver);
}

public List<Order> getCarts()
{
    SQLiteDatabase db = 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("Quantity")),
                    c.getString(c.getColumnIndex("Price")),
                    c.getString(c.getColumnIndex("Discount"))
            ));

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

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

}

public  void  cleanCart(Order order)
{
    SQLiteDatabase db = getReadableDatabase();
    String query = String.format("DELETE FROM orderDetail");
    db.execSQL(query);
}
public class Cart extends AppCompatActivity {

RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager;

FirebaseDatabase database;
DatabaseReference request;
TextView txtTotalPrice;
FButton btnPlace;

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

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cart);

    //Firebase
    database = FirebaseDatabase.getInstance();
    request=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 = (FButton)findViewById(R.id.btnPlaceOrde);

    loadListFood();
}

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

    //Calculate total price
    int total =0;
    for(Order order:cart)
        total+=(Integer.parseInt(order.getPrice()))*(Integer.parseInt(order.getQuantity()));

    Locale locale = new Locale("en","US");
    NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);

    txtTotalPrice.setText(fmt.format(total));
}
公共类购物车扩展AppCompatActivity{
回收视图回收视图;
RecyclerView.LayoutManager LayoutManager;
Firebase数据库;
数据库参考请求;
TextView txtTotalPrice;
FButton btnPlace;
列表购物车=新的ArrayList();
卡托适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u cart);
//火基
database=FirebaseDatabase.getInstance();
request=database.getReference(“请求”);
//初始化
recyclerView=(recyclerView)findViewById(R.id.listCart);
recyclerView.setHasFixedSize(true);
layoutManager=新的LinearLayoutManager(此);
recyclerView.setLayoutManager(layoutManager);
txtTotalPrice=(TextView)findViewById(R.id.total);
btnPlace=(FButton)findViewById(R.id.btnPlaceOrde);
食物();
}
私人食品{
cart=新数据库(this).getCarts();
适配器=新的购物车适配器(购物车,此);
recyclerView.setAdapter(适配器);
//计算总价
int-total=0;
用于(订单:购物车)
total+=(Integer.parseInt(order.getPrice())*(Integer.parseInt(order.getQuantity());
语言环境=新语言环境(“英语”、“美国”);
NumberFormat fmt=NumberFormat.getCurrencyInstance(语言环境);
txtTotalPrice.setText(fmt.format(total));
}
AndroidManifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test123">

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <activity android:name=".Cart"></activity>
    <activity android:name=".FoodDetail" />
    <activity android:name=".FoodList" />
    <activity
        android:name=".Home"
        android:label="@string/title_activity_home"
        android:theme="@style/AppTheme.NoActionBar" />
    <activity android:name=".SignUp" />
    <activity android:name=".SignIn" />
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Database.Database.getCarts(Database.java:24)上的错误是SQLiteDatabase db=getReadableDatabase()

com.example.test123.Cart.loadListFood(Cart.java:58)中的错误是Cart=new Database(this.getCarts()


com.example.test123.Cart.onCreate(Cart.java:54)为loadListFood();

打开
AndroidManifest.xml
文件,并在清单标记(应该是顶级标记)中添加以下权限



相同错误android.database.sqlite.SQLiteCantOpenDatabaseException:未知错误(代码14 sqlite_CANTOPEN):无法打开数据库尝试从手机卸载应用程序并重新安装。我认为sqlite文件已损坏。尝试过。效率低下,但(database.java:51)SQLiteDatabase db=getReadableDatabase()中出现新错误;这三种方法都添加了这个。getWritableDatabase();我可以知道这个问题的解决方案吗?@M'bossSpondanai