[英]Unable to access preloaded SQLite database file
我正在为我的Android应用程序使用预加载的SQLite数据库。 当我在模拟器上测试时,它工作正常。 但是,当我在真实设备上尝试使用它时,它会返回错误消息:
android.database.sqlite.SQLiteException:没有这样的表:Supplier
我已经检查了该数据库文件,并且肯定有表'supplier'。
我相信我已经将.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);
}
}
总体而言,如果您使用的是SQLiteAssetHelper
(甚至SQLiteOpenHelper
),请始终使用它。 不要使用帮助器来混合和匹配,也不要单独访问数据库(例如,通过openOrCreateDatabase()
)。 在某种程度上,这是因为您希望该数据库一次只存在一个 SQLiteDatabase
实例,该实例被所有线程共享以用于同步目的。 如果您拥有一个一致的获取SQLiteDatabase
,那么这是最容易的,如果您使用的是一个帮助程序,则该帮助程序应该是一致的位置。 通常,帮助程序变成单例或包装在ContentProvider
,因此您可以从所需的任何地方访问它。
话虽如此,我无法完全解释您以前的症状,因为我希望它能起作用。 但是,由于我大约每年使用openOrCreateDatabase()
一次,因此对于您的特定情况我没有很多经验。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.