3

データベースをネイティブ android および html と共有するアプリケーションを作成しようとしています。以下のコードを初期化し、webview ページのデータベースを有効にします。しかし、webview ページで、データベースを更新すると、そのようなテーブル (hybrid_user) が表示されません。ここで何を見逃したのかわかりません。

データベース

public class DBHelper extends SQLiteOpenHelper{

private SQLiteDatabase helper;
private static final String DATABASE_NAME="hybrid_db";
private static final int SCHEMA_VERSION=1;
private static final String TAG = "DBHelper";


public DBHelper(Context context){
    super(context, DATABASE_NAME, null, SCHEMA_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    Log.i(TAG, "DBHelper");
    db.execSQL("CREATE TABLE hybrid_user (" +
            "tableid INTEGER PRIMARY KEY AUTOINCREMENT, " +
            "userid TEXT," +
            "password TEXT," +
            "mobile TEXT," +
            "createdate TIMESTAMP default current_timestamp);");
}

アクティビティ

    webView = (WebView)findViewById(R.id.webView);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.loadUrl("file:///android_asset/www/index.html");
    webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webView.getSettings().setDatabaseEnabled(true);
    webView.getSettings().setDatabasePath("/data/data/com.example.hybrid/hybrid_db");
    webView.getSettings().setDomStorageEnabled(true);
    webView.setWebViewClient(new WebViewClient(){

        @Override
        public void onPageFinished(WebView view, String url){
            webView.loadUrl("javascript:callFromActivity(\""+userid+"\")");
        }
    });

    webView.setWebChromeClient(new WebChromeClient(){

        public void onExceededDatabaseQuota(String url, String databaseIdentifier, 
                long currentQuota, long estimatedSize, long totalUsedQuota,
                WebStorage.QuotaUpdater quotaUpdater){
            quotaUpdater.updateQuota(204801);
        }
    });

index.html

<script>
var hybrid_user = null;
    function errorHandler(transaction, error){
        alert('Error:'+error.message+' (Code '+error.code+')');
        return true;
    }
    window.onerror = errorHandler;
    try{
        if(window.openDatabase){
            var shortName = 'hybrid_db';
            var version = '1.0';
            var displayName = 'Hybrid Database';
            var maxSize = 204801;
            hybrid_user = openDatabase(shortName, version, displayName, maxSize);
            alert("alert: "+hybrid_user);
        }
        else{
            alert("Database is not supported");
        }           
    }
    catch(e){
        if(e == 2){
            alert("Invalid database version.");
        }
        else{
            alert("Unknown error "+e+".");
        }
        return;
    }



    function updateRecord(){
        hybrid_user.transaction(
                function(transaction){
                    transaction.executeSql("UPDATE hybrid_user SET mobile=? WHERE userid ='"+document.getElementById("userid")+"'", [mobileNum]);
                    alert("mobileNum:" +mobileNum);
                    alert("userid:" +document.getElementById("userid"));
        });
    }
</script>

<body>
<form>
    <fieldset>
        <legend>Hybrid Application</legend>
        <p>

            <label>UserName: </label> <p id="userid"></p>
        <p>
            <label>Mobile Number :</label>
            <input type = "text"
                        id = "mobileNum" />
        </p>
            <button type="button" 
            onclick="updateRecord()">Submit</button>    
                <div id="output"></div> 
    </fieldset>
</form>
</body>

から取得alert:[object Database]alert("alert:" +hybrid_user);ます。しかし、まだsqliteエラーが発生し、そのようなテーブルはありません。sqlite returned: error code = 1, msg = no such table:hybrid_user

4

3 に答える 3

0

これを試してもらえますか:-

 webView.getSettings().getDatabasePath();

getDatabasePath()

デフォルトでデータベースのパスが表示されます

基本的にその/data/data/package_name/databases/db_name

クエリ関連のものを確認します。つまり、データベースを開くか更新します

更新index.html:-資産フォルダーの読み取りでエラーが発生したと確信しています。

このようなことを試してください:-

web_view.loadDataWithBaseURL("file:///android_asset/", index.html, "text/html", "UTF-8",null);

また

wv.loadUrl("file:///android_asset/index.html");   
于 2013-03-29T08:52:42.033 に答える
0

API レベル 19 以降、WebSettings.setDatabasePath は廃止されました。つまり、WebView によって作成されたデータベース ファイルを見つける方法が保証されなくなりました。

通常、db ファイルは /data/data/PACKAGE_NAME/app_database/hybrid_db.db にあります。

于 2013-12-10T09:38:30.860 に答える
0

データベースへのパスが正しくありません。「データベース」ディレクトリがありません。
次のようにする必要があります:/data/data/com.example.hybrid/databases/hybrid_db
代わりに:/data/data/com.example.hybrid/hybrid_db

于 2013-03-28T19:53:20.497 に答える