Fix Android version to handle multiple databases (#2)

This commit is contained in:
Chris Brody 2012-12-04 21:18:15 +01:00
parent 938bce69b8
commit ca74669116
3 changed files with 65 additions and 38 deletions

View File

@ -44,7 +44,7 @@ do ->
console.log "SQLitePlugin::executePragmaStatement" console.log "SQLitePlugin::executePragmaStatement"
pcb = success pcb = success
cordova.exec (-> 1), error, "SQLitePlugin", "executePragmaStatement", [ "A-1", statement ] cordova.exec (-> 1), error, "SQLitePlugin", "executePragmaStatement", [ @dbPath, statement ]
return return
SQLitePluginCallback = SQLitePluginCallback =
@ -81,6 +81,7 @@ do ->
transaction_callback_queue[@trans_id] = new Object() transaction_callback_queue[@trans_id] = new Object()
return return
# XXX FUTURE handle tx CBs under SQLitePluginCallback object:
SQLitePluginTransaction.queryCompleteCallback = (transId, queryId, result) -> SQLitePluginTransaction.queryCompleteCallback = (transId, queryId, result) ->
console.log "SQLitePluginTransaction.queryCompleteCallback" console.log "SQLitePluginTransaction.queryCompleteCallback"
query = null query = null
@ -198,10 +199,13 @@ do ->
if error if error
errorcb = (res) -> errorcb = (res) ->
error txself, res error txself, res
transaction_callback_queue[@trans_id]["success"] = successcb transaction_callback_queue[@trans_id]["success"] = successcb
transaction_callback_queue[@trans_id]["error"] = errorcb transaction_callback_queue[@trans_id]["error"] = errorcb
cordova.exec null, null, "SQLitePlugin", "executeSqlBatch", transaction_queue[@trans_id]
cordova.exec null, null, "SQLitePlugin", "executeSqlBatch", [ @dbPath, transaction_queue[@trans_id] ]
# XXX FUTURE all CBs under SQLitePluginCallback
# required for callbacks: # required for callbacks:
root.SQLitePluginTransaction = SQLitePluginTransaction root.SQLitePluginTransaction = SQLitePluginTransaction
root.SQLitePluginCallback = SQLitePluginCallback root.SQLitePluginCallback = SQLitePluginCallback

View File

@ -50,7 +50,7 @@
pcb = success; pcb = success;
cordova.exec((function() { cordova.exec((function() {
return 1; return 1;
}), error, "SQLitePlugin", "executePragmaStatement", ["A-1", statement]); }), error, "SQLitePlugin", "executePragmaStatement", [this.dbPath, statement]);
}; };
SQLitePluginCallback = { SQLitePluginCallback = {
p1: function(id, result) { p1: function(id, result) {
@ -230,7 +230,7 @@
} }
transaction_callback_queue[this.trans_id]["success"] = successcb; transaction_callback_queue[this.trans_id]["success"] = successcb;
transaction_callback_queue[this.trans_id]["error"] = errorcb; transaction_callback_queue[this.trans_id]["error"] = errorcb;
return cordova.exec(null, null, "SQLitePlugin", "executeSqlBatch", transaction_queue[this.trans_id]); return cordova.exec(null, null, "SQLitePlugin", "executeSqlBatch", [this.dbPath, transaction_queue[this.trans_id]]);
}; };
root.SQLitePluginTransaction = SQLitePluginTransaction; root.SQLitePluginTransaction = SQLitePluginTransaction;
root.SQLitePluginCallback = SQLitePluginCallback; root.SQLitePluginCallback = SQLitePluginCallback;

View File

@ -20,17 +20,21 @@ import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import android.database.sqlite.*; import android.database.sqlite.*;
import java.util.HashMap;
import android.util.Log; import android.util.Log;
public class SQLitePlugin extends Plugin { public class SQLitePlugin extends Plugin {
/**
// Data Definition Language * Multiple database map.
SQLiteDatabase myDb = null; // Database object */
HashMap<String, SQLiteDatabase> myDbMap;
/** /**
* Constructor. * Constructor.
*/ */
public SQLitePlugin() { public SQLitePlugin() {
myDbMap = new HashMap<String, SQLiteDatabase>();
} }
/** /**
@ -55,11 +59,16 @@ public class SQLitePlugin extends Plugin {
//this.openDatabase(args.getString(0), args.getString(1), //this.openDatabase(args.getString(0), args.getString(1),
// args.getString(2), args.getLong(3)); // args.getString(2), args.getLong(3));
} }
// XXX TODO:
else if (action.equals("close")) {
Log.v("error", "NOT IMPLEMENTED"); // XXX TODO
}
else if (action.equals("executePragmaStatement")) else if (action.equals("executePragmaStatement"))
{ {
String id = args.getString(0); String dbName = args.getString(0);
String query = args.getString(1); String query = args.getString(1);
Cursor myCursor = this.myDb.rawQuery(query, null);
Cursor myCursor = this.getDatabase(dbName).rawQuery(query, null);
this.processPragmaResults(myCursor, id); this.processPragmaResults(myCursor, id);
} }
else if (action.equals("executeSqlBatch")) else if (action.equals("executeSqlBatch"))
@ -72,17 +81,20 @@ public class SQLitePlugin extends Plugin {
int paramLen = 0; int paramLen = 0;
JSONArray[] jsonparams = null; JSONArray[] jsonparams = null;
if (args.isNull(0)) { String dbName = args.getString(0);
JSONArray txargs = args.getJSONArray(1);
if (txargs.isNull(0)) {
queries = new String[0]; queries = new String[0];
} else { } else {
int len = args.length(); int len = txargs.length();
queries = new String[len]; queries = new String[len];
queryIDs = new String[len]; queryIDs = new String[len];
jsonparams = new JSONArray[len]; jsonparams = new JSONArray[len];
for (int i = 0; i < len; i++) for (int i = 0; i < len; i++)
{ {
a = args.getJSONObject(i); a = txargs.getJSONObject(i);
queries[i] = a.getString("query"); queries[i] = a.getString("query");
queryIDs[i] = a.getString("query_id"); queryIDs[i] = a.getString("query_id");
trans_id = a.getString("trans_id"); trans_id = a.getString("trans_id");
@ -92,7 +104,7 @@ public class SQLitePlugin extends Plugin {
} }
} }
if(trans_id != null) if(trans_id != null)
this.executeSqlBatch(queries, jsonparams, queryIDs, trans_id); this.executeSqlBatch(dbName, queries, jsonparams, queryIDs, trans_id);
else else
Log.v("error", "null trans_id"); Log.v("error", "null trans_id");
} }
@ -119,10 +131,12 @@ public class SQLitePlugin extends Plugin {
*/ */
@Override @Override
public void onDestroy() { public void onDestroy() {
/** XXX TODO :
if (this.myDb != null) { if (this.myDb != null) {
this.myDb.close(); this.myDb.close();
this.myDb = null; this.myDb = null;
} }
**/
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
@ -141,28 +155,31 @@ public class SQLitePlugin extends Plugin {
* @param size * @param size
* The size in bytes * The size in bytes
*/ */
public void openDatabase(String db, String version, String display_name, private void openDatabase(String db, String version, String display_name,
long size) { long size) {
SQLiteDatabase myDb = this.cordova.getActivity().getApplicationContext().openOrCreateDatabase(db + ".db", Context.MODE_PRIVATE, null);
// If database is open, then close it myDbMap.put(db, myDb);
if (this.myDb != null) {
this.myDb.close();
} }
this.myDb = this.cordova.getActivity().getApplicationContext().openOrCreateDatabase(db + ".db", Context.MODE_PRIVATE, null); private SQLiteDatabase getDatabase(String dbName) {
return myDbMap.get(dbName);
} }
public void executeSqlBatch(String[] queryarr, JSONArray[] jsonparams, String[] queryIDs, String tx_id) { private void executeSqlBatch(String dbName, String[] queryarr, JSONArray[] jsonparams, String[] queryIDs, String tx_id) {
SQLiteDatabase myDb = this.getDatabase(dbName); // XXX TODO check for null
try { try {
this.myDb.beginTransaction(); myDb.beginTransaction();
String query = ""; String query = "";
String query_id = ""; String query_id = "";
int len = queryarr.length; int len = queryarr.length;
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
query = queryarr[i]; query = queryarr[i];
query_id = queryIDs[i]; query_id = queryIDs[i];
if (query.toLowerCase().startsWith("insert") && jsonparams != null) { if (query.toLowerCase().startsWith("insert") && jsonparams != null) {
SQLiteStatement myStatement = this.myDb.compileStatement(query); SQLiteStatement myStatement = myDb.compileStatement(query);
for (int j = 0; j < jsonparams[i].length(); j++) { for (int j = 0; j < jsonparams[i].length(); j++) {
if (jsonparams[i].get(j) instanceof Float || jsonparams[i].get(j) instanceof Double ) { if (jsonparams[i].get(j) instanceof Float || jsonparams[i].get(j) instanceof Double ) {
myStatement.bindDouble(j + 1, jsonparams[i].getDouble(j)); myStatement.bindDouble(j + 1, jsonparams[i].getDouble(j));
@ -189,13 +206,13 @@ public class SQLitePlugin extends Plugin {
} }
} }
Cursor myCursor = this.myDb.rawQuery(query, params); Cursor myCursor = myDb.rawQuery(query, params);
this.processResults(myCursor, query_id, tx_id); this.processResults(myCursor, query_id, tx_id);
myCursor.close(); myCursor.close();
} }
} }
this.myDb.setTransactionSuccessful(); myDb.setTransactionSuccessful();
} }
catch (SQLiteException ex) { catch (SQLiteException ex) {
ex.printStackTrace(); ex.printStackTrace();
@ -207,7 +224,7 @@ public class SQLitePlugin extends Plugin {
this.sendJavascript("SQLitePluginTransaction.txErrorCallback('" + tx_id + "', '"+ex.getMessage()+"');"); this.sendJavascript("SQLitePluginTransaction.txErrorCallback('" + tx_id + "', '"+ex.getMessage()+"');");
} }
finally { finally {
this.myDb.endTransaction(); myDb.endTransaction();
Log.v("executeSqlBatch", tx_id); Log.v("executeSqlBatch", tx_id);
this.sendJavascript("SQLitePluginTransaction.txCompleteCallback('" + tx_id + "');"); this.sendJavascript("SQLitePluginTransaction.txCompleteCallback('" + tx_id + "');");
} }
@ -221,11 +238,12 @@ public class SQLitePlugin extends Plugin {
* @param tx_id * @param tx_id
* Transaction id * Transaction id
*/ */
public void processResults(Cursor cur, String query_id, String tx_id) { private void processResults(Cursor cur, String query_id, String tx_id)
{
String result = "[]"; String result = "[]";
// If query result has rows // If query result has rows
// XXX TODO use results2string() and do test:
if (cur.moveToFirst()) { if (cur.moveToFirst()) {
JSONArray fullresult = new JSONArray(); JSONArray fullresult = new JSONArray();
String key = ""; String key = "";
@ -280,8 +298,15 @@ public class SQLitePlugin extends Plugin {
} }
public void processPragmaResults(Cursor cur, String id) { private void processPragmaResults(Cursor cur, String id)
{
String result = this.results2string(cur);
this.sendJavascript(" SQLitePluginCallback.p1('" + id + "', " + result + ");");
}
private String results2string(Cursor cur)
{
String result = "[]"; String result = "[]";
// If query result has rows // If query result has rows
@ -297,7 +322,6 @@ public class SQLitePlugin extends Plugin {
for (int i = 0; i < colCount; ++i) { for (int i = 0; i < colCount; ++i) {
key = cur.getColumnName(i); key = cur.getColumnName(i);
// XXX TBD factor out:
// for old Android SDK remove lines from HERE: // for old Android SDK remove lines from HERE:
if(android.os.Build.VERSION.SDK_INT >= 11) if(android.os.Build.VERSION.SDK_INT >= 11)
{ {
@ -337,7 +361,6 @@ public class SQLitePlugin extends Plugin {
result = fullresult.toString(); result = fullresult.toString();
} }
this.sendJavascript(" SQLitePluginCallback.p1('" + id + "', " + result + ");"); return result;
} }
} }