【问题标题】:SQLiteDatabase locked after any insert "SQLiteCantOpenDatabaseException: unable to open database file (code 14)"任何插入“SQLiteCantOpenDatabaseException:无法打开数据库文件(代码 14)”后,SQLiteDatabase 被锁定
【发布时间】:2015-12-24 07:45:33
【问题描述】:

当我将 android 版本和路径从 externalized 更改为默认数据库文件夹时,我不知道错误来自哪里。 我发现原因可能是访问日志文件的问题被锁定(它是由程序创建的)。

“测试”正在读取数据,如果存在则更新,如果不存在则插入。这是在从文件中读取行时循环完成的。出于测试目的,我对其进行了简化,但错误是相同的。

package ...;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
public class test {
    public test(SQLiteDatabase MyDB)
    {
        MyDB.execSQL("CREATE TABLE IF NOT EXISTS testtable (mytext TEXT, number INT PRIMARY KEY)", new String[] {});
        for (int i = 1; i < 5; i++)
        {
            String[] ColArray = { "any text", String.valueOf(i) };
            Cursor readCursor = MyDB.rawQuery("SELECT mytext FROM testtable WHERE number=?", new String[] { String.valueOf(i) });
            if (!readCursor.moveToNext()) // Error when executing moveToNext
/*
    In the 2nd time it runs over this point an Error occurs:
    android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14)
    I need to remove the journal file to be able to connect to the database it again - the change made by the Insert/Update is successfully saved!
*/          {
                readCursor.close();
                MyDB.execSQL("INSERT INTO testtable (mytext, number) VALUES(?, ?)", ColArray);
            }
            else {
                readCursor.close();
                MyDB.execSQL("UPDATE testtable SET mytext=? WHERE number=?", ColArray);
            }
        }
    }
}

MyDB 是一个有效的 DB-Connection。 1)创建表 2) 表已读,但未找到第 1 行 2a) 如果读取已关闭,则到现在为止再次读取是可能的。 3) 第 1 行已插入 4) 再次尝试 READ 时(也找不到第 2 行),移动光标失败。

需要手动删除日志文件,否则在尝试连接时应用将无法重新启动。

请帮忙!谢谢。

【问题讨论】:

  • 在 API9 (2.3.4) 设备上测试,相同的代码可以正常工作,没有任何错误。有错误的设备有一个android版本API16(4.1.2)

标签: android sqlite select insert journal


【解决方案1】:

也许你应该使用专门的插入和更新方法。

SQLiteDatabase 的文档中,它表示 execSQL:

执行不是 SELECT/INSERT/UPDATE/DELETE 的单个 SQL 语句。

有专门的插入和更新方法,名称相似。我想,当使用不特定的“execSQL”语句时,会产生一些问题。

【讨论】:

    【解决方案2】:

    经过数小时的测试,我解决了。

    可能新旧系统中的sqlite版本不同...我再次更改了rom-出于某种原因,这次我没有将数据库文件复制到数据文件夹中。相反,我让程序创建一个空数据库,并由程序本身从 csv-export 导入文本中的数据。

    我目前不知道问题是否在 rom 内,或者(我认为原因似乎是什么)我通过使用原始数据库创建了问题,该数据库可能是可读写的,但在日志文件应该出现问题时得到处理。如果有人有同样的问题,他应该尝试在新系统中创建一个新的空数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-25
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      相关资源
      最近更新 更多