2012-05-14 77 views
1

我遇到了一些與android webview,SQLite和我的目標設備有關的問題。在物理設備上,數據庫不可訪問(請參閱最後的錯誤)。在webview中打開Sqlite數據庫

web視圖的設置:

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

我限定在onCreate方法web視圖,以及設置更新的配額的兩倍高估計或小於在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

答案是 Webviews需要初始化爲具有完整功能的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而不是​​?

編輯

有一個SO回答here,我看到與他們有什麼,你有什麼是此行唯一的區別:

settings.setJavaScriptCanOpenWindowsAutomatically(true); 

嘗試添加,看看它的工作原理然後。

編輯2

所以它默認爲橫您還沒有設定方向來回你的LinearLayout,在那裏你使用layout_width =「match_parent」,這將推動正確關閉屏幕,第二個同時擁有網頁視圖。

您應該將android:orientation="vertical"添加到linearlayout xml,並將l_webview更改爲android:layout_height="0dp" android:layout_weight="1"。這將使l_webview在另一個到位後佔用所有剩餘空間。

我不知道這是否會解決您的問題,但它會使兩個視圖都可見而不會將其從屏幕上推開。

您還需要使用findViewById來獲取每個單獨視圖的ID。

+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中找到了解決方案。如果我在一個Linearlayout中定義了兩個webviews,則會發生錯誤。

<?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,並嘗試添加一個新的對象,然後錯誤仍然出現。 片段解決方案是展示兩個Webviews的好方法嗎? (一個是內容,另一個是導航)? – morritza

+0

與Java和XML我得到的錯誤,有人可以證明嗎? – morritza