我正在为我的Android应用程序使用预加载的SQLite数据库。当我在模拟器上测试它时工作正常。但是当我在真实设备上尝试它时,它会返回错误说:
android.database.sqlite.SQLiteException:没有这样的表: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);
}
}
答案 0 :(得分:2)
总体而言,如果您使用SQLiteAssetHelper
(或甚至SQLiteOpenHelper
),请始终如一地使用它。不要使用帮助程序混合和匹配并分别访问数据库(例如,通过openOrCreateDatabase()
)。在某种程度上,这是因为您希望一次只有一个的SQLiteDatabase
实例用于此数据库,由所有线程共享,以实现同步。如果您有一个获得SQLiteDatabase
的一致点,这是最简单的,如果您正在使用帮助,那么该帮助应该是一致的点。通常情况下,助手变成单身或用ContentProvider
包裹,所以你可以从任何需要的地方找到它。
话虽如此,我无法解释你以前的症状,正如我原本预期的那样。但是,由于我大约每年使用openOrCreateDatabase()
一次,因此我对您的具体情况没有太多经验。