微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我有.db sqlite数据库文件存储在assets文件夹中.我正在将它们导入android的数据库空间,它工作正常,直到Android P.在android P中我得到这个异常:sqlite:没有这样的表错误

在这里搜索并找到了这个,我试着应用接受的答案:
Android P – ‘SQLite: No Such Table Error’ after copying database from assets

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

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

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

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

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();
    }
}

我的DBHelper类:

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();
    }
}

解决方法:

Arg最终解决了它添加this.close();在this.getReadableDatabase()之后;

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

所以我使用了Util.getDatabasePath(DB_NAME);而不是Android P – ‘SQLite: No Such Table Error’ after copying database from assets中复杂的提议解决方案,现在代码更简单

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

现在代码更简单了:

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();
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐