2012-05-14 128 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