Android:检查文件是否是有效的 SQLite 数据库

标签 android database sqlite

我需要检查一个文件(扩展名未知)是否是一个有效的 SQLite 数据库。 db 文件存储在 sd 卡上。我需要在我的应用程序中导入数据库。但是,如果用户创建了一个与数据库同名且具有任何扩展名的文件,该文件仍会被代码接受,因为它只搜索名称。 有没有一种快速的方法来检查存储在存储卡上的 sqlite 数据库的有效性。 我使用了这段代码,但它仍然接受与 db 同名的任意文件。

String path = Environment.getExternalStorageDirectory().getPath() + "/FOLDER/DB_FILE";

        SQLiteDatabase database;
        database = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
        if (database == null) {
            Toast.makeText(getApplicationContext(), "Error: Incorrect/Corrupted File", Toast.LENGTH_SHORT).show();
            return;
        } else {Proceed with code here}

最佳答案

一个 SQLite 数据库文件包含一个标题,它提供了一些 useful information . 特别是,每个 SQlite 数据库文件的前 16 个字节始终包含以下值:SQLite format 3\0000

因此您可以检查文件的前 16 个字节是否包含该值:

public boolean isValidSQLite(String dbPath) {
    File file = new File(dbPath);

    if (!file.exists() || !file.canRead()) {
        return false;
    }

    try {
        FileReader fr = new FileReader(file);
        char[] buffer = new char[16];

        fr.read(buffer, 0, 16);
        String str = String.valueOf(buffer);
        fr.close();

        return str.equals("SQLite format 3\u0000");

    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

关于Android:检查文件是否是有效的 SQLite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39576646/

相关文章:

android - 如何在带有背景的微调器中设置下拉箭头?

android - cocos2d-x & android 从assets文件夹加载文件

sqlite - 去编程: sqlite_master returns EOF using sqlite3 package

java - 使用 Intent 避免 FAILED BINDER TRANSACTION 错误

android - 如何在android中使用自签名证书注册的https链接?

database - sequelize js多级表级联连接

ruby - 我无法为 Ubuntu 10 安装 sqlite3 gem

ios - 从SQLite提取数据并且只想获取列ID的最后一个值

database - h2 内存表,远程连接

java - Hibernate 按属性获取记录不起作用