Você está na página 1de 7

Android Developers

Salvando dados em bancos de dados do


SQL
Esta lio ensina a
Definir um esquema e contrato

Criar um banco de dados usando de um SQL Helper


Colocar informaes no banco de dados
Ler informaes de um banco de dados

Excluir informaes de um banco de dados


Atualizar um banco de dados

Leia tambm
Usando bancos de dados

Salvar dados em um banco de dados ideal para dados que se repetem ou estruturados,
como informaes de contato. Esta lio assume que voc esteja familiarizado com
bancos de dados do SQL em gera, e o ajuda a comear a trabalhar com bancos de dados
do SQLite no Android. As APIs necessrias para usar um banco de dados no Android esto
disponveis no pacote android.database.sqlite
(https://developer.android.com/reference/android/database/sqlite/package-summary.html).

Definir um esquema e contrato


Um dos princpios mais importantes de bancos de dados do SQL o esquema: uma declarao formal

de como o banco de dados organizado. O esquema refletido nas declaraes SQL usadas na criao
do banco de dados. aconselhvel criar uma classe de acompanhamento, conhecida como classe de
contrato, que especifica claramente o layout do esquema de forma sistemtica e autodocumentada.

Uma classe de contrato o continer das constantes que definem nomes para URIs, tabelas e colunas.

A classe de contrato permite usar as mesmas constantes em outras classes no mesmo pacote. Permite
que voc altere o nome da coluna em um local e que a mudana se propague pelos seus cdigos.

Uma boa forma de organizar uma classe de contrato colocar definies que sejam globais para todo o
banco de dados no nvel raiz da classe. Crie uma classe interna para cada tabela que enumera suas
colunas.

Observao: implementando a interface BaseColumns

(https://developer.android.com/reference/android/provider/BaseColumns.html),

sua classe interior pode

herdar um campo-chave primrio chamado _ID que algumas classes do Android, como adaptadores
de cursor, esperam que voc tenha. No uma obrigatrio, mas pode ajudar para um trabalho mais
harmonioso com o banco de dados no framework do Android.

Por exemplo, este trecho define o nome da tabela e das colunas para uma nica tabela:
public final class FeedReaderContract {
// To prevent someone from accidentally instantiating the contract class,
// give it an empty constructor.
public FeedReaderContract() {}

/* Inner class that defines the table contents */


public static abstract class FeedEntry implements BaseColumns {
public static final String TABLE_NAME = "entry";
public static final String COLUMN_NAME_ENTRY_ID = "entryid";
public static final String COLUMN_NAME_TITLE = "title";
public static final String COLUMN_NAME_SUBTITLE = "subtitle";
...
}

Criar um banco de dados usando de um SQL Helper


Uma vez definidos o visual dos bancos de dados, implemente mtodos que criam e cuidam do banco de
dados e das tabelas. Aqui esto algumas declaraes comuns para criar e exclui a tabela:
private static final String TEXT_TYPE = " TEXT";
private static final String COMMA_SEP = ",";
private static final String SQL_CREATE_ENTRIES =
"CREATE TABLE " + FeedEntry.TABLE_NAME + " (" +
FeedEntry._ID + " INTEGER PRIMARY KEY," +
FeedEntry.COLUMN_NAME_ENTRY_ID + TEXT_TYPE + COMMA_SEP +
FeedEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP +
... // Any other options for the CREATE command
" )";

private static final String SQL_DELETE_ENTRIES =


"DROP TABLE IF EXISTS " + FeedEntry.TABLE_NAME;

Da mesma forma voc salva arquivos no armazenamento interno

(https://developer.android.com/guide/topics/data/data-storage.html#filesInternal)

do dispositivo, o Android armazena

seu banco de dados no espao privado do disco associado ao aplicativo. Seus dados esto protegidos
porque, por padro, essa rea no pode ser acessada por outros aplicativos.
Um conjunto de APIs est disponvel na classe SQLiteOpenHelper

(https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html).

Ao usar esta classe

para obter referncias para seu banco de dados, o sistema realiza operaes de possvel longa
execuo para criar e atualizar o banco de dados apenas quando necessrio e no durante a
inicializao do aplicativo. Basta chamar getWritableDatabase()

(https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getWritableDatabase())

getReadableDatabase()

ou

(https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getReadableDatabase()).

Observao: devido possibilidade de serem de longa execuo, certifique-se que chamar


getWritableDatabase()

(https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getWritableDatabase())

ou getReadableDatabase()

(https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getReadableDatabase())

em um thread de segundo plano, como AsyncTask

(https://developer.android.com/reference/android/os/AsyncTask.html)

ou IntentService

(https://developer.android.com/reference/android/app/IntentService.html).

Para usar SQLiteOpenHelper

(https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html),

que substitua os mtodos de retorno de chamada onCreate()

crie uma subclasse

(https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onCreate
(android.database.sqlite.SQLiteDatabase)),

onUpgrade()

(https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onUpgrade
(android.database.sqlite.SQLiteDatabase, int, int))

e onOpen()

(https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onOpen
(android.database.sqlite.SQLiteDatabase)).

Tambm possvel implementar onDowngrade()

(https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onDowngrade
(android.database.sqlite.SQLiteDatabase, int, int)),

mas no obrigatrio.

Por exemplo, esta uma implementao de SQLiteOpenHelper

(https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html)

comandos exibidos abaixo:

que utiliza alguns dos

public class FeedReaderDbHelper extends SQLiteOpenHelper {


// If you change the database schema, you must increment the database version.
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "FeedReader.db";

public FeedReaderDbHelper(Context context) {


super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE_ENTRIES);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// This database is only a cache for online data, so its upgrade policy is
// to simply to discard the data and start over
db.execSQL(SQL_DELETE_ENTRIES);
onCreate(db);
}
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onUpgrade(db, oldVersion, newVersion);
}

Para acessar seu banco de dados, instancie sua subclasse de SQLiteOpenHelper


(https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html):

FeedReaderDbHelper mDbHelper = new FeedReaderDbHelper(getContext());

Colocar informaes no banco de dados


Coloque dados no banco de dados transmitindo um objeto ContentValues
(https://developer.android.com/reference/android/content/ContentValues.html)

para o mtodo insert()

(https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#insert(java.lang.String,
java.lang.String, android.content.ContentValues)).

// Gets the data repository in write mode


SQLiteDatabase db = mDbHelper.getWritableDatabase();
// Create a new map of values, where column names are the keys
ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_ENTRY_ID, id);
values.put(FeedEntry.COLUMN_NAME_TITLE, title);
values.put(FeedEntry.COLUMN_NAME_CONTENT, content);
// Insert the new row, returning the primary key value of the new row
long newRowId;
newRowId = db.insert(

FeedEntry.TABLE_NAME,
FeedEntry.COLUMN_NAME_NULLABLE,
values);

Este primeiro argumento para insert()

(https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#insert(java.lang.String,
java.lang.String, android.content.ContentValues))

apenas o nome da tabela. O segundo argumento fornece

o nome de uma coluna em que o framework pode inserir NULL caso o ContentValues
(https://developer.android.com/reference/android/content/ContentValues.html)

esteja vazio (se voc definir

como "null", o framework no inserir uma linha quando no houver valores).

Ler informaes de um banco de dados


Para ler de um banco de dados, utilize o mtodo query()

(https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#query(boolean,

java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String,


java.lang.String, java.lang.String))

, transmitindo seus critrios de seleo e colunas desejadas. O

mtodo combina elementos de insert()

(https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#insert(java.lang.String,
java.lang.String, android.content.ContentValues))

e update()

(https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#update(java.lang.String,
android.content.ContentValues, java.lang.String, java.lang.String[])),

exceto que a lista da coluna define os

dados que sero analisados e no os dados a serem inseridos. Os resultados da consulta so


retornados em um objeto Cursor

(https://developer.android.com/reference/android/database/Cursor.html).

SQLiteDatabase db = mDbHelper.getReadableDatabase();
// Define a projection that specifies which columns from the database
// you will actually use after this query.
String[] projection = {
FeedEntry._ID,
FeedEntry.COLUMN_NAME_TITLE,
FeedEntry.COLUMN_NAME_UPDATED,
...
};
// How you want the results sorted in the resulting Cursor
String sortOrder =
FeedEntry.COLUMN_NAME_UPDATED + " DESC";
Cursor c = db.query(
FeedEntry.TABLE_NAME,
projection,
selection,

// The table to query


// The columns to return
// The columns for the WHERE clause

selectionArgs,
null,
null,
sortOrder
);

//
//
//
//

The values for the WHERE clause


don't group the rows
don't filter by row groups
The sort order

Para ver uma linha no cursor, utilize um dos mtodos de movimento Cursor
(https://developer.android.com/reference/android/database/Cursor.html),

que sempre devero ser chamados

antes de comear a ler valores. Geralmente, deve-se iniciar chamando moveToFirst()


(https://developer.android.com/reference/android/database/Cursor.html#moveToFirst()),

que coloca a posio

leitura na primeira entrada nos resultados. Para cada linha, voc pode ler um valor de coluna chamando
um dos mtodos GET Cursor

(https://developer.android.com/reference/android/database/Cursor.html),

como

getString() (https://developer.android.com/reference/android/database/Cursor.html#getString(int)) ou getLong


() (https://developer.android.com/reference/android/database/Cursor.html#getLong(int)). Para cada um dos

mtodos GET, voc deve transmitir a posio de ndice da coluna desejada, que pode ser obtida
chamando getColumnIndex()

(https://developer.android.com/reference/android/database/Cursor.html#getColumnIndex(java.lang.String))

getColumnIndexOrThrow()

ou

(https://developer.android.com/reference/android/database/Cursor.html#getColumnIndexOrThrow(java.lang.String)).

Por exemplo:

cursor.moveToFirst();
long itemId = cursor.getLong(
cursor.getColumnIndexOrThrow(FeedEntry._ID)
);

Excluir informaes de um banco de dados


Para excluir linhas de uma tabela, fornea os critrios de seleo que as identifique. A API do banco de
dados oferece um mecanismo para criar critrios de seleo que protegem contra injeo do SQL. O

mecanismo divide a especificao da seleo em uma clusula e argumentos de seleo. A clusula


define a coluna a se olhar e tambm permite combinar testes de coluna. Os argumentos so valores

para testes comparativos que so dependentes dentro de uma clusula. Como o resultado no tratado
da mesma forma que uma declarao SQL comum, ele fica imune injeo de SQL.
// Define 'where' part of query.
String selection = FeedEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?";
// Specify arguments in placeholder order.
String[] selectionArgs = { String.valueOf(rowId) };
// Issue SQL statement.
db.delete(table_name, selection, selectionArgs);

Atualizar um banco de dados


Quando precisar alterar um subconjunto dos valores de seu banco de dados, utilize o mtodo update()
(https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#update(java.lang.String,
android.content.ContentValues, java.lang.String, java.lang.String[])).

A atualizao da tabela combina a sintaxe de valores do contedo de insert()

(https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#insert(java.lang.String,
java.lang.String, android.content.ContentValues))

com a sintaxe where de delete()

(https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#delete(java.lang.String,
java.lang.String, java.lang.String[])).

SQLiteDatabase db = mDbHelper.getReadableDatabase();
// New value for one column
ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_TITLE, title);
// Which row to update, based on the ID
String selection = FeedEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?";
String[] selectionArgs = { String.valueOf(rowId) };
int count = db.update(
FeedReaderDbHelper.FeedEntry.TABLE_NAME,
values,
selection,
selectionArgs);