{"id":3903,"date":"2014-12-09T11:54:17","date_gmt":"2014-12-09T13:54:17","guid":{"rendered":"http:\/\/blog.turbosite.com.br\/?p=3903"},"modified":"2014-12-09T11:54:17","modified_gmt":"2014-12-09T13:54:17","slug":"sql-do-lado-do-cliente-web-sql-database-com-html5","status":"publish","type":"post","link":"https:\/\/www.turbosite.com.br\/blog\/sql-do-lado-do-cliente-web-sql-database-com-html5\/","title":{"rendered":"SQL do lado do Cliente? Web SQL Database com HTML5"},"content":{"rendered":"<p>J\u00e1 pensou em utilizar SQL do lado do Cliente? Bom, agora isso \u00e9 poss\u00edvel, com o HTML 5 podemos utilizar o\u00a0Web SQL Database.<\/p>\n<p>Ele traz uma API de banco de dados SQL Web, por enquanto ainda \u00e9 uma especifica\u00e7\u00e3o separada do HTML 5, mas j\u00e1 introduz um conjunto de APIs para manipular base de dados do lado do cliente utilizando SQL.<\/p>\n<p>Estamos supondo que voc\u00ea j\u00e1 conhe\u00e7a e trabalhe com o SQL, mas caso n\u00e3o saiba o que \u00e9, recomendamos um <a href=\"https:\/\/www.youtube.com\/watch?v=EjE57WqB7xg&amp;list=PLyH68Dr1pa5ym3xKGelKhDkjfe-MfBWCJ\" target=\"_blank\">mini curso de MySQL<\/a>.<\/p>\n<p>Por enquanto, Web SQL Database est\u00e1 suportado nas \u00faltimas vers\u00f5es do Chorme, Safari e Opera.<\/p>\n<p>Esta postagem \u00e9 baseada no artigo em ingl\u00eas:<a href=\"http:\/\/www.tutorialspoint.com\/html5\/html5_web_sql.htm\" target=\"_blank\"> Web SQL Database<\/a><\/p>\n<p>&nbsp;<\/p>\n<h2>Os m\u00e9todos principais:<\/h2>\n<p>H\u00e1 tr\u00eas seguintes m\u00e9todos fundamentais definidos na especifica\u00e7\u00e3o de que vamos\u00a0mostrar nesta postagem:<\/p>\n<ol>\n<li><b>openDataBase:<\/b> Este m\u00e9todo cria o objeto de banco de dados, depois utiliza um\u00a0banco de dados existente ou criar um novo.<\/li>\n<li><b>transaction:<\/b> Este m\u00e9todo controlar a transa\u00e7\u00e3o e \u00a0nos retorna uma confirma\u00e7\u00e3o ou anula\u00e7\u00e3o com base no que foi executado.<\/li>\n<li><b>executeSql:<\/b> Este m\u00e9todo \u00e9 usado para executar um\u00a0consulta SQL.<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<h2>Abrindo Base de dados:<\/h2>\n<p>O o<i>penDataBase<\/i> m\u00e9todo cuida da abertura de um banco de dados se ele j\u00e1 existe, este m\u00e9todo ir\u00e1 cri\u00e1-lo se ele n\u00e3o existe.<\/p>\n<p>Para criar e abrir um banco de dados, use o seguinte c\u00f3digo:<\/p>\n<pre class=\"top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true\">var db = openDatabase ('Teste', '1.0', 'Teste Web SQL Database', 2 * 1024 * 1024);\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Acima m\u00e9todo tem\u00a0quatro par\u00e2metros:<\/p>\n<ol>\n<li>Nome do banco<\/li>\n<li>N\u00famero da vers\u00e3o<\/li>\n<li>Descri\u00e7\u00e3o de texto<\/li>\n<li>Tamanho da base de dados<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<h2>Execu\u00e7\u00e3o de consultas:<\/h2>\n<p>Para executar uma consulta, deve ser utilizado a fun\u00e7\u00e3o database.transaction (). Esta fun\u00e7\u00e3o precisa de um \u00fanico argumento, mas pode ser passado o 2\u00ba e 3\u00ba parametro para verificar se foi completado com sucesso o comando, segue exemplo de duas consultas, uma simples e outra debugando:<\/p>\n<pre class=\"top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true\">var db = openDatabase ('Teste', '1.0', 'Teste Web SQL Database', 2 * 1024 * 1024);\n\n\/\/ Simples\ndb.transaction (function (tx) {  \n   tx.executeSql (\"CREATE TABLE IF NOT EXISTS LOGS (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, log)\");\n});\n\n\/\/ Debugando\ndb.transaction (function (tx) {  \n   tx.executeSql (\"CREATE TABLE IF NOT EXISTS LOGS (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, log)\",\n       function(tx){\n           \/*Sucesso*\/\n       },\n       function(erro){\n           \/*Error*\/\n       });\n});<\/pre>\n<p>&nbsp;<\/p>\n<p>As consultas acima ir\u00e3o criar uma tabela chamada LOGS na base de dados &#8220;Teste&#8217;.<\/p>\n<p>&nbsp;<\/p>\n<h2>Inserir dados:<\/h2>\n<p>Para inserir dados\u00a0\u00a0na tabela, utilizamos a fun\u00e7\u00e3o transaction() tamb\u00e9m, s\u00f3 que, desta vez com o INSERT para popular a tabela, veja o exemplo:<\/p>\n<pre class=\"top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true\">var db = openDatabase ('Teste', '1.0', 'Teste Web SQL Database', 2 * 1024 * 1024);\n\ndb.transaction (function (tx) {\n   tx.executeSql (\"CREATE TABLE IF NOT EXISTS LOGS (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, log)\");\n\n   \/\/ Os 3 null represetam\n   \/\/ 1\u00ba - Um array contendo dados\n   \/\/ 2\u00ba - Fun\u00e7\u00e3o para sucesso\n   \/\/ 3\u00ba - Fun\u00e7\u00e3o para Erro\n   \/\/ Vamos explic\u00e1-los mais abaixo\n   tx.executeSql (\"INSERT INTO LOGS (log) VALUES ('Resultado do Log de Teste 01') \", null, null, null);\n   tx.executeSql (\"INSERT INTO LOGS (log) VALUES ('Resultado do Log de Teste 02') \", null, null, null);\n});<\/pre>\n<p>&nbsp;<\/p>\n<p>Tamb\u00e9m\u00a0podemos passar valores din\u00e2micos, utilizamos a seguinte sintaxe:<\/p>\n<pre class=\"top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true\">var db = openDatabase ('Teste', '1.0', 'Teste Web SQL Database', 2 * 1024 * 1024);\n\ndb.transaction (function (tx) {\n\n  var novo_log = 'Resultado do Log de Teste 01';\n\n   \/\/ Os 3 null est\u00e3o sendo mostrados aqui\n   \/\/ 1\u00ba - Um array contendo dados, estamos passando apenas um valor com o novo_log\n   \/\/ 2\u00ba - Fun\u00e7\u00e3o para sucesso\n   \/\/ 3\u00ba - Fun\u00e7\u00e3o para Erro\n   \/\/ Vamos explic\u00e1-los mais abaixo\n  tx.executeSql (\"CREATE TABLE IF NOT EXISTS LOGS (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, log)\");\n  tx.executeSql (\"INSERT INTO REGISTROS (log) VALUES (?)\",[novo_log],null,null);\t\t\t\t\t\t\n});<\/pre>\n<p>&nbsp;<\/p>\n<p>Aqui novo_log \u00e9 uma vari\u00e1vel e executeSql mapeia cada item no argumento de matriz para o &#8220;?&#8221;, isto \u00e9, poder\u00edamos ter v\u00e1rios &#8220;?&#8221; e no final ter\u00edamos [var_1,var_2,var_3], sendo que, ele utilizar\u00e1 a ordem exata das vari\u00e1veis para popular a query.<\/p>\n<p>&nbsp;<\/p>\n<h2>Lendo os dados:<\/h2>\n<p>Para ler os registros j\u00e1 existentes usamos um callback para capturar os resultados da seguinte forma:<\/p>\n<pre class=\"top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true\">var db = openDatabase ('Teste', '1.0', 'Teste Web SQL Database', 2 * 1024 * 1024);\n\ndb.transaction (function (tx) {\n    tx.executeSql (\"CREATE TABLE IF NOT EXISTS LOGS (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, log TEXT)\",null,null);\n    tx.executeSql (\"INSERT INTO LOGS (log) VALUES (?)\",['Resultado do Log de Teste 01'],null,null);\n    tx.executeSql (\"INSERT INTO LOGS (log) VALUES (?)\",['Resultado do Log de Teste 02'],null,null);\n});\n\ndb.transaction (function (tx) {\n   tx.executeSql ('SELECT * FROM LOGS', [], function (tx, results) {\n   var len = results.rows.length, i;\n   msg = \"&lt;p&gt; Registros encontrados:\" + len + \"&lt;\/ p&gt;\";\n   for (i = 0; i &lt;len; i ++) {\n      console.log(results.rows.item(i) .log);\n   }\n }, null);\n});<\/pre>\n<p>&nbsp;<\/p>\n<h2>Exemplo final:<\/h2>\n<p>Ent\u00e3o, finalmente, vamos \u00a0criar um exemplo em HTML 5, \u00a0este exemplo est\u00e1 funcional e testado no Chrome vers\u00e3o Vers\u00e3o 39.0.2171.71 m.<\/p>\n<pre class=\"top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true\">var db = openDatabase ('Teste', '1.0', 'Teste Web SQL Database', 2 * 1024 * 1024);\n\ndb.transaction (function (tx) {\n    tx.executeSql (\"CREATE TABLE IF NOT EXISTS LOGS (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, log TEXT)\",null,null);\n    tx.executeSql (\"INSERT INTO LOGS (log) VALUES (?)\",['Resultado do Log de Teste 01'],null,null);\n    tx.executeSql (\"INSERT INTO LOGS (log) VALUES (?)\",['Resultado do Log de Teste 02'],null,null);\n   console.log('Log mensagem criada e linha inserida');\n});\n\ndb.transaction(function(tx){\n    tx.executeSql(       \n        \"SELECT * FROM LOGS\",\n        [],\n        function(tx, result){\n            console.log('Deu certo!');\n            var len = result.rows.length, i;\n            for(i=0;i&lt;len;i++){\n                console.log( result.rows.item(i) );\n            }\n        },\n        function(tx, error){\n            console.log('Deu errado!');\n            console.log(error);\n        }\n    );\n});<\/pre>\n<p>&nbsp;<\/p>\n<p>Isso produziria o seguinte resultado:<\/p>\n<pre class=\"top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true\">Log mensagem criada e linha inserida\nDeu certo!\nObject {id: 1, log: \"Resultado do Log de Teste 01\"}\nObject {id: 2, log: \"Resultado do Log de Teste 02\"}\n<\/pre>\n<p>&nbsp;<\/p>\n<h2>Conclus\u00e3o:<\/h2>\n<p>\u00c9 bem simples utilizar e depende apenas de um pouco de treino, nos testes detectamos que a sua persist\u00eancia \u00e9 como uma sess\u00e3o, ao fechar o browser perde-se o objeto, mas ao trocar de p\u00e1gina dentro do mesmo dom\u00ednio o mesmo permanece.<\/p>\n<p>J\u00e1 pensou em utilizar esta nova funcionalidade com o evento <a href=\"https:\/\/www.turbosite.com.br\/blog\/aviso-de-alteracoes-na-pagina-para-nao-perder-dados-javascript\/\" target=\"_blank\">onBeforeUnload\u00a0<\/a>para rastrear todo o caminho que um usu\u00e1rio caminhou dentro do seu site? A utiliza\u00e7\u00e3o ficar\u00e1 por conta da imagina\u00e7\u00e3o de voc\u00eas.<\/p>\n<p>&nbsp;<\/p>\n<p>Um exemplo que encontramos no GitHub e que vale a pena ver:<br \/>\n<a href=\"https:\/\/gist.github.com\/andyj\/1599544\" target=\"_blank\">Link original do c\u00f3digo aqui.<\/a><\/p>\n<p>https:\/\/gist.github.com\/andyj\/1599544<\/p>\n<p>Link de uma aplica\u00e7\u00e3o feita com Web Sql.<br \/>\n<a href=\"https:\/\/github.com\/abeauseigle\/webSqlApp\" target=\"_blank\">HTML5 webSQL app synching with a php MySQL server<\/a><\/p>\n<p>Se gostaram, compartilhem e fa\u00e7am coment\u00e1rios, sugest\u00f5es, corre\u00e7\u00f5es e corre\u00e7\u00f5es sempre s\u00e3o bem vindas. A Turbosite tem o comprometimento em divulgar conhecimento!<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p><strong>Quer servidores Seguros, Est\u00e1veis, com uptime de 99,9%, no Brasil e de baixo Custo? A <span style=\"color: #ff0000;\">Turbosite<\/span> \u00e9 sua resposta.<\/strong><\/p>\n<p><strong><a href=\"https:\/\/www.turbosite.com.br\/hospedagem-de-sites\" target=\"_blank\">Hospedagem de Sites<\/a>, <a href=\"https:\/\/www.turbosite.com.br\/datacenter\" target=\"_blank\">Data Center<\/a> e <a href=\"https:\/\/www.turbosite.com.br\/registro-dominio\" target=\"_blank\">Registro de Dom\u00ednio Gr\u00e1tis<\/a> s\u00f3 aqui!<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Como trabalhar com o recurso Web SQL Database HTML 5. Vamos explicar, exemplificar e testar a funcionalidade para demonstrar sua utiliza\u00e7\u00e3o e seus benef\u00edcios.<\/p>\n","protected":false},"author":1,"featured_media":3922,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,13,15,19,28],"tags":[332,453,591,656],"class_list":["post-3903","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dicas","category-html-2","category-javascript","category-mysql","category-tutoriais","tag-html-5-sql","tag-novidade-html-5","tag-sql-do-lado-do-cliente","tag-web-sql-database"],"_links":{"self":[{"href":"https:\/\/www.turbosite.com.br\/blog\/wp-json\/wp\/v2\/posts\/3903","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.turbosite.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.turbosite.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.turbosite.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.turbosite.com.br\/blog\/wp-json\/wp\/v2\/comments?post=3903"}],"version-history":[{"count":0,"href":"https:\/\/www.turbosite.com.br\/blog\/wp-json\/wp\/v2\/posts\/3903\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.turbosite.com.br\/blog\/wp-json\/wp\/v2\/media\/3922"}],"wp:attachment":[{"href":"https:\/\/www.turbosite.com.br\/blog\/wp-json\/wp\/v2\/media?parent=3903"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.turbosite.com.br\/blog\/wp-json\/wp\/v2\/categories?post=3903"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.turbosite.com.br\/blog\/wp-json\/wp\/v2\/tags?post=3903"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}