Как решить ошибку «невозможно открыть файл базы данных» при использовании WebView? - PullRequest
1 голос
/ 20 июля 2011

Я использую WebView в своем приложении для Android. Моя проблема странная, потому что приложение выдает исключение:

07-20 08: 33: 21.013: ОШИБКА / 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 ]

1 голос
/ 25 января 2012

Эта проблема вызвана обновлением вашего приложения.Иногда при обновлении приложения права доступа к каталогам кеша зависают, так что ваше приложение не может писать в них.Я обнаружил, что разрешения для каталогов остаются под старым PID, а обновленному приложению назначается новый PID.К сожалению, нет способа обновить старые разрешения на установку / сопряжение PID.

Это вызывает вашу проблему, и, насколько я могу судить, нет ничего, что могло бы исправить это, кроме заводского сброса устройства.

См. http://code.google.com/p/android/issues/detail?id=949 или выполните поиск похожих исключений, когда SQLite не может открывать / записывать или SharedPreferences также сталкиваются с подобными проблемами.

1 голос
/ 28 мая 2013

Мне кажется, что каждое WebView имеет свое webview.db для приложения, и если webview.db было создано другой версией приложения или подпись приложения отличалась, текущее приложение не может получить доступ к существующему webview.db.

У меня было похожее исключение, и я избавился от него, очистив все данные приложения и удалив приложение.

0 голосов
/ 20 июля 2011
   webView = (WebView)findViewById(R.id.webview);
   webView.getSettings().setJavaScriptEnabled(true);
   Bundle bundle = getIntent().getExtras();       
   webView.loadUrl(bundle.getString("url"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...