2011-07-13 78 views
3

我在一個應用程序 嵌入一個WebView並顯示一個HTML5頁面的工作。android WebView HTML5訪問數據庫問題

當在android chrome Browser.the數據庫中創建html頁面時創建正常。

但是當我運行這個應用程序時,數據庫無法創建。 它似乎是HTML頁面無法在WebView上創建數據庫。

有人知道爲什麼嗎?

這裏是我的活動代碼:

public class efan_NewsReader extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main);   
    WebView myWebView=(WebView)findViewById(R.id.my_webview); 
    myWebView.setWebViewClient(new WebViewClient()); 
    WebSettings settings = myWebView.getSettings(); 
    settings.setJavaScriptEnabled(true); 
    settings.setDomStorageEnabled(true); 
    settings.setDatabaseEnabled(true); 
    settings.setAppCacheEnabled(false);   

    myWebView.loadUrl("http://10.10.35.47:8080/html5test/test.htm"); 

}} 

這裏是我的HTML5網頁源代碼:

<html manifest="mymanifest.manifest"> 
    <head> 
<meta http-equiv="Content-Type" content="text/html; content="no-cache" charset=utf-8" /> 
<script type="text/javascript" src="js/jquery-1.6.1.min.js"></script> 

<script> 
$(document).ready(function(){  

    databaseTest(); 
}); 

function databaseTest(){ 


    //open database 
    var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); 

     db.transaction(function (tx) {    
     tx.executeSql('CREATE TABLE IF NOT EXISTS testHtml (id unique, contentText)'); 
     tx.executeSql('INSERT INTO testHtml (contentText) VALUES ("insert data test!")'); 
     }); 

    db.transaction(function(tx){   
    tx.executeSql('SELECT * FROM testHtml',[],function(tx,result){ 
      var len=result.rows.length; 
      var msg = "<p>Found rows: " + len + "</p>"; 
      $("#testinfo").append(msg); 
     },null); 
    });  


} 

</script> 


</head> 
<body> 
    <div>here is test info:</div> 
    <div id="testinfo"></div> 
</body> 

回答

11

嘗試:

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

而且在WebChromeClient:

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

應該OK;)

+1

我不確定'@ Override'後面的行的目的是什麼,但這節省了我的一天。謝謝。 – JunM

0

這可能是因爲默認配額是0,因此onExceededDatabaseQuota是必須

2

新WebChromeClient()被扔一個構造函數的錯誤,所以我這樣做了。 私人WebView webView;

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.test_web); 

    webView = (WebView) findViewById(R.id.webView1); 


    webView.getSettings().setJavaScriptEnabled(true); 
    webView.getSettings().setDatabaseEnabled(true); 
    webView.getSettings().setDomStorageEnabled(true); 
    //String sDataPath = "/data/data/" + webView.getContext().getPackageName() + "/databases/"; 
    String sDataPath = this.getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath(); 
    webView.getSettings().setDatabasePath(sDataPath); 
    webView.getSettings().setDatabaseEnabled(true); 
    webView.getSettings().setSavePassword(true); 
    webView.getSettings().setAllowContentAccess(true); 
    webView.getSettings().setAllowFileAccess(true); 

    webView.setWebViewClient(new Callback()); 
    webView.setWebChromeClient(new webChromeClient()); 
    webView.loadUrl("http://www.yahoo.com");   
} 

private class Callback extends WebViewClient{ 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      return (false); 
     } 

} 
private class webChromeClient extends WebChromeClient 
{ 
    @Override 
     public void onExceededDatabaseQuota(String url, String databaseIdentifier, long currentQuota, long estimatedSize, long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) { 
     quotaUpdater.updateQuota(5 * 1024 * 1024); 
    }  
}