【问题标题】:"SQLiteCantOpenDatabaseException: unable to open database file (code 14)"“SQLiteCantOpenDatabaseException:无法打开数据库文件(代码 14)”
【发布时间】:2015-05-26 16:32:32
【问题描述】:

我收到一条错误消息:"SQLiteCantOpenDatabaseException: unable to open database file (code 14)" on the line: if (cursor != null && cursor.moveToFirst()) {

然后

data = dbHelper.getTblQuoteNotify("tblQuoteNotify", nCounter);

我有<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />,这似乎是我研究中解决此问题的最常见解决方案 - 其他人可以看看下面的代码,让我知道在这种情况下我可能做错了什么吗?

来源:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    doTimerTask();
    setContentView(R.layout.activity_main);
    data_textview = (TextView) findViewById(R.id.data);
    timer = (TextView)findViewById(R.id.timer);
    dbHelper = new DBHelper(this);
    try {
        dbHelper.CopyDataBaseFromAsset();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    dbHelper.openDataBase();
    data = new Data();
}

 public void doTimerTask(){

        mTimerTask = new TimerTask() {
                public void run() {
                        handler.post(new Runnable() {
                                public void run() {
                                    nCounter++;
                                        // update TextView
                                    timer.setText("Notify: " + nCounter);

                                    data = dbHelper.getTblQuoteNotify("tblQuoteNotify", nCounter);
                                    if (data != null) {
                                        data_textview.setText(data.tblQuoteNotify);                                     
                                    }

Logcat:

05-26 12:01:28.533: E/AndroidRuntime(13445): FATAL EXCEPTION: main
05-26 12:01:28.533: E/AndroidRuntime(13445): Process: com.example.app, PID: 13445
05-26 12:01:28.533: E/AndroidRuntime(13445): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14)
05-26 12:01:28.533: E/AndroidRuntime(13445):    at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow(Native Method)
05-26 12:01:28.533: E/AndroidRuntime(13445):    at android.database.sqlite.SQLiteConnection.executeForCursorWindow(SQLiteConnection.java:845)
05-26 12:01:28.533: E/AndroidRuntime(13445):    at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:836)
05-26 12:01:28.533: E/AndroidRuntime(13445):    at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
05-26 12:01:28.533: E/AndroidRuntime(13445):    at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:144)
05-26 12:01:28.533: E/AndroidRuntime(13445):    at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133)
05-26 12:01:28.533: E/AndroidRuntime(13445):    at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:197)
05-26 12:01:28.533: E/AndroidRuntime(13445):    at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:237)
05-26 12:01:28.533: E/AndroidRuntime(13445):    at com.example.app.data.DBHelper.getTblQuoteNotify(DBHelper.java:67)
05-26 12:01:28.533: E/AndroidRuntime(13445):    at com.example.app.MainActivity$1$1.run(MainActivity.java:69)

http://pastebin.com/z8jFk4V0

【问题讨论】:

  • 打开数据库的代码是什么?你有权限,但可能你的路径不正确,你必须有类似的东西: private static String DBPATH = "/data/data/com.mypackage.myapp";所以发布你的代码。
  • 请贴出与问题相关的所有代码。
  • 道歉:完整的来源可以在这里找到:pastebin.com/R830dT9wpastebin.com/y8VjYzmY

标签: android sqlite android-sqlite fatal-error forceclose


【解决方案1】:

该问题已通过降低 TimerTask 的频率得到解决。尝试过快访问数据库会导致此错误。

【讨论】:

    【解决方案2】:

    您在打开数据库之前调用了doTimerTask();。首先打开数据库,然后调用doTimerTask(); method 查看您的代码,我无法运行您的代码,但它似乎是正确的,但我会建议:

    1. db文件扩展名应为.db.sqlite
    2. db 文件名必须与资产文件夹相同。
    3. 包名应该相同,

    像这样更改你的代码

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
      //doTimerTask();
      setContentView(R.layout.activity_main);
      data_textview = (TextView) findViewById(R.id.data);
      timer = (TextView)findViewById(R.id.timer);
      dbHelper = new DBHelper(this);
      try {
        dbHelper.CopyDataBaseFromAsset();
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
      dbHelper.openDataBase();
      data = new Data();
      doTimerTask(); //**** call doTimerTask here
    }
    

    我不确定它是否会对您有所帮助,因为您尚未发布代码,我们可能会通过它并修复错误,无论如何我建议您访问thisthis

    看看你的 DBpath 是否正确?正确输入你的包名。

     public final static String DATABASE_PATH ="/data/data/you.package.name/databases/";
    

    或检查您的光标是否正常工作,查询是否正确?

    【讨论】:

    • 道歉:完整的来源可以在这里找到:pastebin.com/R830dT9wpastebin.com/y8VjYzmY
    • 网址未打开。如果可能的话,你应该发布你的代码。
    • 它在上面的评论中 - 不是吗?
    • "url not found response" 来自浏览器,不知道你!但可能 b 这个 url 是 n pak 不可访问的。我已经更新了答案。
    • 抱歉不适合我。 url 响应此“您尝试访问的网站包含禁止在巴基斯坦境内观看的内容。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多