Um pouco sobre mim.

Me chamo Eduardo Balbo, moro em Bocaina - SP entrei na FATEC pois me interesso pela área de Tecnologia e Desenvolvimento e sempre quis trabalhar nesse ramo. Fiz alguns cursos de desenvolvimento em Delphi, Informática Administrativa, MySql. Possuo facilidade e familiriade com a lingua inglesa, aprendi por conta própria devido a necessidade. Normalmente gosto de games, assistir animes, e conversar com os amigos. Tenho vontade de buscar uma vida fora do Brasil e conhecer novas culturas e novos aprendizados.



Artigo traduzido por mim.

Guia final para o banco de dados Android SQLite

Este guia foi criado por Val Okafor e postado em 17 de setembro de 2015, em inglês, no site:

https://medium.com/@valokafor/ultimate-guide-to-android-sqlite-database-44cc8636a4ec

O trabalho a seguir é uma tradução para o Português Brasileiro do Guia original.

Guia final para o banco de dados Android SQLite

Se você quer se tornar um desenvolvedor profissional Android, então você deve saber como salvar e recuperar dados. O SQLite é, de longe, a tecnologia de banco de dados mobile mais usada. Neste tutorial do Android SQLite Database, ensinarei tudo o que você precisa saber para começar a trabalhar com o Android SQLite no Android. Existem outras tecnologias de banco de dados que você pode usar para salvar dados no Android, como o banco de dados Realm e o banco de dados Firebase Realtime, e abordarei essas tecnologias em postagens separadas no blog.

Neste post, você aprenderá sobre a classe SQLiteOpenHelper, como criar um banco de dados, como criar tabelas, como escrever consultas, como executar operações de criação, leitura, atualização e exclusão (CRUD) usando SQLite. Você também aprenderá como fazer backup e restaurar o banco de dados SQLite, entre outras práticas recomendadas para trabalhar com o SQLite. Essas habilidades ajudarão você a compreender melhor as outras tecnologias de banco de dados móveis, como o banco de dados Realm e o Firebase. Meu livro “Pronto SQLite - Persistência de dados do Android Master” abrange todas essas tecnologias em detalhe, este post é um trecho do livro.

Eu suponho que você tenha, no mínimo, uma compreensão rudimentar do desenvolvimento em Android. Este tutorial do Android SQLite Database focará na persistência de dados no Android usando o SQLite e não fornecerá uma introdução completa aos conceitos de desenvolvimento em Android. Portanto, se você não conhece os fundamentos do desenvolvimento em Android, poderá ter dificuldade com os conceitos discutidos neste livro. Se você é um novato completo no desenvolvimento em Android, talvez queira aproveitar os muitos recursos disponíveis on-line, incluindo o “Guia para desenvolvedores iniciantes em Android”.

Introdução ao SQLite

Vamos pegar a definição oficial do banco de dados SQLite.

O SQLite é uma biblioteca em processo que implementa um mecanismo de banco de dados SQL transacional autônomo, sem servidor e com configuração zero. O SQLite é um mecanismo de banco de dados SQL incorporado. Ao contrário da maioria dos outros bancos de dados SQL, o SQLite não possui um processo de servidor separado. O SQLite lê e grava diretamente em arquivos de disco comuns.

http://sqlite.com/about.html

Vamos revisar essa definição oficial do SQLite acima

1. SQLite é um banco de dados compatível com SQL (muito importante),

2. Não precisa de um servidor separado para executar,

3. Ele não requer instalação separada, se a plataforma com a qual você está trabalhando precisa do SQLite, então ela já está incluída, assim como no Android,

4. É de graça.

SQLite no Android

O SQLite é anterior ao Android e é usado em outros aplicativos importantes, além do Android. Embora seja o caso que o SQLite é amplamente utilizado no desenvolvimento Android hoje, no entanto, não é um número pequeno de desenvolvedores que tem se divertido e se confundido com o SQLite; e por esse motivo, muitas tentativas foram feitas para desbancar ou abandonar o SQLite. Muitos desses esforços são band-aids para o SQLite, como os muitos tipos de ORMs, alguns compostos da confusão em torno do SQLite, como ContentProvider e alguns são novas abordagens, como o banco de dados Realm.

A sigla “SQL” em SQLite significa Structured Query Language, o que significa que SQLite é um mecanismo de banco de dados compatível com SQL, o que significa que o SQLite é usado para armazenar dados estruturados, diferentemente de SharedPreference, que é usado para armazenar pares de dados de valor-chave. Trabalhar com o SQLite no Android significa que você está traduzindo mental e programaticamente entre dois idiomas diferentes. Os dados que você deseja salvar e a lógica que gera os dados são gravados em uma linguagem orientada a objetos, como Java. Então você tem o SQLite que entende a linguagem do SQL.

Em comparação com outros DBMS SQL, o SQLite é fácil de usar! Pelo menos fácil de configurar. O desafio aqui é que “fácil” é relativo, o que é relativamente fácil para você pode ser um desafio para mim. Este ponto não está perdido para os designers Android, então eles deram mais um passo e criaram classes auxiliares que facilitam o trabalho com o SQLite no Android e abaixo estão três componentes do SQLite que você precisa entender porque eles são centrais para o trabalho com o SQLite no Android.

1. SQLiteOpenHelper - esta é a classe mais importante com a qual você trabalhará no Android SQLite. Você usará SQLiteOpenHelper para criar e atualizar seu banco de dados SQLite. Em outras palavras, o SQLiteOpenHelper remove o esforço necessário para instalar e configurar o banco de dados em outros sistemas.

2. SQLiteDatabase - este é o banco de dados real onde seus dados são armazenados. Quando você criou seu banco de dados com a classe SQLiteOpenHelper, ele configura tudo em movimento para criar seu banco de dados, mas retém até que você esteja pronto para usar esse banco de dados. E a maneira como o SQLiteOpenHelper sabe que você está pronto para usar seu banco de dados é quando você acessa esse banco de dados com getReadableDatabase () ou getWritableDatabase () para operações de leitura e gravação, respectivamente.

3. Cursor - A razão pela qual você armazena seus dados em um banco de dados é para que você possa acessá-los mais tarde. Esse acesso é chamado de consulta e uma consulta bem-sucedida retornará uma lista dos itens que você consultou. Se essa lista é tão longa, o seu dispositivo Android pode engasgar se você quiser acessar todos os itens no resultado retornado. É aqui que o Cursor entra, a lista dos itens que você quer ver está contida em um Cursor e o Cursor os entrega para você em lotes de qualquer número.


Aplicativo de demonstração

Para aproveitar ao máximo este tutorial do Banco de Dados Android SQLite, adicionaremos a camada de persistência de dados de um aplicativo demo do Carrinho de Compras Android. Embora este tutorial se concentre nas necessidades de persistência de dados deste aplicativo e não na interface do usuário, o código-fonte fornecido acompanha uma interface de usuário totalmente desenvolvida. O nome deste aplicativo de demonstração é Pronto Shop e aqui está como podemos descrever este aplicativo de demonstração:

Pronto Shop é um aplicativo fictício de carrinho de compras que permite aos usuários adicionar e exibir uma lista de produtos para venda. Os produtos serão agrupados por categorias. O aplicativo também permitirá que eles adicionem e exibam a lista de seus clientes. Para criar uma Transação, o usuário deve adicionar Produtos ao Carrinho clicando nos Produtos. Para completar a transação, o usuário deve clicar no botão checkout. O aplicativo deve manter um histórico de Transações e Relatório de vendas diário, semanal e mensal.

A partir da descrição acima, podemos identificar os seguintes objetos persistentes, que também foram destacados acima.

1. Produtos

2. Cliente

3. Transação

4. Categorias

5. Relatório

Esses objetos se tornarão tabelas em nosso banco de dados. Eles também são as classes de modelo de negócios no aplicativo.


Código fonte

O código-fonte que acompanha este tutorial é dividido em duas partes: início e fim.

1. Pronto_Shop_SQLite_Beginning - neste código-fonte, a interface do usuário do aplicativo de demonstração foi totalmente configurada para que você possa adicionar e exibir Produtos, Clientes e Transações ao aplicativo de demonstração Pronto Shop. Este projeto não inclui o banco de dados ainda.

2. Pronto_Shop_SQLite_End - este código-fonte contém o projeto com o banco de dados SQLite adicionado. Isto é o que seu código deverá ser se você seguiu junto com o tutorial

Download: http://valokafor.com/download-pronto-shop-sqlite-source-code/


Criar um banco de dados Android SQLite

Para criar um banco de dados SQLite no Android, você cria um arquivo de classe Java padrão. Para tornar esse arquivo de classe um arquivo de classe de banco de dados, estenda-o da classe SQLiteOpenHelper. Assim que você estender essa classe, será necessário executar três ações, que são:

1. Constructor: Como nosso arquivo de classe DatabaseHelper.java foi estendido de SQLiteOpenHelper, ele deve ter um construtor que corresponda à superclasse. Esse construtor aceita um objeto Context, o nome do banco de dados, uma fábrica de Cursores e a versão do banco de dados.

2. onCreate () - este método é chamado quando o banco de dados é criado pela primeira vez e este método é onde as tabelas do banco de dados são criadas. O parâmetro para esse método é o banco de dados real que você está criando e esse banco de dados tem um método chamado execSQL () que você usa para executar a consulta que cria as tabelas do banco de dados.

3. onUpgrade () - este método é chamado quando o banco de dados precisa de uma atualização. Seu banco de dados será sinalizado para uma atualização quando você incrementar o número da versão do banco de dados. Por exemplo, se você for da versão de banco de dados 1 para a versão 2, esse método será chamado. Dentro deste método é onde você escreve os métodos que irão implementar as mudanças que você quer fazer no seu esquema de banco de dados. A atualização do banco de dados é complicada porque, quando você estiver atualizando seu banco de dados, pode ser que as pessoas já estejam usando o aplicativo e você não queira eliminar seus dados.


Como agora sabemos quais são os parâmetros esperados pela superclasse, podemos gerar esses parâmetros a partir de nossa classe. Por causa disso, agora podemos atualizar o construtor da classe DatabaseHelper para aceitar apenas um objeto Context. Abaixo está um método onCreate () atualizado que inclui uma instrução SQL para criar uma tabela de categorias. Se executarmos este aplicativo agora e chamarmos essa classe passando um Contexto, ele criará um banco de dados chamado pronto_shop.db contendo apenas uma tabela.

public class DatabaseHelper extends SQLiteOpenHelper {
public DatabaseHelper(Context context) {

super(context, "pronto_shop.db", null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(
"create table category " +
"(id integer primary key, name text)"
);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
}


O desafio dessa abordagem é que o SQL é uma linguagem propensa a erros. Para reduzir os erros de digitação que resultam da escrita de consultas SQL, definiremos nossas consultas usando Constants.

Criar tabelas de banco de dados

Eu adicionei todas as constantes necessárias para este aplicativo para o código-fonte que acompanha este projeto, para que possamos agora adicionar as tabelas. Na terminologia de banco de dados, uma tabela é uma coleção de registros relacionados, você pode ter uma tabela para funcionários, uma tabela para clientes, outra para vendas e assim por diante. Todas essas tabelas seriam combinadas em um banco de dados para facilitar o uso.


Definição de schema

Antes de podermos ir em frente e criar as tabelas de banco de dados, que tipo de tabelas de banco de dados vamos criar? Quantas tabelas devemos criar? E que tipo de dados devem ser armazenados nessas tabelas? O esquema responderá a essas perguntas para nós. O esquema nos diz como estruturar nosso banco de dados logicamente. Precisamos entender a lógica de negócios do aplicativo para criar um esquema efetivo de banco de dados. As classes de modelo podem nos ajudar a entender a lógica de negócios do aplicativo.


Classes de modelo

Cada tabela em nosso banco de dados representará uma entidade em nosso aplicativo. Tabelas geralmente mapeiam para modelar classes. Um exemplo de uma classe de modelo pode ser Person.java, e isso pode representar uma pessoa da vida real em nosso aplicativo. Como uma pessoa geralmente tem um nome, nossa classe Person.java terá uma propriedade de FirstName para representar o primeiro nome de uma pessoa da vida real. Aqui estão as classes de modelo para nosso aplicativo de demonstração.

1. Product.java

2. LineItem.java

3. Customer.java

4. Transactions.java

5. Category.java


Cada tabela terá uma coluna que mapeia para um campo na classe de modelo que ela representa. Uma coluna na terminologia de banco de dados é um arranjo vertical de informações ou dados. Você atribui a cada coluna um nome para descrever os dados armazenados.


Criar tabela de clientes

A instrução SQL criará uma tabela de banco de dados cujas colunas têm quase um mapeamento de um para um para a classe Java que ela representa. Temos que agrupar as declarações SQL entre aspas duplas e, como já definimos as cadeias literais em Constantes, apenas as referenciamos para evitar erros de digitação. Usamos a concatenação de sequência de caracteres “+” para unir a sequência em várias linhas para facilitar a legibilidade. Abaixo está a instrução de consulta SQL real que será executada para criar a tabela Customer.

CREATE TABLE customer(_id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL, email TEXT, image_path TEXT, phone TEXT,
street1 TEXT, street2 TEXT, city TEXT, state TEXT, zip TEXT, note TEXT,
create_date BIGINT, last_update_date BIGINT )

Observe a diferença entre os tipos de dados SQLite e o tipo de dados primitivos Java. Um valor String no código Java será salvo como Texto SQLite. A maior parte do seu tempo na criação de aplicativos Android baseados em dados será gasta no gerenciamento da tradução entre como o SQLite representa os dados no disco e a representação do objeto no código Java. Esses são os desafios que o banco de dados ORMs e Realm definiu para resolver.

Depois de adicionar todas as instruções SQL para criar as tabelas do banco de dados, você pode atualizar o método onCreate () da classe DatabaseHelper para que essas instruções sejam executadas assim:

@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL(CREATE_CATEGORY_TABLE);
db.execSQL(CREATE_CUSTOMER_TABLE);
db.execSQL(CREATE_TRANSACTION_TABLE);
db.execSQL(CREATE_PRODUCT_TABLE);
db.execSQL(CREATE_LINEITEM_TABLE);
} catch (SQLException e) {
Log.d(LOG_TAG, " Error create database " + e.getMessage());
}
}


As instruções SQL para criar as tabelas Product, LineItem, Category e Transaction foram adicionadas ao código-fonte que acompanha este tutorial do Android SQLite Database.


Acessar o banco de dados

Precisamos criar uma instância da classe DatabaseHelper antes que possamos acessar o banco de dados. Abra MainActivity.java e crie duas variáveis ​​de instância perto do topo do arquivo como este:

private DatabaseHelper mDBHelper;
private SQLiteDatabase mDatabase;


Agora, no método onCreate da mesma Activity, vá em frente e instancie estas duas variáveis ​​da seguinte forma:

mDBHelper = new DatabaseHelper(this);
mDatabase = mDBHelper.getWritableDatabase();
mDatabase.close()1

Agora, execute o aplicativo novamente, se você não recebeu nenhuma mensagem de erro, o banco de dados foi criado.


Padrão Singleton

Quando você abre um banco de dados Android SQLite para um acesso de leitura ou gravação, é importante fechá-lo quando terminar para evitar um vazamento de memória. Você deve projetar seu aplicativo de forma que o método close de cada banco de dados tenha um método open correspondente. Para um aplicativo orientado a dados, isso resultará no gerenciamento do estado de abertura / fechamento do banco de dados em vários locais no seu aplicativo. Usar um padrão singleton pode ajudar nisso. Com o padrão de design singleton, você só precisará abrir e fechar seu banco de dados uma vez.

Atualmente, nossa classe DatabaseHelper possui um construtor público, o que significa que uma nova instância dessa classe é criada toda vez que acessamos essa classe. Para implementar um padrão singleton, precisamos refatorar essa classe para que tenhamos um método de fábrica que retorne uma única instância dessa classe. Este processo será familiar para você se você já tiver criado novos fragmentos usando o método newInstance. Abaixo está o construtor atualizado da nossa classe DatabaseHelper.

private static DatabaseHelper mDatabaseInstance = null;
private Context mContext;

public static DatabaseHelper newInstance(Context context){
if (mDatabaseInstance == null){
mDatabaseInstance = new DatabaseHelper(context.getApplicationContext());
}
return mDatabaseInstance;
}

private DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
mContext = context;

}


Primeiro, o método acima verifica se o membro mDatabaseInstance é nulo e, se for nulo, criará um novo. De qualquer maneira, uma instância da classe DatabaseHelper é sempre retornada toda vez que esse método é chamado. Esse padrão garante que apenas uma instância da classe DatabaseHelper exista. Agora na MainActivity podemos criar o banco de dados como abaixo.

mDBHelper = DatabaseHelper.newInstance(this);
mDatabase = mDBHelper.getWritableDatabase();
mDatabase.close();


Operações CRUD com banco de dados Android SQLite

O acrônimo CRUD significa Criar, Ler, Atualizar e Excluir (Create, Read, Update e Delete). Estes representam as operações mais comuns que você realiza em um banco de dados. No Android, as operações CRUD são comumente definidas como métodos Java e, dentro desses métodos, você tem a instrução SQL real executada no banco de dados SQLite porque não é possível executar a lógica de programação Java diretamente em um banco de dados SQLite.

Abaixo está um exemplo clássico de instrução SQL.

SELECT * FROM customer;

A consulta acima é uma instrução select para selecionar todos os clientes na tabela de clientes. No Android, vamos envolver essa instrução SQL usando código Java como este:

Cursor cursor = database.rawQuery("SELECT * FROM customer", null);

Quando a instrução acima é executada, o conjunto de dados recebido da consulta SQL será agrupado em um objeto Android Cursor.


Inserir registros no banco de dados SQLite

Nesta seção, escreveremos as instruções SQL que criarão todos os objetos persistentes a partir do Cliente. O método insert () do banco de dados Android SQLite é usado para criar uma linha em uma tabela. Os termos “insert” e “create” são frequentemente usados ​​de forma intercambiável neste tutorial. A assinatura do método insert () é como mostra abaixo:

public long insert (String table, String nullColumnHack, ContentValues values).

O valor retornado deste método é o id da linha que acabou de ser inserida na tabela ou -1 se a inserção falhou.


Inserir registro do cliente

Abra o AddCustomerDialogFragment.java no código-fonte deste tutorial do Android SQLite Database e você encontrará um método próximo ao final da classe chamado saveCustomerToDatabase, mostrado abaixo.

private void saveCustomerToDatabase(Customer customer) {
//Todo - save customer to database
}

Agora precisamos atualizar esse método com o código que salva o objeto Customer passado no banco de dados. Para aplicativos de produção, você deve tentar separar as operações de acesso a dados do código da interface do usuário. Meu livro Pronto SQLite contém um exemplo de como conseguir isso usando o padrão de projeto MVP e o padrão Repository. Abaixo está um método saveCustomerToDatabase atualizado contendo a instrução SQL que salva um objeto Customer no banco de dados.

private void saveCustomerToDatabase(Customer customer) {
if (mDatabase != null){
//prepare the transaction information that will be saved to the database
ContentValues values = new ContentValues();
values.put(Constants.COLUMN_NAME, customer.getCustomerName());
values.put(Constants.COLUMN_EMAIL, customer.getEmailAddress());
values.put(Constants.COLUMN_PHONE, customer.getPhoneNumber());
values.put(Constants.COLUMN_IMAGE_PATH, customer.getProfileImagePath());
values.put(Constants.COLUMN_STREET1, customer.getStreetAddress());
values.put(Constants.COLUMN_STREET2, customer.getStreetAddress2());
values.put(Constants.COLUMN_CITY, customer.getCity());
values.put(Constants.COLUMN_STATE, customer.getCity());
values.put(Constants.COLUMN_ZIP, customer.getPostalCode());
values.put(Constants.COLUMN_NOTE, customer.getNote());
values.put(Constants.COLUMN_DATE_CREATED, System.currentTimeMillis());
values.put(Constants.COLUMN_LAST_UPDATED, System.currentTimeMillis());

mDatabase.insert(Constants.CUSTOMER_TABLE, null, values);
}
}

Vamos ver o que o bloco de código acima está fazendo.

1. Primeiro, colocamos o bloco de código em uma instrução if, caso o objeto SQLitedatabase que estamos referenciando seja nulo.

2. Em seguida, criamos um pacote para armazenar as informações que serão inseridas no banco de dados usando o ContentValue, que é semelhante ao objeto Bundle que usamos com o Intents.

3. Depois de construirmos todos os nossos valores, chamamos o método de inserção do banco de dados passando o nome da tabela de banco de dados que queremos inserir e o pacote contendo os valores que queremos salvar nessa tabela.

4. O SQLite levará a partir daí e se a inserção for bem sucedida, retornará a chave primária da linha que é inserida de volta para você como resultado.

Observe que não precisamos definir o ID da linha que estamos inserindo no banco de dados, porque o id é uma propriedade autoincrementada, o que significa que o SQLite incrementará automaticamente essa propriedade toda vez que inserirmos uma linha nessa tabela.


Lidando com erro de inserção

O que acontece se houver um problema com a operação de inserção? Se você quiser saber se a operação de inserção falhou ou o que causou a falha, será necessário usar outro método de banco de dados chamado insertOrThrow em vez de insert. Isso fará com que a operação de inserção lance uma SQLException se algo der errado durante a operação de inserção. Para observar o erro de inserção, veja como deve ser o método.

private void saveCustomerToDatabase(Customer customer) {
if (mDatabase != null){
//prepare the transaction information that will be saved to the database
ContentValues values = new ContentValues();
values.put(Constants.COLUMN_NAME, customer.getCustomerName());
values.put(Constants.COLUMN_EMAIL, customer.getEmailAddress());
values.put(Constants.COLUMN_PHONE, customer.getPhoneNumber());
values.put(Constants.COLUMN_IMAGE_PATH, customer.getProfileImagePath());
values.put(Constants.COLUMN_STREET1, customer.getStreetAddress());
values.put(Constants.COLUMN_STREET2, customer.getStreetAddress2());
values.put(Constants.COLUMN_CITY, customer.getCity());
values.put(Constants.COLUMN_STATE, customer.getCity());
values.put(Constants.COLUMN_ZIP, customer.getPostalCode());
values.put(Constants.COLUMN_NOTE, customer.getNote());
values.put(Constants.COLUMN_DATE_CREATED, System.currentTimeMillis());
values.put(Constants.COLUMN_LAST_UPDATED, System.currentTimeMillis());
try { mDatabase.insertOrThrow(Constants.CUSTOMER_TABLE, null, values);
Log.d(LOG_TAG, "Customer Added");
} catch (SQLException e) {
Log.d(LOG_TAG, "Error " + e.getCause() + " " + e.getMessage());
}
}


Gerenciando Relacionamentos SQLite

A restrição de chave estrangeira é o principal mecanismo usado para implementar relacionamentos no SQLite. De acordo com a documentação do SQLite, “Restrições de chave estrangeira do SQL são usadas para impor relações “existentes” entre tabelas.” O suporte de chave estrangeira precisa estar habilitado para que funcione. Para habilitar a chave estrangeira, substitua o onConfigureMethod () da nossa classe DatabaseHelper.java como abaixo.

@Override
public void onConfigure(SQLiteDatabase db) {
db.setForeignKeyConstraintsEnabled(true);
}

Com isso, agora podemos impor algumas restrições de integridade às nossas tabelas, por exemplo, podemos excluir todos os LineItems se as transações a que eles pertencem forem excluídos da seguinte forma:

private static final String CREATE_LINEITEM_TABLE
"CREATE TABLE " + Constants.LINEITEM_TABLE + "("
+ Constants.COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ Constants.COLUMN_QUANTITY + " INT NOT NULL, "
+ Constants.COLUMN_PRODUCT_ID + " INTEGER, "
+ Constants.COLUMN_TRANSACTION_ID + " INTEGER, "
+ Constants.COLUMN_DATE_CREATED + " BIGINT, "
+ Constants.COLUMN_LAST_UPDATED + " BIGINT, "
+ "FOREIGN KEY(product_id) REFERENCES product(_id),"
+ "FOREIGN KEY(transaction_id) REFERENCES transactions(_id) ON DELETE CASCADE" + ")";

Como o LineItem tem uma dependência na Transação, a Transação referenciada deve existir antes que uma inserção na tabela LineItem seja permitida. Como o relacionamento de chave estrangeira é definido no LineItem, isso significa que o relacionamento entre uma transação e um LineItem é de um-para-muitos. Observe também o relacionamento entre um LineItem e um Produto, que também é um relacionamento um-para-muitos, com o Produto sendo o extremo único e o LineItem sendo o de muitos.


Inserir registros de transação no banco de dados

No arquivo de classe CheckoutFragment.java, você verá um método vazio chamado checkout (), precisamos implementar esse método para salvar os registros Transaction no banco de dados. Este é um carrinho de compras de demonstração, não processamos o pagamento pela transação, estamos apenas criando um registro de transação com as informações no carrinho de compras.

Como a Transação tem um relacionamento um-para-muitos com LineItens, precisamos implementar o método checkout () em duas etapas. Primeiro, criamos e salvamos o registro de transação. Em seguida, usando a chave primária desse registro que é retornado como um id, vamos iterar LineItens para essa transação e salve cada um com o ID da transação. Abaixo está um método checkout () atualizado.

private void checkout() {
SalesTransaction transaction = new SalesTransaction();
transaction.setCustomerId(mCart.getSelectedCustomer().getId());
transaction.setLineItems(mCart.getShoppingCart());
transaction.setTaxAmount(tax);
transaction.setSubTotalAmount(subtotal);
transaction.setTotalAmount(total);
transaction.setPaymentType(selectedPaymentType);
transaction.setPaid(paid);

List<LineItem> lineItems = mCart.getShoppingCart();

long id = saveTransactionToDatabase(transaction);

if (id != -1) {
for (LineItem lineItem: lineItems){
saveLineItemToDatabase(id, lineItem);
}
}

}

Originalmente publicado em:

http://valokafor.com/android-sqlite-database/ .



Games recomendados.


Dota 2

Rainbow Six

Rounded Image

Pubg 2

Rounded Image


Meus Conhecimentos

HTML

PHP

JavaScript

Android



Entre em contato! (ou não!)

info_outline
Me envie um email em: eduardo-balbo@hotmail.com


Localização da Fatec