未知错误(代码14):无法打开数据库。

9
我有一个使用数据库和SQLiteAssetHelper的工作应用程序。 数据库文件(sql.sqlite)被压缩(sql.sqlite.zip)并放置在资产/数据库文件夹中。
程序运行得非常好。 如果第二次/第三次/第四次…运行它,则启动速度很快。 但是,如果我强制停止,然后清除数据,再次运行它,那么当我运行它(查看日志)时,我会看到一个错误“未知错误(代码14):无法打开数据库”...但是等待几秒钟后,一切都加载并且完美地运行。
日志如下:
W/SQLiteAssetHelper(18393): could not open database SQL.sqlite - unknown error (code 14): Could not open database
W/SQLiteAssetHelper(18393): copying database from assets...
W/SQLiteAssetHelper(18393): extracting file: 'sql.sqlite'...
W/SQLiteAssetHelper(18393): database copy complete
I/SQLiteAssetHelper(18393): successfully opened database SQL.sqlite

看起来好像它试图找到数据库,但失败了,然后崩溃了,最后修复了自己。我的问题是,我如何避免笨拙的开始和几秒钟的延迟?

编辑: 我在代码中对数据库的第一个引用是...

public class Globals extends Application
{
    Custom_SQLiteAssetHelper db;   
    public void onCreate()
    {
        super.onCreate();
        db = new Custom_SQLiteAssetHelper(this);
        cursor = db.get_first_species_common_name();

而我有...

public class Custom_SQLiteAssetHelper extends SQLiteAssetHelper
{
    public Custom_SQLiteAssetHelper(Context context)
    {
        super(context, "SQL.sqlite", null, 1);  
    }
    public Cursor get_first_species_common_name()
    {
        SQLiteDatabase db = getReadableDatabase();
        SQLiteQueryBuilder querything = new SQLiteQueryBuilder();
            // etc...

这个过程就像你首先尝试访问一个数据库(出现错误),然后创建它,再次访问它。猜测你需要重新安排你的操作方式。 - LightYearsBehind
查看对原帖的编辑...也许会更清晰。 - Mick
你可以试着使用 Context.getDatabasePath(dbName).exists() 来判断数据库是否已经存在。至于延迟的秒数,我认为这是因为你有一个大型的数据库,解压和复制需要时间。如果是因为解压,就不要从一开始就压缩。如果是因为复制需要时间,可以增加每个复制操作的字节数。 - LightYearsBehind
你确定这不是“按设计要求”吗?除了一个日志消息,它只是意味着尝试访问不存在的数据库并进行复制,我不确定为什么你认为这是个问题。作为Android开发人员,我们经常看到日志垃圾邮件。正如haike00所提到的,延迟是解压缩和复制的原因。 - Greg Ennis
我有完全相同的问题。你找到答案了吗?@Mick - Arash Khoeini
3个回答

1

0
尝试进行更改
super(context, "SQL.sqlite", null, 1);

使用

 super(context, "SQL", null, 1);

-1
public Custom_SQLiteAssetHelper(Context context)
{
    super(context, "SQL.sqlite", null, 1);  
}

更改为

public Custom_SQLiteAssetHelper(Context context)
{
    super(context, "SQL.sqlite", null, 1);  
    close();
}

@haike00 正在使用 SQLiteAssetHelper 库,它支持在首次运行应用程序时将预填充的 SQLite 数据库复制到内部/外部存储。使用此库时,您必须压缩您的 SQLite 文件,没有其他选项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接