问题描述
我在Android插件应用中使用了build job: "itext_7_dotnet/sharpen/${java.net.URLEncoder.encode branchName,'UTF-8'}"
。我试图验证是否存在递归调用,但是我找不到类似的东西。即使没有,也不确定。每次遇到此问题时,都会遇到1-2次。并且应用程序会损坏。不确定Observer或Subcriber线程或Android主线程是否出现问题,或者我是否使用了错误的可观察链接。请有人指导我解决此问题。
内部方法执行的过程如下所示: 1.调用后端REST API 2.一些数据处理,例如查询等 3.连接到sqlite并使用查询在sqlite上创建,插入或更新操作
以下是示例代码: 插件课程:
rxjava3
这是从插件主类调用的另一个名为'SynchroizationService'方法的类。
SynchroizationService Java类:
@NativePlugin
public class App extends Plugin {
private Context context;
public void load() {
// Get singleton instance of database
context = getContext();
}
@PluginMethod()
public void syncNow(PluginCall call) throws IOException,JSONException {
String result = null;
String apiUrl = call.getString("apiUrl");
JSArray parallelMethods = call.getArray("parallelMethods");
JSArray synchronousMethods = call.getArray("synchronousMethods");
String operationType = call.getString("operationType");
JSObject pluginOptions = call.getObject("pluginOptions");
synchroniztionService = new SynchroniztionService(context);
synchroniztionService.startSyncNow(call,synchronousMethods,parallelMethods,apiUrl,pluginOptions)
.observeOn(AndroidSchedulers.mainThread()).subscribe(
res -> {
System.out.println(res);
retResult(call,true,DEFAULT_RETURN);
},onError -> {
System.out.println(onError);
},() -> {
System.out.println("Completed!!");
}
);
}
private void retResult(PluginCall call,Boolean res,String message) {
JSObject ret = new JSObject();
ret.put("result",res);
if (message != null) ret.put("message",message);
call.resolve(ret);
}
}
下面的//Synization service methods
public @NonNull Observable<String> startSyncNow(PluginCall call,JSArray synchronousMethods,JSArray parallelMethods,String apiUrl,JSObject pluginOptions) throws JSONException,IOException {
return createOrAlterTable(call,pluginOptions)
.switchMap(d -> formSchemaToSQLite(call,pluginOptions))
.observeOn(Schedulers.newThread())
.switchMap(d -> menuTableRecords(call,apiUrl))
.map(d -> d);
}
// ### createOrAlterTable Start
private Observable<JSONArray> createOrAlterTable(PluginCall call,JSObject pluginOptions) throws IOException,JSONException {
// Read table from backend
// Read last sync file
// get user data
return Observable
.zip(readTableFromBackend(pluginOptions,apiUrl),readLastSyncFile(call,pluginOptions),getUserData(call,(s1,s2,s3) -> readTableFromBackendZipperFun(s1,s3,call,pluginOptions))
.subscribeOn(Schedulers.io()).observeOn(Schedulers.io())
.map(d -> d);
//
}
private @NonNull Observable<String> readTableFromBackend(
JSObject pluginOptions,String apiUrl) throws JSONException,IOException {
JSONObject obj = null;
JSONObject msgPayload = new JSONObject();
JSONObject wrapper = MessageTransformation
.getMessageWrapper(pluginOptions);
wrapper.put("Payload",msgPayload.toString());
wrapper.put("DataType","SQLLiteDDLAsync");
wrapper.put("MessageKind","READ");
// let data = JSON.parse(JSON.stringify(message));
// let options: any = getHttpHeaderOptions();
String response = this.rest.post(apiUrl,wrapper.toString());
String jsonFormattedString = new JSONTokener(response).nextValue()
.toString();
// return this.http.post(apiUrl,wrapper,options)
// .pipe(map((response: any) => { return response; }));
// obj = new JSONObject(jsonFormattedString);
return Observable.fromArray(jsonFormattedString);
}
private @NonNull Observable<JSONObject> readLastSyncFile(PluginCall call,JSObject pluginOptions) throws JSONException {
JSONObject obj = new JSONObject();
String dbName = pluginOptions.getString("database");
boolean encrypted = pluginOptions.getBoolean("encrypted");
String inmode = pluginOptions.getString("mode");
SqliteDB sqlite = new SqliteDB(this.context,encrypted,inmode,dbName);
String query = getLastSyncFileQuery(null,null);
JSArray jsArray = new JSArray();
obj = sqlite.customQuery(query,new JSArray(),call);
return Observable.fromArray(obj);
}
private String getLastSyncFileQuery(String table,String operationType) {
String query = null;
if (operationType != null) {
query = "select lastfileversion from LastSync where operationtype='"
+ operationType + "';";
} else {
query = "select lastfileversion from LastSync;";
}
return query;
}
private @NonNull Observable<Boolean> getUserData(PluginCall call,JSObject pluginOptions) throws JSONException {
boolean result = false;
// SELECT name FROM sqlite_master WHERE type='table' AND
// name='{table_name}';
String query = "SELECT name FROM sqlite_master where type='table' and name='User';";
String dbName = pluginOptions.getString("database");
boolean encrypted = pluginOptions.getBoolean("encrypted");
String inmode = pluginOptions.getString("mode");
SqliteDB sqlite = new SqliteDB(this.context,dbName);
JSONObject obj = new JSONObject();
obj = sqlite.customQuery(query,call);
JSONArray jsonArray = obj.getJSONArray("values");
if (jsonArray.length() > 0) {
result = true;
}
return Observable.fromArray(result);
}
private JSONArray readTableFromBackendZipperFun(String sqlliteDDL,JSONObject lastFV,boolean userDataFlag,PluginCall call,JsonProcessingException {
// JSONParser parser = new JSONParser();
if (lastFV != null && lastFV.has("values")) {
JSONArray array = (JSONArray) lastFV.get("values");
String lastfileversion = null;
if (array.length() > 0) {
JSONObject jsonObject = (JSONObject) array.get(0);
lastfileversion = (String) jsonObject.get("lastfileversion");
}
JSONObject sqlliteddlObject = new JSONObject(sqlliteDDL);// null;//(JSONObject)
// parser.parse(sqlliteDDL);
JSONObject sqlLiteDDl = this.filterSqlLiteDDLBasedOnFileVersion(
sqlliteddlObject,lastfileversion,userDataFlag);
JSONArray obslist$ = new JSONArray();
String fileversionName = "";
JSONArray jsonArray = sqlliteddlObject.names();
for (int i = 0; i < jsonArray.length(); i++) {
String element = jsonArray.getString(i);
String isType = element.toLowerCase().contains("create") ? "Create"
: "Alter";
JSONObject jObject = (JSONObject) sqlliteddlObject.get(element);
Object resJsonPathObject = JsonPath.read(jObject.toString(),"$.structure.tables");
System.out.println(resJsonPathObject);
// String jsonPathJSONObject = new
// JSONTokener(resJsonPathObject.toString()).nextValue().toString();//
// //
// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
// compile group: 'com.fasterxml.jackson.core',name:
// 'jackson-databind',version: '2.11.2'
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper
.writeValueAsString(resJsonPathObject);
JSONObject jsonPathJSONObject = new JSONObject(jsonString);
fileversionName = isType == "Alter" ? element : null;
JSONObject jsonObj = jsonPathJSONObject != null ? jsonPathJSONObject
: new JSONObject();
// observable
JSONObject obseravel$ = persistenceCreateOrAlterTable(
jsonObj.toString(),isType,pluginOptions,call);
obslist$.put(obseravel$);
}
if (fileversionName != "") {
// observable
JSONObject obseravel$ = fileVersionUpdate(fileversionName,call);
obslist$.put(obseravel$);
}
// forkjoin return
}
JSONArray jsonArray = new JSONArray();
return jsonArray;
}
private JSONObject fileVersionUpdate(String fileName,JSObject pluginOptions,PluginCall call) throws JSONException {
String FileVersionUpdatequery = persistenceGetFileVersionUpdatequery(fileName);
String dbName = pluginOptions.getString("database");
boolean encrypted = pluginOptions.getBoolean("encrypted");
String inmode = pluginOptions.getString("mode");
SqliteDB sqlite = new SqliteDB(this.context,dbName);
JSONObject res = sqlite.customExecute(FileVersionUpdatequery,call);
return res;
}
private String persistenceGetFileVersionUpdatequery(String fileName) {
return "Update LastSync Set lastfileversion = '" + fileName + "';";
}
private JSONObject filterSqlLiteDDLBasedOnFileVersion(
JSONObject sqlliteDDL,String lastfileversion,boolean userDataFlag)
throws JSONException {
JSONObject tempsqlLiteDDl = new JSONObject();
if (lastfileversion == null && !userDataFlag) {
Iterator<String> keys = sqlliteDDL.keys();
while (keys.hasNext()) {
String key = keys.next();
if (key.contains("Create")) {
tempsqlLiteDDl.put(key,sqlliteDDL.get(key));
}
}
} else {
JSONArray jsonArray = sqlliteDDL.names();
List<String> sqlLiteDDlList = new ArrayList<String>();
for (int i = 0; i < jsonArray.length(); i++) {
sqlLiteDDlList.add(jsonArray.getString(i));
}
int fileversionindex = sqlLiteDDlList.indexOf(lastfileversion);
for (int index = 0; index < jsonArray.length(); index++) {
String element = jsonArray.getString(index);
if (element.contains("Create")) {
tempsqlLiteDDl.put(element,sqlliteDDL.get(element));// sqlLiteDDl[element];
} else if (element.contains("Alter")
&& index > fileversionindex) {
tempsqlLiteDDl.put(element,sqlliteDDL.get(element));// sqlLiteDDl[element];
}
}
}
return tempsqlLiteDDl;
}
private JSONObject persistenceCreateOrAlterTable(String querylist,String type,PluginCall call)
throws JSONException {
// JSONParser parser = new JSONParser();
JSONObject queries = new JSONObject(querylist);// null;//(JSONObject)parser.parse(querylist);
String statement = getqueryStatement(queries,type);
String dbName = pluginOptions.getString("database");
boolean encrypted = pluginOptions.getBoolean("encrypted");
String inmode = pluginOptions.getString("mode");
SqliteDB sqlite = new SqliteDB(this.context,dbName);
JSONObject result = sqlite.customExecute(statement,call);
return result;
}
private String getqueryStatement(JSONObject queries,String type)
throws JSONException {
String statement = "BEGIN TRANSACTION;\n";
JSONArray tablelist = queries.names();
for (int i = 0; i < tablelist.length(); i++) {
String tableName = tablelist.getString(i);
switch (type) {
case "Create":
statement = statement + " CREATE TABLE IF NOT EXISTS "
+ tableName + " " + queries.get(tableName) + ";\n";
break;
case "Alter":
statement = statement + " ALTER TABLE " + tableName + " "
+ queries.get(tableName) + ";\n";
break;
default:
break;
}
}
statement = statement + " COMMIT TRANSACTION;";
return tablelist.length() > 0 ? statement : null;
}
// ### createOrAlterTable End
// ### formSchemaToSQLite Start
private @NonNull Observable<String> formSchemaToSQLite(PluginCall call,IOException {
JSONArray values = pluginOptions.getJSONArray("values");
String dbName = pluginOptions.getString("database");
boolean encrypted = pluginOptions.getBoolean("encrypted");
String inmode = pluginOptions.getString("mode");
SqliteDB2 sqlite = new SqliteDB2(this.context,dbName);
for (int i = 0; i < values.length(); i++) {
JSONObject table = (JSONObject) values.get(i);
String lastSyncTime = table.getString("LastSyncTime");
String tableName = "FormSchema";// table.getString("tableName");
JSONObject msgPayload = new JSONObject();
if (lastSyncTime == "null") {
msgPayload.put("lastsynctime",JSONObject.NULL);
} else {
msgPayload.put("lastsynctime",lastSyncTime);
}
JSONObject wrapper = table.getJSONObject("MessageWrapper");
wrapper.put("Payload",msgPayload.toString());
wrapper.put("DataType","FormSchemaSync");
wrapper.put("MessageKind","READ");
System.out.println("before rest");
String response = this.rest.post(apiUrl,wrapper.toString());
String jsonFormattedString = new JSONTokener(response).nextValue()
.toString();
// System.out.println(response);
JSONArray jsArray = new JSONArray(jsonFormattedString);
List<String> queries = new ArrayList<String>();
for (int j = 0; j < jsArray.length(); j++) {
String query = SqliteDB2.createPreparedStmtQuery(
((JSONObject) jsArray.get(j)),tableName);
queries.add(query);
}
// sqlite.executeBatchSQLiteQuery(queries,call);
sqlite.executeBatchSQLitePreparedStatement(queries,call);
}
return Observable.fromArray(DEFAULT_RETURN);
}
// ### formSchemaToSQLite End
用于为查询方法创建语句和文字值
createPreparedStmtQuery
错误:
public static String createPreparedStmtQuery(JSONObject record,String tableName) throws JSONException {
record = modifyRecord(record);
Iterator<String> keys = record.keys();
StringBuilder builder = new StringBuilder();
builder.append("insert or replace into ");
builder.append(tableName);
builder.append(" (");
while(keys.hasNext()){
builder.append(keys.next()).append(",");
}
builder.setLength(builder.length() - 1);
builder.append(") values(");
keys = record.keys();
JSArray valuesArray = new JSArray();
while(keys.hasNext()){
String key = keys.next();
if( record.get(key) != null && record.get(key) instanceof String) {
//record.get(key).replace(/\'/g,'\'\'') ;
}
builder.append("?").append(",");
valuesArray.put(record.get(key));
}
builder.deleteCharAt(builder.length() - 1);
builder.append(");");
JSONObject ret = new JSONObject();
ret.put("query",builder.toString());
ret.put("values",valuesArray);
return ret.toString();
}
如何解决以上错误?
请提供任何帮助。
谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)