ちょっとした問題があります。ネイティブプラグインで重い作業を行うプラグインを作成しようとしていますが、Web sqlite 実装の制限についても出荷しています。(データベースは 5MB に制限されていますが、もう少し必要です)。
まず、作業を行うことを目的とした Main クラスを次に示します。
package com.worker.api;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.phonegap.api.Plugin;
import com.phonegap.api.PluginResult;
import com.phonegap.api.PluginResult.Status;
public class worker extends Plugin{
public final String version = "1.0";
public String callback;
public worker(){
}
public PluginResult execute(String action, JSONArray args, String
callbackId) {
this.callback = callbackId;
PluginResult r = null;
try{
if(action.equals("connectDB")){
}else if(action.equals("closeDB")){
}else if(action.equals("query")){
r = this.query();
}else if(action.equals("insert")){
r = this.insert();
}else if(action.equals("update")){
r = this.update();
}else if(action.equals("delete")){
r = this.delete();
}else if(action.equals("syncronize")){
r = this.syncronize();
}else if(action.equals("getVersion")){
r = this.getVersion();
}else{
r = new PluginResult(Status.INVALID_ACTION);
r.setKeepCallback(true);
}
}catch(JSONException ex){
r = new PluginResult(Status.JSON_EXCEPTION);
}
return r;
}
public PluginResult query(){
return null;
}
public PluginResult insert(){
return null;
}
public PluginResult update(){
return null;
}
public PluginResult delete(){
return null;
}
public PluginResult syncronize(){
return null;
}
public PluginResult getVersion() throws JSONException{
JSONObject obj = new JSONObject();
obj.put(version,this.version);
return new PluginResult(Status.OK,obj);
}
}
現時点では、まだテストを行っているため、getVersion 部分のみを実装しました。
plugin.xml で、これを追加しました:
<plugin name="workerAPI" value="com.worker.api.worker" />
メインの js ファイルは次のようになります。
var workerApi = function(){}
var genericSuccess = function(e) {
alert("Success: " + e.toString());
};
var fail = function(e) {
alert("Failure " + e.toString());
};
workerApi.prototype.doAction = function(
operation,
argument,
successFunction,
failFunction
){
var succ = successFunction ? successFunction : genericSuccess;
var faic = failFunction ? failFunction : fail;
return PhoneGap.exec(
succ,
faic,
"workerAPI",
operation,
[argument]
);
};
PhoneGap.addConstructor(function() {
PhoneGap.addPlugin(
"workApi",
new workerApi()
);
});
var WKapi = {
"openDB": function(){
window.plugins.workApi.doAction(
"connectDB",
null
);
},
"closeDB": function(){
window.plugins.workApi.doAction(
"closeDB",
null
);
},
"query": function(arg){
window.plugins.workApi.doAction(
"query",
arg
);
},
"insert": function(arg){
window.plugins.workApi.doAction(
"insert",
arg
);
},
"update": function(arg){
window.plugins.workApi.doAction(
"update",
arg
);
},
"delete": function(arg){
window.plugins.workApi.doAction(
"delete",
arg
);
},
"sync": function(arg){
window.plugins.workApi.doAction(
"syncronize",
arg
);
},
"version": function(){
window.plugins.workApi.doAction(
"version"
);
}
};
実行するとすぐに、ロガー LogCat はエラーとして教えてくれます:
Uncaught TypeError: file:///android_asset/www/worker.js:79 で未定義のメソッド ID 'doAction' を呼び出せません
私は自分が間違っていることを本当に知りません。
- - -アドオン - - -
index.php の一部であるコードブロックは次のとおりです。
<script lang="text/javascript">
document.addEventListener("deviceready", onDeviceReady, false);
var isRun = false;
function onDeviceReady() {
WKapi.version();
};
</script>
</div>
</body>
</html>
私はまだ Uncaught TypeError: Cannot call method 'doAction' を取得します ... この呼び出しで発生します: window.plugins.workerApi.doAction
window.plugins.workerApi をアラートに入れると、unknown が返されます。