2012-05-14 5 views
1

У меня возникли проблемы с веб-сайтом Android, SQLite и моим целевым устройством. На физическом устройстве база данных недоступна (см. Ошибки в конце).Открыть Sqlite db в webview

Установка в WebView:

settings.setJavaScriptEnabled(true); 
    settings.setDatabaseEnabled(true); 
    settings.setDatabasePath("/data/data/de.sqlite.webview/databases"); 

Я определения WebView в методе onCreate, и установив квоты обновления вдвое выше расчетной или больше, чем в определении HTML5.

mWebView.setWebChromeClient(new WebChromeClient() { 
    @Override 
    public void onExceededDatabaseQuota(String url, String databaseIdentifier, long currentQuota, long estimatedSize, long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) 
    { 
      quotaUpdater.updateQuota(204801); //estimatedSize * 2 
    } 
}); 


    mWebView.setWebViewClient(new WebViewClient() {     
    @Override 
    public boolean shouldOverrideUrlLoading(...) 
    } 

На эмуляторе и на Chrome все работает отлично, но если развернуть приложение на моем galaxys2 я получаю сообщение об ошибке: OpenDatabase не определен.

Следующий HTML-код работает в хроме и в сэмулированному WebView:

db = new HKSQL(); 
    db.openSQL(); 
    today = getTodayDate(); 
    createDbTable_LastLogin(); 

    //HKSQL Class 
    function HkSQL(){ 
    this.query; 
    this.result; 
    this.database; 
    } 

    HkSQL.prototype.openSQL = function(){ 
    this.database = openDatabase("hkapp","1.0","HKApp","65536");  
    } 

    //an example query to create my db 
    CREATE TABLE IF NOT EXISTS HK_lastlogin (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, datum TEXT NOT NULL) 

Я понятия не имею, почему он не работает на моем устройстве. Я думал о разрешениях на чтение и запись, но файл .db уже создан. Вот некоторые сообщения об ошибках, которые, я думаю, цель одной и той же проблемой:

Uncaught ReferenceError: openDatabase is not defined 
Uncaught TypeError: Object [object DOMWindow] has no method 'openDatabase' 

ответ

2

Ответом было то, что и Веб-представления необходимо инициализировать как WebChromeClients с полными функциями.

myWebView = (WebView) findViewById(R.id.l_webview); 

myWebView.setWebViewClient(new WebViewClient() { }); 
myWebView.setWebChromeClient(new WebChromeClient() { ... }); 


myWebView2 = (WebView) findViewById(R.id.l_navi); 

myWebView2.setWebViewClient(new WebViewClient() {  }); 
myWebView2.setWebChromeClient(new WebChromeClient() { ... }); 
0

Это не должно быть dbclassname.openDatabase вместо window.openDatabase?

EDIT

Существует SO ответ here и единственное различие я вижу между тем, что они есть и что у вас есть эта линия:

settings.setJavaScriptCanOpenWindowsAutomatically(true); 

Попробуйте добавить, что и посмотреть, если это работает тогда.

Edit 2

Вы не установили ориентацию сюда ваш LinearLayout так что недобросовестный к горизонтальному, где вы оба webviews с помощью layout_width = «match_parent», которая будет толкать второй прямо с экрана ,

Вы должны добавить android:orientation="vertical" в список linearlayout xml и изменить l_webview на android:layout_height="0dp" android:layout_weight="1". Это заставит l_webview занять все оставшееся пространство после того, как будет установлено другое.

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

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

+0

Вы правы, вырезаны из большого количества кода. Я добавил описание класса. Его действительно странно, когда AVD эмулирует 2.3.3 все работает, но на 4.0.3 есть такая же ошибка, как на моем sgs2 (4.0.4) – morritza

+0

Вот такая же проблема http://code.google.com/p/android-scripting/issues/detail? id = 425 – morritza

+0

Последовало несколько ссылок оттуда. Я вижу только одно отличие от того, что у вас есть. Они добавили 'settings.setJavaScriptCanOpenWindowsAutomatically (true);'. – Barak

0

Я только нашел решение в своем main.xml. Если я определяю два веб-представления в Linringayout, возникает ошибка.

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="#ffffff" > 
      <WebView 
       android:id="@+id/l_webview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:clickable="true" ></WebView> 
    <WebView 
    android:id="@+id/l_navi" 
    android:layout_width="match_parent" 
    android:layout_height="55dp" ></WebView> 
</LinearLayout> 

// SqlitehtmlActivity

package de.sqlite.html; 
import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.webkit.WebChromeClient; 
import android.webkit.WebSettings; 
import android.webkit.WebView; 
import android.webkit.WebStorage; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 

public class SqlitehtmlActivity extends Activity { 
    public WebView myWebView; 
    public String test = "index.html"; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
     myWebView = (WebView) findViewById(R.id.l_webview); 
     WebSettings settings = myWebView.getSettings(); 

     settings.setJavaScriptEnabled(true); 
     settings.setDatabaseEnabled(true); 
     String databasePath = this.getApplicationContext() 
      .getDir("database", Context.MODE_PRIVATE).getPath(); 
     settings.setDatabasePath(databasePath); 

     myWebView.setWebViewClient(new WebViewClient() { 
     }); 

    myWebView.setWebChromeClient(new WebChromeClient() { 
     @Override 
     public void onExceededDatabaseQuota(String url, 
        String databaseIdentifier, long currentQuota, 
        long estimatedSize, long totalUsedQuota, 
        WebStorage.QuotaUpdater quotaUpdater) { 
        quotaUpdater.updateQuota(204801); 
      } 
     }); 
    myWebView.loadUrl(test); 
    } 
} 


<html><head> 
<script> 
    var shortName = 'testdb'; 
    var version = '1.0'; 
    var displayName = 'My Test Database'; 
    var maxSize = 65536; // in bytes 
    db = openDatabase(shortName, version, displayName, maxSize); 
    console.log("openDB passed"); 
    </script> 
    </head><body>Test</body></html> 

Может кто-нибудь сказать мне, что я делаю неправильно? Было бы здорово.

+0

Если я удалю вторую форму webview main.xml и попытаюсь добавить ее с новым объектом, тогда ошибка все равно появится. Является ли решение для фрагментов хорошим способом показать два веб-представления? (один как Контент, а второй - как навигация)? – morritza

+0

с java и xml я получаю ошибку, может кто-то, пожалуйста, подтвердите это? – morritza

Смежные вопросы