SQLite:没有这样的表错误Android P问题

问题描述 投票:5回答:4

直到Android P一切都运行良好我的代码,但现在在Android P我在使用数据库时遇到了很多问题。

我有.db sqlite数据库文件存储在assets文件夹中。我正在将它们导入到android的数据库空间中,并且它工作正常,直到Android P.在android P中我得到了这个例外:SQLite: No Such Table Error

我在这里搜索并找到了这个,我试图应用接受的答案:qazxsw poi

问题是,现在我遇到了另一个问题,但仍然无效。现在我遇到的问题是,每当我尝试检查数据库是否已存在时,此代码始终返回true,因此我从不创建数据库。即使最近安装了应用程序,即使未创建数据库,也是如此:

Android P - 'SQLite: No Such Table Error' after copying database from assets

我的源代码是之前引用的stackoverflow问题中接受的答案的源代码。

新的Android P需要获取数据库路径的方法:

private boolean checkIfDBExists() {
    File dbFile = new File(DB_COMPLETE_PATH);
    return dbFile.exists();
}

我的DBHelper类:

public static String getDatabasePath(String fileNname){
    MySQLiteOpenHelper helper = new MySQLiteOpenHelper(ApplicationContextProvider.getContext(), fileNname);
    SQLiteDatabase database = helper.getReadableDatabase();
    String path = database.getPath();
    database.close();
    return path;
}

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    public MySQLiteOpenHelper(Context context, String databaseName) {
        super(context, databaseName, null, 2);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
        db.disableWriteAheadLogging();
    }
}
android sqlite android-sqlite android-database android-9.0-pie
4个回答
9
投票

Arg最终解决了它在public class DbHelper extends SQLiteOpenHelper{ private String DB_NAME; private String DB_COMPLETE_PATH; private SQLiteDatabase mDataBase; private static final int DATABASE_VERSION = 1; public DbHelper(String name) throws IOException { super(ApplicationContextProvider.getContext(), name+".db", null, DATABASE_VERSION); this.DB_NAME = name+".db"; this.DB_COMPLETE_PATH = Util.getDatabasePath(DB_NAME); boolean mustOverWriteDB; if (checkIfDBExists()==false) { createDataBase(); } openDataBase(); } private void createDataBase() throws IOException { this.getReadableDatabase(); try { copyDataBase(); } catch (IOException e) { throw new RuntimeException(e); } } public void copyDataBase() throws IOException { InputStream myInput = App.getInstance().getAssetsFile(DB_NAME); String outFileName = DB_COMPLETE_PATH; OutputStream myOutput = new FileOutputStream(outFileName); byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } myOutput.flush(); myOutput.close(); myInput.close(); } } 之后加入this.close();

那个打开的连接正在生成原始的没有这样的表异常

所以我使用了Util.getDatabasePath(DB_NAME);而不是this.getReadableDatabase();中复杂的提议解决方案,现在代码更简单

非常感谢@LifeStyle,感谢他,我找到了真正的问题

现在代码更简单了:

Android P - 'SQLite: No Such Table Error' after copying database from assets

1
投票

在DBHelper类中,在测试方法Util.getDatabasePath(DB_NAME)中是否存在if DB之前,您正在创建数据库。这行创建了DB

public static String getDatabasePath(String fileNname){
    return ApplicationContextProvider.getContext().getDatabasePath(fileNname).getAbsolutePath();
}

public class DbHelper extends SQLiteOpenHelper{
    private String DB_NAME;
    private String DB_COMPLETE_PATH;
    private SQLiteDatabase mDataBase;
    private static final int DATABASE_VERSION = 1;

    public DbHelper(String name) throws IOException {
        super(ApplicationContextProvider.getContext(), name+".db", null, DATABASE_VERSION);
        this.DB_NAME = name+".db";
        this.DB_COMPLETE_PATH = Util.getDatabasePath(DB_NAME);

        if (checkIfDBExists()==false){
            createDataBase();
        }

        openDataBase();
    }

    private void createDataBase() throws IOException {
        this.getReadableDatabase();
        this.close();
        try {           
            copyDataBase();            
        } catch (IOException e) {           
            throw new RuntimeException(e);
        }
    }

    private boolean checkIfDBExists() {
        File dbFile = new File(DB_COMPLETE_PATH);
        return dbFile.exists();
    }
}

通过调用此方法您可以使用sql open helper创建数据库(在您的情况下为空,因为在OnCreate()方法中没有任何反应)。

如果要将数据库存储在默认应用程序的数据库路径中,则可以通过下一个代码段检查数据库是否存在:

this.DB_COMPLETE_PATH = Util.getDatabasePath(DB_NAME);

而禁用WAL的更好的地方是SQLiteOpenHelper中的onConfigure()方法


0
投票

添加此路径您的数据库

File f = context.getDatabasePath("my_database.db");
if(f.exists()) {
   //Your code if DB exist
} else {
   //Your code if DB doesn't exist
}

-1
投票

通过在String dbPath = "/data/data/" + mContext.getPackageName() + "/cache/" + mDataBaseName; 之后添加this.close();,我解决了Android P的问题

© www.soinside.com 2019 - 2024. All rights reserved.