You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android真机SQLite数据库表找不到求助(模拟器运行正常)

问题:Android SQLite应用模拟器正常,小米NOTE 8真机提示第一张表不存在

我开发的一款使用SQLite存储数据的Android应用,在模拟器上运行完全正常,但在小米NOTE 8真机测试时,运行时提示读取的第一张表找不到。

已完成的排查:

  • 已授予应用所有相关权限
  • 数据库文件已保存至设备的应用目录(复制代码如下)
  • 确认数据库文件名和表名均无错误

从assets复制数据库到应用目录的代码

try {
    InputStream inputStream = context.getAssets().open(AppDataBase.db_NAME);
    String outfile = context.getDatabasePath(AppDataBase.db_NAME).getPath();
    OutputStream outputStream = new FileOutputStream(outfile);
    byte[] buft = new byte[1024];
    int length = 0;
    while ((length = inputStream.read(buft)) > 0) {
        outputStream.write(buft, 0, length);
    }
    outputStream.flush();
    outputStream.close();
    return true;
} catch (Exception e) {
    return false;
}

查询表的报错代码

@SuppressLint("Range")
public List<Articles_of_Article_Screen> getAllArtigos(){

    openDataBase();

    String SQL = "SELECT * FROM artigos ORDER by id";
    List<Articles_of_Article_Screen> list = new ArrayList<>();

    cursor = db.rawQuery(SQL,null);

    Articles_of_Article_Screen obj;

    if(cursor.moveToFirst()){

        do{
            obj = new Articles_of_Article_Screen(
                    cursor.getString(cursor.getColumnIndex("titulo")),
                    cursor.getString(cursor.getColumnIndex("previa")));

            list.add(obj);
        }while (cursor.moveToNext());

    }

    closeDataBase();

    return list;

}

修复建议

  • 排查数据库复制完整性
    复制代码的catch块仅返回false,未输出异常信息,建议添加e.printStackTrace(),查看复制过程中是否有隐藏错误;同时可通过new File(outfile).length()对比assets中数据库的大小,确认文件是否复制完整。

  • 校验SQLite版本兼容性
    确保assets中的数据库是用与小米NOTE 8系统兼容的SQLite版本创建的,部分高版本SQLite生成的数据库可能在低版本Android设备上无法识别表结构。可用SQLiteStudio等工具打开数据库,确认artigos表确实存在且结构正确。

  • 调整数据库路径与打开逻辑
    小米设备可能存在特殊的文件路径处理,尝试手动拼接数据库路径:context.getFilesDir().getParent() + "/databases/" + AppDataBase.db_NAME,替代getDatabasePath的返回值;同时建议通过SQLiteOpenHelper管理数据库,在onCreate中完成复制,避免重复复制导致文件损坏。

  • 检查表名大小写一致性
    部分设备的SQLite对表名大小写敏感,确保SQL语句中的artigos与数据库中的表名大小写完全一致。

  • 添加异常捕获与日志
    在查询代码中捕获SQLiteException并打印详细错误信息,比如:

    try {
        cursor = db.rawQuery(SQL,null);
        // 后续逻辑
    } catch (SQLiteException e) {
        e.printStackTrace();
        Log.e("DB_ERROR", "查询失败: " + e.getMessage());
    }
    

    通过日志明确错误根源,确认是表不存在、数据库未正确打开还是其他权限问题。

内容的提问来源于stack exchange,提问作者Cristian Nascimento Maurício

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:00:25