Android应用导入MySQL脚本后无法读取数据库求助
Android导入MySQL脚本到SQLite失败的问题排查与解决
兄弟,你这问题的核心误区太典型了——你把MySQL的SQL文本脚本当成了SQLite的数据库文件来复制!SQL脚本是一堆创建表、插入数据的文本指令,不是现成的可直接读取的SQLite数据库文件,所以你复制过去后,SQLite根本认不出这个文件,自然读不到数据;又因为文件确实复制成功了(只是格式不对),所以没抛出异常,才会出现「没报错但拿不到数据」的诡异情况。
下面给你一步步解决的方案:
第一步:把MySQL脚本转换成真正的SQLite数据库文件
MySQL和SQLite的SQL语法有不少差异,直接用MySQL脚本在SQLite里执行会报错,得先处理脚本再生成.db文件:
- 打开你的
mydb.sql脚本,把MySQL特有的语法改成SQLite兼容的:- 把
AUTO_INCREMENT替换成AUTOINCREMENT(注意SQLite里只有主键是INTEGER类型时才能用) - 把MySQL的
INT(11)这类带长度的整数类型改成INTEGER - 函数差异:比如
NOW()改成datetime('now'),部分聚合函数需要调整 - 去掉MySQL里的
ENGINE=InnoDB这类存储引擎声明,SQLite不需要
- 把
- 用可视化工具(比如免费好用的DB Browser for SQLite)创建一个新的SQLite数据库,执行修改后的脚本,生成一个
mydb.db文件
第二步:修改你的DataBaseHelper代码适配正确的数据库文件
把生成的mydb.db放到res/raw文件夹,然后修改代码里的几个关键地方:
1. 修正数据库文件名和路径获取
不要硬编码路径,用系统提供的方法获取应用私有数据库目录,避免不同设备路径不一致:
private static String DB_NAME = "mydb.db"; // 改成.db后缀的文件名 // 安全获取数据库路径 private String getDBPath() { return myContext.getDatabasePath(DB_NAME).getPath(); }
2. 优化数据库存在性检查
原来的检查方法靠捕获异常判断,不如直接检查文件是否存在更可靠:
private boolean checkDataBase(){ File dbFile = new File(getDBPath()); return dbFile.exists() && dbFile.length() > 0; // 还要确保文件不是空的 }
3. 修正复制数据库的逻辑
确保读取的是raw里的.db文件,同时保证父目录存在:
private void copyDataBase() throws IOException{ InputStream myInput = myContext.getResources().openRawResource(R.raw.mydb); // 这里的mydb是你放入raw的.db文件 String outFileName = getDBPath(); // 确保数据库父目录存在,避免创建文件失败 File parentDir = new File(outFileName).getParentFile(); if (!parentDir.exists()) { parentDir.mkdirs(); } 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(); }
4. 修正openDataBase方法
用优化后的路径获取方式:
public void openDataBase() throws SQLException { myDataBase = SQLiteDatabase.openDatabase(getDBPath(), null, SQLiteDatabase.OPEN_READWRITE); // 如果需要写入权限用OPEN_READWRITE,只读用OPEN_READONLY }
最后几个注意点
- 测试前先卸载旧应用,避免之前复制的错误.sql文件残留
- 如果你的数据库需要版本升级,记得重写
onUpgrade方法,避免覆盖用户数据 - 转换后的SQLite数据库,先用DB Browser测试一下,确保里面的数据和表结构正确
内容的提问来源于stack exchange,提问作者Ruben Manzano
相关产品推荐
相关产品推荐

