UNPKG

nativescript-toolbox-sw

Version:

Fork of nativescript-toolbox - A NativeScript module that is a composition of useful classes, tools and helpers.

283 lines (216 loc) 10.2 kB
# NativeScript sqlite A NativeScript module providing sqlite actions for Android and iOS. ## License This is released under the MIT License, meaning you are free to include this in any type of program -- However for entities that need a support contract, changes, enhancements and/or a commercial license please contact me (nathan@master-technology.com). ## Encrypted SQLite If you need encrypted sqlite, please contact nathan@master-technology.com for more information. ## Example Application An example application can be cloned from https://github.com/NathanaelA/nativescript-sqlite-example To use you need to do: 1. `npm install tns-core-modules` 2. `tns platform add ios` or `tns platform add android` 3. `tns plugin add nativescript-sqlite` Then run the app the normal way you would. ## Installation First run `tns --version` ### v1.2.0 or later (Android) Run `tns plugin add nativescript-sqlite` in your ROOT directory of your project. ### v1.4.3 or later (iOs) For the new seemless iOS install; you need to be running version 1.4.3 of the NativeScript command line. Run `tns plugin add nativescript-sqlite` in your ROOT directory of your project. ### v1.4.2 or earlier If you are running an earlier version of nativescript; then do a `npm install -g nativescript` to install the latest version of NativeScript. ## Usage To use the sqlite module you must first `require()` it: ```js var Sqlite = require( "nativescript-sqlite" ); ``` After you have a reference to the module you can then call the available methods. The database defaults to returning result sets in arrays; i.e. [[field1, field2, ...], [field1, field2], [field1, field2] ...] you can change this to returning them in objects if you desire. ## Shipping a Database with the application If you are planning on shipping a database with the application; drop the file in your projects /app folder. The Sqlite.copyDatabase("database_name") will copy the database from that folder to the proper database folder on your platform. ### Callbacks * All callbacks have the standard (Error, result) prototype * USE CALLBACKS or PROMISES; it is not recommended to use both ### Promises * Will either call your *reject* with the error or the *resolve* with the answer * USE CALLBACKS or PROMISES; it is not recommended to use both ### Constants * Sqlite.RESULTSASARRAY - Returns results as Arrays (ex: select name, phone --- results [[name,phone]]) * Sqlite.RESULTSASOBJECT - Returns results as Objects (ex: select name, phone --- results [{name: name, phone: phone}] * Sqlite.VALUESARENATIVE - Returns the values as the native values; i.e. Integer = Integer, Float = Number * Sqlite.VALUESARESTRINGS - Returns all the values as a string; so the Integer 1 would be returned as "1" ### Methods #### new Sqlite(dbname, options, callback) ##### Parameters * dbname: your database name. This can be ":memory:" for a memory Database. This can be "" for a Temporary Database. * options - currently the only option is "readOnly", which if set to true will make the db read only when it opens it * (optional) callback (error, db): db is the fully OPEN database object that allows interacting with the db. * RETURNS: promise of the DB object You should choose either to use a promise or a callback; you can use whichever you are most comfortable with -- however, as with this example, you CAN use both if you want; but side effects might occur. ```js // my-page.js var Sqlite = require( "/path/to/node_modules/nativescript-sqlite" ); var db_promise = new Sqlite("MyTable", function(err, db) { if (err) { console.error("We failed to open database", err); } else // This should ALWAYS be true, db object is open in the "Callback" if no errors occurred console.log("Are we open yet (Inside Callback)? ", db.isOpen() ? "Yes" : "No"); // Yes } }); db_promise.then(function(db) { // This should ALWAYS be true, db object is open in the "then" console.log("Are we open yet (Inside Promise)? ", db.isOpen() ? "Yes" : "No"); // Yes db.close(); }, function(err) { console.error("We failed to open database", err); }); ``` #### Sqlite.isSqlite ##### Parameters * object to check * RETURNS: Boolean, True or False if the object passed to this function is a sqlite database ```js // my-page.js new Sqlite("test.db", function(err, db) { console.log("Is a Sqlite Database:", Sqlite.isSqlite(db) ? "Yes" : "No); // Should print "Yes" }); ``` #### Sqlite.exists ##### Parameters * database name * RETURNS: Boolean, True if the database exists in the App/OS Database folder #### Sqlite.deleteDatabase * database name to delete in the App/OS Database folder * RETURNS: Nothing #### Sqlite.copyDatabase * database name to copy from your app folder to the proper database folder on the OS * RETURNS: True if copy was successful * NOTES: This will only copy the file if it does not already exist at the destination. ```js // If we are in Debug Code, we always delete the database first so that the latest copy of the database is used... if (DEBUGMODE && Sqlite.exists("mydatabase.sqlite")) { Sqlite.deleteDatabase("mydatabase.sqlite"); } if (!Sqlite.exists("mydatabase.sqlite")) { Sqlite.copyDatabase("mydatabase.sqlite"); } ``` ### DB Methods = Returned Database Object from Constructor #### DB.version ##### Parameters * Value to set it to, or a Callback for retrieving the value. If Callback Value will have the version. On a new Database it will be Zero If Version number, then the database will be changed to the version you passed to this function * RETURNS: Promise. ```js new Sqlite("test.db", function(err, db) { db.version(function(err, ver) { if (ver === 0) { db.execSQL("Create table...."); db.version(1); // Sets the version to 1 } }); }; ``` #### DB.isOpen * RETURNS: Boolean, Is the current database open true/false #### DB.resultType ##### Parameters * Pass in Sqlite.RESULTSASOBJECT or Sqlite.RESULTSASARRAY to change the result sets configuration This will set the database to return the results in which ever choice you make. (Default is RESULTSASARRAY) #### DB.valueType ##### Parameters * Pass in Sqlite.VALUESARENATIVE or Sqlite.VALUESARESTRING to change the result sets configuration This will set the database to return the results to which ever choice you make. (Default is VALUESARENATIVE) #### DB.close * Closes the database * RETURNS: Promise NOTE: Any DB calls after this will throw errors. #### DB.execSQL ##### Parameters * SQL statement to run, can use ? for Parameters * Params (Optional) - an array of Parameters * Callback will either return null or the last id inserted or the record count of update/delete This routine you can use for "update", "insert", "delete" and any other sqlite command where you are not expecting a result set back. If this is a Insert it will return the last row id of the new inserted record. If it is a update/insert it will return the number of rows affected. * RETURNS: Promise; resolved results are the same as the callback values. ```js // new SQLite(.... db.execSQL("insert into Hello (word) values (?)", ["Hi"], function(err, id) { console.log("The new record id is:", id); }); ``` ```js // new SQLite(.... var promise = db.execSQL("insert into Hello (word) values (?)", ["Hi"]); promise.then(function(id) { console.log("The new record id is:", id); }); ``` #### DB.get ##### Parameters * SQL SELECT statement, can use ? for parameters * Params (Optional) * Callback will have the first row of the result set. * RETURNS: Promise, will has have first row. ```js // new SQLite(... db.get('select * from Hello where id=?', [1], function(err, row) { console.log("Row of data was: ", row); // Prints [["Field1", "Field2",...]] }); ``` ```js // new SQLite(... var promise = db.get('select * from Hello where id=?', [1]); promise.then(function(row) { console.log("Row of data was: ", row); // Prints [["Field1", "Field2",...]] }); ``` #### DB.all ##### Parameters * SQL SELECT statement, can use ? for parameters * Params (Optional) * Callback will have the all the rows of the result set. * RETURNS: Promise, will have all the rows of the result set. ```js // new SQLite(... db.all('select * from Hello where id > ? and id < ?', [1,100], function(err, resultSet) { console.log("Result set is:", resultSet); // Prints [["Row_1 Field_1" "Row_1 Field_2",...], ["Row 2"...], ...] }); ``` ```js // new SQLite(... var promise = db.all('select * from Hello where id > ? and id < ?', [1,100]); promise.then(function(resultSet) { console.log("Result set is:", resultSet); // Prints [["Row_1 Field_1" "Row_1 Field_2",...], ["Row 2"...], ...] }); ``` #### DB.each ##### Parameters * SQL Select statement, can use ? for parameters * Params (Optional) * Callback (REQUIRED) will be called for EACH row of the result set with the current row value * Finished_Callback (Optional) will be called when it is complete with the number of rows handled. * RETURNS: Promise; please note the per row CALLBACK is still required; otherwise you won't have any results... ```js // new SQLite(... db.each('select * from Hello where id >= ? and id <= ?', [1, 100], function (err, row) { console.log("Row results it:", row); // Prints ["Row x Field_1", "Row x Field 2"...] for each row passed to it }, function (err, count) { console.log("Rows displayed:", count); // Prints 100 (Assuming their are a 100 rows found) }); ``` ```js // new SQLite(... var promise = db.each('select * from Hello where id >= ? and id <= ?', [1, 100], function (err, row) { console.log("Row results it:", row); // Prints ["Row x Field_1", "Row x Field 2"...] for each row passed to it }); promise.then(function (count) { console.log("Rows displayed:", count); // Prints 100 (Assuming their are a 100 rows found) }); ```