zoukankan      html  css  js  c++  java
  • cordova调用本地SQLite数据库的方法

    第一篇技术博客,写下来和大家分享今天所学,其次自己也巩固一下。  

      整个下午的时间用来钻研如何用cordova调用移动端本地SQLite数据库。首先我并不是用eclipse来编程的,而是用cordova建立project后直接用notepad编辑www下的index文件。

    一、cordova的下载安装和建立project的方法

    该部分不是文章重点,抽空另开一篇文章详细介绍。官网上有相关教程:http://cordova.apache.org/docs/en/5.0.0/guide_cli_index.md.html#The%20Command-Line%20Interface(插一句,测试时尽量用真机,虚拟机实在太慢)

    二、插件下载

    调用SQLite需要使用cordova的插件cordova-sqlite-storage,下载方法为在所建的project目录下打开cmd,输入cordova plugin add cordova-sqlite-storage回车。

    三、插件的使用

    参考资源:https://www.npmjs.com/package/cordova-sqlite-storage

    使用sqlite数据库的基本步骤

    (1)建立连接

       有两种方法可用来创建并打开对数据库的一个连接:

    • var db = window.sqlitePlugin.openDatabase({name: "my.db"});  //my.db表示数据库名称
    • var db = window.sqlitePlugin.openDatabase("myDatabase.db", "1.0", "Demo", -1); //myDatabase.db代表数据库名称,1.0是版本号,Demo是描述信息,第四个参数参考其他资料应该是预估数据库大小,-1代表什么自己也没搞懂,请大神指点。

    (2)执行SQL操作

       使用db.transaction()方法来执行一个SQL操作,该方法只有一个参数。该参数是一个函数,并且通常是匿名的,可以直接定义在db.transaction()中。如:

    db.transaction(function(tx)

    {

    ...

    });

      这个匿名函数具有一个事务类型的参数tx,它是一个事务对象,该事物对象具有一个方法:executeSql(),使用该方法可以执行SQL语句。

      该方法有四个参数,其中后三个参数是可选的:

    • 查询字符串
    • 替换参数化查询中的占位符的数据
    • SQL执行成功时调用的回调函数
    • SQL执行失败时调用的回调函数

    例如下面的代码,同时定义了四个参数:

    tx.executeSql("INSERT INTO test_table (data, data_num) VALUES (?,?)"["test"100]function1,function2);

    (3)对结果进行处理

      3.1 当SQL操作执行成功时回执行一个回调函数,即上文中的funciton1,该函数有两个参数,一个是执行他的事物对象tx,另一个是操作返回的结果res(下面会详细介绍),即:

    function function1(tx,res)

    {

    ...

    }

      3.2当SQL操作失败时就会调用function2,该函数也有两个参数,一个是tx,另一个是错误对象,通过该错误对象可以获知具体的错误信息:

    function function2(tx,err)

    {

    alert(err.message);

    }

      3.3 成功使用executeSql()方法执行的SQL语句可以返回一个执行结果即上文中的res,该执行结果回作为回调函数的一个参数。

    执行结果是一个SQLResultSet对象,由SQLResultSet接口定义:

    interface SQLResultSet{

      readonly attribute long insertId;

      readonly attribute long rowsAffected;

      readonly attribute SQLResultRowList rows;

    };

      1、属性insertId返回记录行的行ID,每个SQL INSERT插入操作会自动插入一个行ID,如果插入多行,则该属性返回最后一行的行ID;如果不存在记录行则调用该属性时抛出INVALID_ACCESS_ERR异常。

      2、属性rowsAffect返回SQL语句所改变的记录行的行数,如果没有任何改变,则该属性返回0;

      3、属性rows 返回一个SQLResultList 对象,表示返回的所用记录行,结果按照数据库中的序列排列,如果没有数据,则返回空对象,即SQLResultList.length属相值为0;

    SQLResultList对象由SQLResultList 接口定义:

    interface SQLResultSetRowList{

      readonly attribute unsigned long length;

      getter any item(in unsigned long index);

    };

      1、属性length表示返回记录行的总行数。

      2、item(x)方法根据索引号x获取一个指定的行(下标从0开始)。如果不存在指定的索引号,则该方法返回null。

      一行就是一个javascript Object类型的对象,每个记录行的属性名相当于对象的属性名,例如row={id:0,data:“test”,data_num:100},使用对象语法可以获取每个属性的值,如row["data"](记得加引号)。

    整体代码如下:

    在手机上显示结果为:

    data_num=100

    data=test

    id=0

     1 <!DOCTYPE HTML>
     2 <html>
     3 <head>
     4 <meta charset="utf-8">
     5 <script src="cordova.js" type="text/javascript"></script>
     6 <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.0/themes/smoothness/jquery-ui.css">
     7 <script src="http://code.jquery.com/jquery-1.10.2.js"></script>
     8 <script src="http://code.jquery.com/ui/1.11.0/jquery-ui.js"></script>
     9   <link rel="stylesheet" href="http://jqueryui.com/resources/demos/style.css">
    10   <link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.2/jquery.mobile-1.3.2.min.css">
    11   <script src="http://code.jquery.com/mobile/1.3.2/jquery.mobile-1.3.2.min.js"></script>
    12 </head>
    13 <body>
    14 <script>
    15 document.addEventListener("deviceready", onDeviceReady, false);
    16 
    17 function onDeviceReady() {
    18   var db = window.sqlitePlugin.openDatabase("Database", "1.0", "Demo", -1);
    19  
    20   db.transaction(function(tx) {
    21     tx.executeSql('DROP TABLE IF EXISTS test_table');
    22     tx.executeSql('CREATE TABLE IF NOT EXISTS test_table (id integer primary key, data text, data_num integer)');
    23  
    24     tx.executeSql("INSERT INTO test_table (data, data_num) VALUES (?,?)", ["test", 100], function(tx, res) {
    25       tx.executeSql("select * from test_table", [], function(tx, res) {
    26         alert("hello world");
    27         var row=res.rows.item(0);
    28         for(var j in row){
    29          document.write(j+"="+row[j]+"<br />");
    30         }
    31       });
    32     }, function(e) {
    33       alert("ERROR: " + e.message);
    34     });
    35   });
    36 }
    37 </script>
    38 </body>
    39 </html>
  • 相关阅读:
    软连接
    libmysqlclient.so.18 not found 的解决方法
    查找某个文件并全部删除
    sudo passwd root:没有相关指令
    智能解析套件
    日志类封装
    windows安装mysql
    xshell报错Socket error Event: 32 Error: 10053
    appium简明教程(8)——那些工具
    appium简明教程(7)——Desired Capabilities详解
  • 原文地址:https://www.cnblogs.com/undercurrent/p/4733190.html
Copyright © 2011-2022 走看看