Ver mensagens sem resposta | Ver tópicos ativos Hoje é 21 Nov 2017, 09:13



Responder Tópico  [ 7 Mensagens ] 
 Android + ORMLite (Banco de Dados Orientado a Objeto) 
Autor Mensagem
What is a Activity?
What is a Activity?

Data de registro: 15 Jun 2011, 17:56
Mensagens: 10
Mensagem Android + ORMLite (Banco de Dados Orientado a Objeto)
Pra quem quer mesmo se livra do SQL segue uma dica, o ORMLite tem suporte completo a android, até com uma parte dele propriamente dedicado a isso, com classes como por exemplo o ORMSqliteOpenHelper que facilita e muito o trabalho com o banco de dados. Também possui a TableUtils, que torna a criação e a atualização do banco infinitamente mais fáceis.

Neste post eu vou colar um pouco mais de código, mas é tudo bem facil de entender e tudo muito bem comentado, mas mesmo assim, qualquer dúvida não deixem de perguntar, estarei respondendo o mais brevemente possível.

Modelo do Objeto:

package com.ibssistemas.ibs.models;

import java.util.Date;

import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;

@DatabaseTable(tableName="Pessoa")
public class Pessoa {
    @DatabaseField(id=true)
    private int CD_PESSOA;
    @DatabaseField()
    private Short TP_PESSOA;
    @DatabaseField()
    private String NM_PESSOA;
    @DatabaseField()
    private String NM_FANTASIA;
    @DatabaseField()
    private String DS_ENDERECO;
    @DatabaseField()
    private String NR_ENDERECO;
    @DatabaseField()
    private String DS_BAIRRO;
    @DatabaseField()
    private String CD_ESTADO;
    @DatabaseField()
    private int CD_CIDADE;
    @DatabaseField()
    private String CD_CEP;
    @DatabaseField()
    private String DS_EMAIL;
    @DatabaseField()
    private String NR_TELEFONE;
    @DatabaseField()
    private String NR_FAX;
    @DatabaseField()
    private String CD_CGCCPF;
    @DatabaseField()
    private Date DT_NASCIMENTO;
    @DatabaseField()
    private String NM_COMPRADOR;
    @DatabaseField()
    private String BL_OBS;
    @DatabaseField()
    private int CD_TB_PRECO_ATIV;
    @DatabaseField()
    private int FG_ENVIASERVIDOR;
   
    public Pessoa() {}

    public Pessoa(int cDPESSOA, Short tPPESSOA, String nMPESSOA,
            String nMFANTASIA, String dSENDERECO, String nRENDERECO,
            String dSBAIRRO, String cDESTADO, int cDCIDADE, String cDCEP,
            String dSEMAIL, String nRTELEFONE, String nRFAX, String cDCGCCPF,
            Date dTNASCIMENTO, String nMCOMPRADOR, String bLOBS,
            int cDTBPRECOATIV, int fGENVIASERVIDOR) {
        super();
        CD_PESSOA = cDPESSOA;
        TP_PESSOA = tPPESSOA;
        NM_PESSOA = nMPESSOA;
        NM_FANTASIA = nMFANTASIA;
        DS_ENDERECO = dSENDERECO;
        NR_ENDERECO = nRENDERECO;
        DS_BAIRRO = dSBAIRRO;
        CD_ESTADO = cDESTADO;
        CD_CIDADE = cDCIDADE;
        CD_CEP = cDCEP;
        DS_EMAIL = dSEMAIL;
        NR_TELEFONE = nRTELEFONE;
        NR_FAX = nRFAX;
        CD_CGCCPF = cDCGCCPF;
        DT_NASCIMENTO = dTNASCIMENTO;
        NM_COMPRADOR = nMCOMPRADOR;
        BL_OBS = bLOBS;
        CD_TB_PRECO_ATIV = cDTBPRECOATIV;
        FG_ENVIASERVIDOR = fGENVIASERVIDOR;
    }

    //Tirei os getters e setters pro tópico não fica enormemente gigantesco, mas todo mundo vou deixar um só de exemplo:

    public int getCD_PESSOA() {
        return CD_PESSOA;
    }

    public void setCD_PESSOA(int cDPESSOA) {
        CD_PESSOA = cDPESSOA;
    }
}


Esse é o modelo de como a tabela vai ser criada e administrada, entre queries, updates e creates.
Agora, o dbHelper com o getDAO desse objeto:

package com.ibssistemas.ibs.system;

import java.sql.SQLException;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

import com.ibssistemas.ibs.models.CondPagtos;
import com.ibssistemas.ibs.models.Estoque;
import com.ibssistemas.ibs.models.Grupo;
import com.ibssistemas.ibs.models.ItemPedido;
import com.ibssistemas.ibs.models.Pedido;
import com.ibssistemas.ibs.models.Pessoa;
import com.ibssistemas.ibs.models.Produto;
import com.ibssistemas.ibs.models.TabelaPreco;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;

public class dbHelper extends OrmLiteSqliteOpenHelper {
    private static String DB_NAME = "IBS.db4";
    private static int DB_VERSION = 1;
   
    //----------!DAOS!-----------
    private Dao<Pessoa, Integer> PessoaDao = null;
   
    public dbHelper(Context ctx) {
        super(ctx, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase DB, ConnectionSource Conn) {
        try {
        TableUtils.createTable(Conn, Pessoa.class);
        } catch (Exception e) {
            myLog.doLog(new String[] {"Erro ao criar tabelas:"}, e.getMessage());
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase DB, ConnectionSource Conn, int Old,
            int New) {
        if (New > Old) {
            try {
            TableUtils.dropTable(Conn, Pessoa.class, false);
            this.onCreate(DB, Conn);
            } catch (Exception e) {
                myLog.doLog(new String[]{"Erro ao atualizar tabelas para nova versão!"}, e.getMessage());
            }
        }
    }

    public Dao<Pessoa, Integer> getPessoaDao() throws SQLException {
        if (PessoaDao == null) {
            PessoaDao = getDao(Pessoa.class);
        }
        return PessoaDao;
    }


E finalmente o uso aplicável disso tudo ali em cima, não vou colar a classe inteira por que tem JSON misturado e pode ficar um pouco confuso, rs, vou colar só a parte que interessa.
Entendam que cliente é um objeto que se refere a pessoa.

Dao<Pessoa, Integer> daO = DB.getPessoaDao();
Pessoa n = new Pessoa();
                n = daO.queryForId(Integer.valueOf(cliente.getString("cdCliente")));
                int tipoSync = 1; //0 = Insert || 1 = Update
                //Se o nome da pessoa for nulo ou tiver tamanho igual a 0, define tipoSync=0
                if(n.getNM_PESSOA().length() == 0 || n.getNM_PESSOA() == null)
                    tipoSync = 0;      
                //Insere/Altera os dados do objeto Pessoa
                n.setCD_PESSOA(Integer.valueOf(cliente.getInt("cdCliente")));
                n.setNM_PESSOA(cliente.getString("nmRazao"));
                n.setDS_EMAIL(cliente.getString("dsEmail"));
                n.setNM_FANTASIA(cliente.getString("nmCliente"));
                n.setNM_COMPRADOR(cliente.getString("nmComprador"));
                n.setCD_CGCCPF(cliente.getString("cdCPFCNPJ"));
                n.setDS_ENDERECO(cliente.getString("dsEndereco"));
                n.setNR_ENDERECO(cliente.getString("nrEndereco"));
                n.setDS_BAIRRO(cliente.getString("dsBairro"));
                n.setCD_ESTADO(cliente.getString("cdUF"));
                n.setCD_CIDADE(Integer.valueOf(cliente.getInt("cdCidade")));
                n.setCD_CEP(cliente.getString("dsCEP"));
                n.setNR_TELEFONE(cliente.getString("nrTelefone"));
                n.setNR_FAX(cliente.getString("nrFax"));
                n.setCD_TB_PRECO_ATIV(Integer.valueOf(cliente.getInt("cdTabela")));
                n.setBL_OBS(cliente.getString("blObs"));
                n.setDT_NASCIMENTO(Date.valueOf(cliente.getString("dtNascimento")));
                n.setFG_ENVIASERVIDOR(0);
                //Faz Inserção ou Update, dependendo do tipoSync
                if (tipoSync == 0)
                    daO.create(n);
                else
                    daO.update(n);


Bom, é isso ai, sei que meu código não é um dos mais concisos que vocês veêm por ai, mas eu programo do melhor jeito que sei, estou mexendo com Android a 1 mês mais ou menos, e não tinha conhecimento de Java antes disso, de vez em quando me vejo buscando documentação das classes básicas. Reforçando, qualquer dúvida, perguntem :P respondo na medida do possível.

Sobre performance: Estou usando o ORM com um banco de dados relativamente grande para um aplicativo móvel, cada aplicativo deve ter pelo menos 500 clientes e mais de 2000 produtos sincronizados e gravados na base, não vou dizer que a performance é 100% mas isso se deve também a eu estar usando JSON. Então, façam testes de performance ai e me digam como está para vocês.

Aquele abraço.


17 Ago 2011, 12:56
Perfil
What is DDMS?
What is DDMS?

Data de registro: 26 Jun 2010, 00:39
Mensagens: 32
Mensagem Re: Android + ORMLite (Banco de Dados Orientado a Objeto)
No meu projeto ta dando NoClassDefFound quando tento instanciar "dbHelper extends OrmLiteSqliteOpenHelper"
Ja teve esse erro?


public class DatabaseHelper2 extends OrmLiteSqliteOpenHelper{
   
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "BANCO.db";
   
   
    public DatabaseHelper2(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) {
        Log.i("erro", "oncreate");
        /*try {
            TableUtils.createTable(connectionSource, Pessoa.class);
           
        } catch (SQLException e) {
            Log.e(DatabaseHelper.class.getName(), "Can't create databases", e);
            throw new RuntimeException(e);
        }*/

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion,
            int newVersion) {
        Log.i("erro", "onupdate");
        /*try {
            Log.i(DatabaseHelper.class.getName(), "onUpgrade");
            TableUtils.dropTable(connectionSource, Pessoa.class, true);
            onCreate(db, connectionSource);
        } catch (SQLException e) {
            Log.e(DatabaseHelper.class.getName(), "Can't drop databases", e);
            throw new RuntimeException(e);
        }*/

    }

}
 


public class HelloActivity extends Activity  {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DatabaseHelper dbHelper = new DatabaseHelper(HelloActivity.this);
        setContentView(R.layout.main);
    }
}


28 Ago 2011, 22:08
Perfil
Application Life Cycle
Application Life Cycle
Avatar de usuário

Data de registro: 08 Ago 2011, 16:21
Mensagens: 226
Localização: Ponta Grossa - PR / Blumenau - SC
Mensagem Re: Android + ORMLite (Banco de Dados Orientado a Objeto)
Muito bom, pretendo testar esse código quando chegar em casa =)

_________________
Eu te ajudei? Quer agradecer? Não precisa nem postar no tópico agradecendo, você me ajudaria muito entrando em um dos meus blogs, comentando e compartilhando os posts nas redes sociais.
Blog: Cedulio Cezar- Tutoriais e dicas voltados para o desenvolvimento de softwares em Java e Android.
Blog: Pedreiros do Software - Tutoriais sobre Java, Android, Banco de dados, Arquitetura, JSF.

App: ThinkTwice - Aplicativo que auxilia no aprendizado de outros idiomas.
App: InstantGilGomes- Aplicativo de humor com bordões clássicos do ilustre Gil Gomes.


Editado pela última vez por ByddU em 09 Ago 2012, 12:02, num total de 1 vezes



29 Set 2011, 18:25
Perfil
What is Android?
What is Android?

Data de registro: 07 Abr 2010, 17:22
Mensagens: 3
Mensagem Re: Android + ORMLite (Banco de Dados Orientado a Objeto)
Bom dia jlferrari.

To começando a desenvolver com o Android e pesquisando sobre como utilizar banco de dados orientado a objetos achei esse post seu.

Não ficou faltando nenhum código na classe dbHelper? Quando chamo o método getDao do método getPessoaDao diz que tal método [getDao] não foi definido.

Desde já agradeço pela ajuda.


17 Out 2011, 05:25
Perfil
Hello World!
Hello World!

Data de registro: 12 Mar 2014, 00:03
Mensagens: 25
Mensagem Re: Android + ORMLite (Banco de Dados Orientado a Objeto)
Olha, realmente gostei do ORMLite, mas não entendi a parte do INSERT OU UPDATE.

Vc diz ali que se o nome da pessoa for nulo ou tamanho é igual a zero ele define o TypoSync = 0 ou seja, ele insere.
Mas se vc pegar uma lógica, NUNCA que vc vai cadastrar uma pessoa com o nome nullo ou com tamanho igual a zero, ou seja, ele nunca vai inserir?
É isso mesmo ou eu estou entendendo totalmente errado hehe.

Estou perguntando isso, pois estou fazendo meu projeto e pensei que o sqlite nativo fazia esse Insert/Update. Agora que já fiz umas mil linhas de códigos notei que vou ter que começar do zero e utilizar o ORMLite, pois estou pegando os dados de um webservice e dá mto trabalho para fazer o insert/update pois tenho trocentas tabelas no meu app..


06 Mai 2014, 00:02
Perfil
I am API
I am API

Data de registro: 04 Jan 2012, 12:44
Mensagens: 808
Mensagem Re: Android + ORMLite (Banco de Dados Orientado a Objeto)
Depende da anotação que você colocar no atributo id:

Assim você esta falando que o campo é id, e não pode duplicar.
@DatabaseField(id=true)

Com essa outra, você esta falando que o campo é id, e se não tiver id no objeto pessoa ele cria.
@DatabaseField(generatedId = true, allowGeneratedIdInsert = true)

Olha a documentação: http://ormlite.com/javadoc/ormlite-core ... Field.html

_________________

E-Mail: thales.bm@hotmail.com
LinkedIn: LinkedIn
Aplicativos no Google Play: Biblioteca de Aplicativos
Livro de Estudos: Google Android - 3ª Edição


20 Mai 2014, 12:36
Perfil
What is Android?
What is Android?

Data de registro: 17 Jul 2014, 17:42
Mensagens: 5
Mensagem Re: Android + ORMLite (Banco de Dados Orientado a Objeto)
Eu sei que é pedir demais mas, poderia disponibilizar o código fonte né? Assim não fica tão extenso mas podemos de fato testar seu código uma vez debugado as libs necessárias.

Valeu!


17 Jul 2014, 17:58
Perfil
Mostrar mensagens anteriores:  Organizar por  
Responder Tópico   [ 7 Mensagens ] 

Quem está online

Usuários vendo este fórum: Adeja, Adriano, AdrianoMM, alexandrefett, Alexandrercarvalho, alexcost2002, alexvbh, allart, americano, andi, andrewort, Andrey, apoena, AT-AT, BTalhadas, btminzon, capo, carlosavasconcelos, cassiano, Celso Jr., cfranca, Chanceler Supremo Finis Valorum, Chassot, Chefe Nass, Christiane, CKorneLL, claudioalfonso, cleberkct, craudiao, Crazy_Droid, criscmaia, dariosena, Darth Sidious, DAVINCE, dbuarque, Delão, dikiloco, Dirceu W. C. Conte, DITÃO, dudu795, EduardoYC, eduzortea, Eliezer Reis, elisa, epsilva, erikopa, erissi, fcoroa, ffardo, flaviolemos, fmakula, frederico.affini, furlanrapha, gustavo, guto.pro, HanNiBaLSeTDf, heliopassos, humberto, Idelto, inaciofernandes, jackstuard, jcorreajr, jhhm_2008, jonasminas, jorgecardoso, jorgeFernandes, José Guilherme, JRSIQUEIRA, juliancesar, Julio Assis, Juninhooooo, juniorfranca, kleberperea, kusanaguy, lafamac, Leonardo333, leonardodamata, lillian.brandao, lufreitas, Luke Skywalker, maiconjunches, marcosrogel, marianatallas, mateusff, maurosilva, miguel, mikasjau, mmfsndroid, nardosnt, Nice, niloleite, oliverlessa, Patrick, Paulo, Paulo Bizzo, pbcjunior, pgsnit, Philipe Alves, pjorge, poponeis, Portal Android, ramonrabello, raragao, rbenatti, regisjj, renegheller, rfrafael, rixargolo, rmendes, Roberto, robsonoracle, rodrigo aguiar, romulotales, rtodao, sephct, siker C3PO, Silvio Vaz, taluna, thanaptos, Thitto, tiago, tnarnold, Toks, Transtago, Vania, Vector, vicfalmac, voliverio, washington, Wenceslau, Wryel, wylken, xa:=zin e 1 visitante


Você não pode criar novos tópicos neste fórum
Você não pode responder tópicos neste fórum
Você não pode editar suas mensagens neste fórum
Você não pode excluir suas mensagens neste fórum
Você não pode enviar anexos neste fórum

Procurar por:

© 2007 - 2016 Portal Android - Comunidade de Desenvolvedores Android

Estamos no Linkedin    Siga-nos no twitter


Powered by phpBB - Hospedado por Bemobi