【问题标题】:Unable to access preloaded SQLite database file无法访问预加载的 SQLite 数据库文件
【发布时间】: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 文件应该在其他地方,请纠正我。

标签: android sqlite


【解决方案1】:

总的来说,如果您使用SQLiteAssetHelper(甚至SQLiteOpenHelper),请始终使用它。不要混合和匹配使用帮助程序和单独访问数据库(例如,通过openOrCreateDatabase())。部分原因是您希望该数据库一次只有 一个SQLiteDatabase 实例,由所有线程共享,以用于同步目的。如果您有一个一致的位置来获取SQLiteDatabase,这是最简单的,并且如果您使用的是助手,那么该助手应该是一致的位置。通常,助手会变成单例或包裹在 ContentProvider 中,因此您可以从任何需要的地方访问它。

话虽如此,我无法完全解释您以前的症状,因为我预计它会起作用。不过,由于我大约每年使用一次openOrCreateDatabase(),因此我对您的特定场景没有大量经验。

【讨论】:

    猜你喜欢
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多