{"id":52,"date":"2013-04-03T01:57:27","date_gmt":"2013-04-03T01:57:27","guid":{"rendered":"http:\/\/android.wp.xpkode.com\/?p=52"},"modified":"2013-04-03T02:09:23","modified_gmt":"2013-04-03T02:09:23","slug":"sqlite-em-android","status":"publish","type":"post","link":"http:\/\/android.w3.pt\/?p=52","title":{"rendered":"SQLite em Android"},"content":{"rendered":"<p>O SQLite \u00e9 um sistema de gest\u00e3o de bases de dados aut\u00f3nomo, que funciona de forma diferente dos sistemas cliente-servidor. Em SQLite n\u00e3o existe um servidor que execute queries a pedido dos clientes. No SQLite, a aplica\u00e7\u00e3o cliente \u00e9 respons\u00e1vel por criar a base de dados (BD) caso ela n\u00e3o exista, atualiz\u00e1-la se a vers\u00e3o instalada da BD for mais antiga que a atual usada pela aplica\u00e7\u00e3o e, tamb\u00e9m manipular os dados.<\/p>\n<p>Portanto, contrariamente aos sistemas cliente-servidor usuais como o MySQL, o Oracle, o SQL Server, etc., a aplica\u00e7\u00e3o Android que use SQLite tem que incluir o c\u00f3digo SQL de manipula\u00e7\u00e3o da estrutura da BD, assim como o c\u00f3digo de manipula\u00e7\u00e3o dos dados.<\/p>\n<p>Este artigo apresenta um exemplo de uma BD simples com uma \u00fanica tabela para armazenar livros (autor e t\u00edtulo). Segue-se a classe DBAdapter que \u00e9 usada pela Activity definida mais adiante.<\/p>\n<div style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace; font-size: 0.8em;\">\n<p>package se.bd;<\/p>\n<p>import android.content.ContentValues;<br \/>\nimport android.content.Context;<br \/>\nimport android.database.Cursor;<br \/>\nimport android.database.SQLException;<br \/>\nimport android.database.sqlite.SQLiteDatabase;<br \/>\nimport android.database.sqlite.SQLiteOpenHelper;<\/p>\n<p>public class DBAdapter<br \/>\n{<br \/>\nprivate static final String DATABASE_NAME = &#8220;Livros&#8221;;<br \/>\nprivate static final int DATABASE_VERSION = 1;<\/p>\n<p>private static final String TABELA_LIVRO =<br \/>\n&#8220;CREATE TABLE livro (&#8221;<br \/>\n+ &#8220;_id INTEGER PRIMARY KEY AUTOINCREMENT, &#8221;<br \/>\n+ &#8220;liv_titulo VARCHAR(128), &#8221;<br \/>\n+ &#8220;liv_autor VARCHAR(128)&#8221;<br \/>\n+ &#8220;)&#8221;;<\/p>\n<p>private final Context context;<\/p>\n<p>private DatabaseHelper DBHelper;<br \/>\nprivate SQLiteDatabase db;<\/p>\n<p>public DBAdapter(Context ctx)<br \/>\n{<br \/>\nthis.context = ctx;<br \/>\nDBHelper = new DatabaseHelper(context);<br \/>\n}<\/p>\n<p>private static class DatabaseHelper extends SQLiteOpenHelper<br \/>\n{<br \/>\nDatabaseHelper(Context context)<br \/>\n{<br \/>\nsuper(context, DATABASE_NAME, null, DATABASE_VERSION);<br \/>\n}<\/p>\n<p>@Override<br \/>\npublic void onCreate(SQLiteDatabase db)<br \/>\n{<br \/>\ndb.execSQL(TABELA_LIVRO);<br \/>\n}<\/p>\n<p>@Override<br \/>\npublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)<br \/>\n{<br \/>\ndb.execSQL(&#8220;DROP TABLE IF EXISTS livro&#8221;);<br \/>\nonCreate(db);<br \/>\n}<br \/>\n}<\/p>\n<p>\/\/&#8212;abre a liga\u00e7\u00e3o \u00e0 BD&#8212;<br \/>\npublic DBAdapter open() throws SQLException<br \/>\n{<br \/>\ndb = DBHelper.getWritableDatabase();<br \/>\nreturn this;<br \/>\n}<\/p>\n<p>\/\/&#8212;fecha a liga\u00e7\u00e3o \u00e0 BD&#8212;<br \/>\npublic void close()<br \/>\n{<br \/>\nDBHelper.close();<br \/>\n}<\/p>\n<p>\/\/&#8212;insere um livro na BD&#8212;<br \/>\npublic long insereLivro(String titulo, String autor)<br \/>\n{<br \/>\nContentValues registo = new ContentValues();<br \/>\nregisto.put(&#8220;liv_titulo&#8221;, titulo);<br \/>\nregisto.put(&#8220;liv_autor&#8221;, autor);<br \/>\nreturn db.insert(&#8220;livro&#8221;, null, registo);<br \/>\n}<\/p>\n<p>\/\/&#8212;consulta todos os livros&#8212;<br \/>\npublic Cursor getAllLivros() throws SQLException<br \/>\n{<br \/>\nreturn db.query(true,<br \/>\n&#8220;livro&#8221;,<br \/>\nnew String[] {&#8220;_id&#8221;,&#8221;liv_titulo&#8221;,&#8221;liv_autor&#8221;},<br \/>\nnull,<br \/>\nnull,<br \/>\nnull,<br \/>\nnull,<br \/>\nnull,<br \/>\nnull);<br \/>\n}<br \/>\n}<\/p>\n<\/div>\n<p>Segue-se o c\u00f3digo da Activity que gere a BD e a interface XML criada mais abaixo.<\/p>\n<div style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace; font-size: 0.8em;\">\n<p>package se.bd;<\/p>\n<p>import android.app.Activity;<br \/>\nimport android.database.Cursor;<br \/>\nimport android.os.Bundle;<br \/>\nimport android.view.View;<br \/>\nimport android.widget.Button;<br \/>\nimport android.widget.EditText;<br \/>\nimport android.widget.Toast;<\/p>\n<p>public class BD extends Activity {<br \/>\nButton inserir, consultar;<br \/>\nEditText titulo, autor;<br \/>\nDBAdapter bd;<\/p>\n<p>@Override<br \/>\npublic void onCreate(Bundle savedInstanceState) {<br \/>\nsuper.onCreate(savedInstanceState);<br \/>\nsetContentView(R.layout.main);<\/p>\n<p>inserir = (Button)findViewById(R.id.inserir);<br \/>\nconsultar = (Button)findViewById(R.id.consultar);<br \/>\ntitulo = (EditText)findViewById(R.id.titulo);<br \/>\nautor = (EditText)findViewById(R.id.autor);<\/p>\n<p>bd = new DBAdapter(this);<br \/>\nbd.open();<\/p>\n<p>inserir.setOnClickListener(new View.OnClickListener() {<br \/>\npublic void onClick(View v) {<br \/>\nString sTitulo = titulo.getText().toString();<br \/>\nString sAutor = autor.getText().toString();<br \/>\nbd.insereLivro(sTitulo, sAutor);<br \/>\ntitulo.setText(&#8220;&#8221;);<br \/>\nautor.setText(&#8220;&#8221;);<br \/>\n}<br \/>\n});<\/p>\n<p>consultar.setOnClickListener(new View.OnClickListener() {<br \/>\npublic void onClick(View v) {<br \/>\nmostraLivros();<br \/>\n}<br \/>\n});<br \/>\n}<\/p>\n<p>public void mostraLivros() {<br \/>\nCursor c = bd.getAllLivros();<br \/>\nif(c.moveToFirst()) {<br \/>\ndo {<br \/>\nint id = c.getInt(0);<br \/>\nString sTitulo = c.getString(1);<br \/>\nString sAutor = c.getString(2);<br \/>\nString msg = String.format(&#8220;%d, %s, %s&#8221;, id, sTitulo, sAutor);<br \/>\nToast.makeText(this, msg, Toast.LENGTH_LONG).show();<br \/>\n}while(c.moveToNext());<br \/>\n}<br \/>\nc.close();<br \/>\n}<\/p>\n<p>public void onDestroy() {<br \/>\nsuper.onDestroy();<br \/>\nbd.close();<br \/>\n}<br \/>\n}<\/p>\n<\/div>\n<p>O layout gr\u00e1fico da aplica\u00e7\u00e3o \u00e9 dados pelo ficheiro XML seguinte:<\/p>\n<div style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace; font-size: 0.8em;\">&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243;?&gt;<br \/>\n&lt;LinearLayout xmlns:android=&#8221;http:\/\/schemas.android.com\/apk\/res\/android&#8221;<br \/>\nandroid:layout_width=&#8221;fill_parent&#8221;<br \/>\nandroid:layout_height=&#8221;fill_parent&#8221;<br \/>\nandroid:orientation=&#8221;vertical&#8221; &gt;&lt;TextView<br \/>\nandroid:layout_width=&#8221;fill_parent&#8221;<br \/>\nandroid:layout_height=&#8221;wrap_content&#8221;<br \/>\nandroid:text=&#8221;T\u00edtulo&#8221;<br \/>\nandroid:textSize=&#8221;20sp&#8221;<br \/>\n\/&gt;<br \/>\n&lt;EditText<br \/>\nandroid:layout_width=&#8221;fill_parent&#8221;<br \/>\nandroid:layout_height=&#8221;wrap_content&#8221;<br \/>\nandroid:id=&#8221;@+id\/titulo&#8221;<br \/>\nandroid:inputType=&#8221;text&#8221;<br \/>\nandroid:textSize=&#8221;20sp&#8221;<br \/>\n\/&gt;<br \/>\n&lt;TextView<br \/>\nandroid:layout_width=&#8221;fill_parent&#8221;<br \/>\nandroid:layout_height=&#8221;wrap_content&#8221;<br \/>\nandroid:text=&#8221;Autor&#8221;<br \/>\nandroid:textSize=&#8221;20sp&#8221;<br \/>\n\/&gt;<br \/>\n&lt;EditText<br \/>\nandroid:layout_width=&#8221;fill_parent&#8221;<br \/>\nandroid:layout_height=&#8221;wrap_content&#8221;<br \/>\nandroid:id=&#8221;@+id\/autor&#8221;<br \/>\nandroid:inputType=&#8221;text&#8221;<br \/>\nandroid:textSize=&#8221;20sp&#8221;<br \/>\n\/&gt;<br \/>\n&lt;Button<br \/>\nandroid:layout_width=&#8221;fill_parent&#8221;<br \/>\nandroid:layout_height=&#8221;wrap_content&#8221;<br \/>\nandroid:id=&#8221;@+id\/inserir&#8221;<br \/>\nandroid:text=&#8221;Inserir&#8221;<br \/>\nandroid:textSize=&#8221;20sp&#8221;<br \/>\n\/&gt;<br \/>\n&lt;Button<br \/>\nandroid:layout_width=&#8221;fill_parent&#8221;<br \/>\nandroid:layout_height=&#8221;wrap_content&#8221;<br \/>\nandroid:id=&#8221;@+id\/consultar&#8221;<br \/>\nandroid:text=&#8221;Consultar&#8221;<br \/>\nandroid:textSize=&#8221;20sp&#8221;<br \/>\n\/&gt;&lt;\/LinearLayout&gt;<\/p>\n<\/div>\n<p>A aplica\u00e7\u00e3o tem duas caixas de texto (EditText) para o utilizador colocar o t\u00edtulo do livro e nome do autor. Tem tamb\u00e9m dois bot\u00f5es: um para inserir um novo livro e o outro para consultar os livros j\u00e1 armazenados.<\/p>\n<p>Segue-se uma imagem do layout da aplica\u00e7\u00e3o.<\/p>\n<p><a href=\"http:\/\/android.w3.pt\/?attachment_id=55\" rel=\"attachment wp-att-55\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-55\" alt=\"device-2013-04-03-030339\" src=\"http:\/\/android.w3.pt\/wp-content\/uploads\/sites\/7\/2013\/04\/device-2013-04-03-030339-200x300.png\" width=\"200\" height=\"300\" srcset=\"http:\/\/android.wp.w3.pt\/wp-content\/uploads\/sites\/7\/2013\/04\/device-2013-04-03-030339-200x300.png 200w, http:\/\/android.wp.w3.pt\/wp-content\/uploads\/sites\/7\/2013\/04\/device-2013-04-03-030339.png 320w\" sizes=\"(max-width: 200px) 100vw, 200px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>O SQLite \u00e9 um sistema de gest\u00e3o de bases de dados aut\u00f3nomo, que funciona de forma diferente dos sistemas cliente-servidor. Em SQLite n\u00e3o existe um servidor que execute queries a pedido dos clientes. No SQLite, a aplica\u00e7\u00e3o cliente \u00e9 respons\u00e1vel por criar a base de dados (BD) caso ela n\u00e3o exista, atualiz\u00e1-la se a vers\u00e3o [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/posts\/52"}],"collection":[{"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/android.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=52"}],"version-history":[{"count":3,"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/posts\/52\/revisions"}],"predecessor-version":[{"id":54,"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/posts\/52\/revisions\/54"}],"wp:attachment":[{"href":"http:\/\/android.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=52"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/android.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=52"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/android.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=52"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}