Android加载SQLiteStudio导出.db文件报无表/非数据库错误如何解决
错误根因
- 核心错误:你将SQLiteStudio导出的SQL文本脚本(.sql格式)直接修改后缀为.db,
.sql是纯文本的SQL语句文件,并非SQLite的二进制数据库文件,这就是file is not a database报错的直接原因。 - 查询代码逻辑错误:
ExecuteQuery<T>的泛型参数需要填对应数据表的实体类,你填了数据库连接类db,同时你也没有确认数据库拷贝逻辑是否在查询前执行完成,这会导致no such table报错。
修复步骤
步骤1:正确导出SQLite数据库文件
- 打开SQLiteStudio,连接你创建的
dbs数据库,右键数据库选择「导出」,导出格式选择SQLite数据库(不要选SQL脚本格式),导出的文件本身就是.db格式,无需手动修改后缀。 - 将导出的正确
.db文件放入项目Assets文件夹,右键文件选择「属性」,设置「生成操作」为AndroidAsset,「复制到输出目录」为如果较新则复制。
步骤2:修复SecondPage中的查询代码
你的查询代码存在泛型参数错误、结果解析错误两个问题,修复后代码如下:
string dbName = "dbs.db"; string dbPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData), dbName); using (var conn = new SQLite.SQLiteConnection(dbPath)) { var cmd = new SQLite.SQLiteCommand(conn); // 表名Table属于SQL保留字,加反引号避免语法冲突 cmd.CommandText = "SELECT * FROM `Table`"; // 泛型参数填写对应表的实体类Table,而非连接类db var r = cmd.ExecuteQuery<Table>(); ListView lstDB = v.FindViewById<ListView>(Resource.Id.lstDB); List<string> file = new List<string>(); // 遍历查询结果拼接展示内容,不要直接对List调用ToString foreach (var item in r) { file.Add($"姓名:{item.Nome},城市:{item.Città},地址:{item.Indirizzo}"); } lstDB.Adapter = new ArrayAdapter(Application.Context, Android.Resource.Layout.SimpleListItem1, file); }
步骤3:确认执行顺序
在MainActivity的OnCreate生命周期方法中优先调用EstraiDB()方法,确保数据库从Assets拷贝到本地目录的操作完全完成后,再跳转至SecondPage执行查询,避免读取到未完成拷贝的损坏文件。
内容的提问来源于stack exchange,提问作者Notfound
相关产品推荐
相关产品推荐

