【发布时间】:2016-01-06 08:50:04
【问题描述】:
我正在为我的 android 应用程序使用预加载的 SQLite 数据库。当我在模拟器上测试它时它工作正常。但是当我在真实设备上尝试时,它会返回错误消息:
android.database.sqlite.SQLiteException:没有这样的表:供应商
我已经检查了那个数据库文件,它肯定有表“供应商”。
我相信我已将 .db 文件放置在正确的位置(最初拼写错误,我得到了 DB 未找到的错误。我已修复该错误,此后该错误消失了)。
使用以下代码和依赖项。附上关于数据库现在所在位置的屏幕截图。请指教。
dependencies {
compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:+'
}
.
String tableName = "supplier";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//getting the database stored in assets folder
try {
DBHelper dbHelper = new DBHelper(this);
dbHelper.getReadableDatabase();
} catch (SQLiteAssetHelper.SQLiteAssetException e) {
e.printStackTrace();
}
}
public void sqlTest(View v){
SQLiteDatabase db = this.openOrCreateDatabase("QuoteDb", MODE_PRIVATE, null);
String[] inserts = {category, preferences.getString(category, "1")};
//this line throws the table name not found error
Cursor c = db.rawQuery("SELECT quote FROM " + tableName + " WHERE category=? AND rowid=? LIMIT 1", inserts);
}
private class DBHelper extends SQLiteAssetHelper{
private static final String DATABASE_NAME = "QuoteDb.db";
private static final int DATABASE_VERSION = 1;
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
}
【问题讨论】:
-
“我已经检查了那个数据库文件,它肯定有表'供应商'”——在设备或模拟器上,还是在你的项目中?您可能想要卸载或“清除数据”您的应用程序,然后再次尝试安装您的应用程序。对于
DATABASE_VERSION = 1,如果该设备或模拟器上已经有数据库,SQLiteAssetHelper不会做任何事情,因为它认为您已经解压了数据库。如果那里的数据库碰巧没有这个表,那就可以解释你的症状。 -
@CommonsWare “有表”是指我在 sqliteBrowser 上检查了文件,确保它具有必要的表和字段,然后再将其粘贴到 assets/databases 文件夹中。
-
那么我支持我的建议:卸载或“清除数据”该应用程序,因此您确定
SQLiteAssetHelper将解压当前位于assets/中的文件,而不使用现有的文件缺少你的桌子。您也可以摆脱openOrCreateDatabase()并始终使用SQLiteAssetHelper。 -
@CommonsWare 我在设备上卸载并重新安装了该应用程序,结果相同。还在我之前未安装的设备上尝试过,结果也相同。数据库包含一些表。当我测试它们时,它们都没有找到。
-
@FrankN.Stein 我正在尝试访问资产文件夹中的数据库。我的印象是那是正确的文件夹。如果 .db 文件应该在其他地方,请纠正我。