使用WebView时如何解决“无法打开数据库文件”错误?

时间:2011-07-20 08:51:27

标签: android database android-webview

我在Android应用程序中使用了WebView。我的问题很奇怪,因为应用程序抛出异常:

  

07-20 08:33:21.013:ERROR / SQLiteDatabase(728):android.database.sqlite.SQLiteCantOpenDatabaseException:无法打开数据库文件

我没有使用任何数据库。如何解决这个问题?

来源:

onClick的主要活动中:

  String url = listeRubrique.get(rubriqueChoisit).getListeVideo().get(paramInt).getUrl();
    if (url != null)
        {
            Intent intent = new Intent(Main.this,Lecture.class);
            intent.putExtra("url",url);
            startActivity(intent);
        }

WebView所在的第二个活动:

public class Lecture extends Activity {

    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lecture);

        webView = (WebView)findViewById(R.id.webview);
        webView.getSettings().setJavaScriptEnabled(true);
        Intent myIntent = getIntent();
        webView.loadUrl(myIntent.getStringExtra("url"));
    }
}

我的第一项活动:

package com...

import java.util.ArrayList;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

import com...

public class Main extends Activity {

//Listes
ArrayList<Video> listeVideo = new ArrayList<Video>();
ArrayList<Chapitre> listeRubrique = new ArrayList<Chapitre>();
//ListViews
private ListView listViewVideo;
private ListView listViewRubrique;
//TextViews
private TextView tvTitreRubrique;
private TextView tvDescriptionRubrique;
private TextView tvTitreVideo;
private TextView tvDescriptionVideo;
private TextView tvDureeVideo;
//Button
private Button btLancer;

int rubriqueChoisit;
int videoChoisit;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    listViewVideo =(ListView)findViewById(R.id.listContenuRubrique);
    listViewRubrique =(ListView)findViewById(R.id.lvContenu);

    tvTitreRubrique = (TextView)findViewById(R.id.tvTitreRubrique);
    tvDescriptionRubrique = (TextView)findViewById(R.id.tvDescriptionRubrique);
    tvTitreVideo = (TextView)findViewById(R.id.tvTitreVideo);
    tvDescriptionVideo = (TextView)findViewById(R.id.tvDescriptionVideo);
    tvDureeVideo = (TextView)findViewById(R.id.tvDureeVideo);

    btLancer = (Button)findViewById(R.id.btLancer);

    listeVideo.add(new Video(1,"Titre","My Link","Description de la video"));

    listeRubrique.add(new Chapitre(1,"...","...",listeVideo));


    ListViewRubriqueAdapter rubriqueAdapter = new ListViewRubriqueAdapter(Main.this, listeRubrique);
    listViewRubrique.setAdapter(rubriqueAdapter);

    listViewRubrique.setOnItemClickListener(new OnItemClickListener(){
        public void onItemClick(AdapterView<?> paramAdapterView, View paramView, int paramInt, long paramLong)
        {

            ListViewVideoAdapter videoAdapter = new ListViewVideoAdapter(Main.this, listeRubrique.get(paramInt));
            listViewVideo.setAdapter(videoAdapter);

            tvTitreRubrique.setText(listeRubrique.get(paramInt).getTitre());
            tvDescriptionRubrique.setText(listeRubrique.get(paramInt).getDescription());
        }
    });

    listViewVideo.setOnItemClickListener(new OnItemClickListener(){
        public void onItemClick(AdapterView<?> paramAdapterView, View paramView, int paramInt, long paramLong)
        {

            String url = listeRubrique.get(rubriqueChoisit).getListeVideo().get(paramInt).getUrl();
            if (url != null)
            {
                Intent intent = new Intent(Main.this,Lecture.class);
                intent.putExtra("url",url);
                startActivity(intent);
            }
        }
    });
}

3 个答案:

答案 0 :(得分:1)

此问题是由您的应用程序更新引起的。有时,在升级应用程序时,缓存目录的权限会被卡住,因此您的应用程序无法写入它们。我发现目录的权限保留在旧的PID下,而升级的应用程序被分配了一个新的PID。不幸的是,没有办法更新旧的安装权限/ PID配对。

这会导致您的问题,据我所知,除了设备的恢复出厂设置外,没有什么能解决这个问题。

请参阅http://code.google.com/p/android/issues/detail?id=949或搜索类似的异常,其中SQLite无法打开/写入,或者SharedPreferences也遇到类似的问题。

答案 1 :(得分:1)

对我来说,每个WebView每个应用程序都有自己的webview.db,如果webview.db是由另一个版本的应用程序创建的,或者应用程序的签名不同,那么当前应用程序可以'访问现有的webview.db

我有一个类似的例外,通过清理所有应用程序数据并删除应用程序来摆脱它。

答案 2 :(得分:0)

   webView = (WebView)findViewById(R.id.webview);
   webView.getSettings().setJavaScriptEnabled(true);
   Bundle bundle = getIntent().getExtras();       
   webView.loadUrl(bundle.getString("url"));