无法访问预加载的SQLite数据库文件

时间:2016-01-05 22:58:36

标签: android sqlite

我正在为我的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);
    }
}

enter image description here

1 个答案:

答案 0 :(得分:2)

总体而言,如果您使用SQLiteAssetHelper(或甚至SQLiteOpenHelper),请始终如一地使用它。不要使用帮助程序混合和匹配并分别访问数据库(例如,通过openOrCreateDatabase())。在某种程度上,这是因为您希望一次只有一个SQLiteDatabase实例用于此数据库,由所有线程共享,以实现同步。如果您有一个获得SQLiteDatabase的一致点,这是最简单的,如果您正在使用帮助,那么该帮助应该是一致的点。通常情况下,助手变成单身或用ContentProvider包裹,所以你可以从任何需要的地方找到它。

话虽如此,我无法解释你以前的症状,正如我原本预期的那样。但是,由于我大约每年使用openOrCreateDatabase()一次,因此我对您的具体情况没有太多经验。