Como trabalho da faculdade, tenho que desenvolver um mini sgbd.
As colunas das tabelas devem ser variáveis bem como o tamanho da mesma.
Isto não é muito difícil de fazer, meu problema é que tenho que passar como parâmetro da o tipo de dados que minha coluna vai armazenar, e isto não está funcionando adequadamente.
Estou utilizando como tipo genérico o Class, mas já tentei usar T, nos dois casos não fui muito longe.
Esse aí é como está o código atualmente, não tem muita coisa, empaquei mesmo na hora de tipar o meu array
se alguém tiver uma idéia, um código pra dar uma olhada tudo é bem vindo.
packageorg.domain.teste.session;importjava.util.HashMap;importjava.util.Map;publicclassTable{privateStringname;privateMap<String,Object>columns;publicTable(Stringname){this.name=name;columns=newHashMap<String,Object>();}publicvoidaddColumn(Stringname,Objecttype){if(name!=null&&type!=null){if(!columns.containsKey(name)){columns.put(name,type);System.out.println("Coluna "+name+" adicionada com sucesso!");}else{System.out.println("# Coluna não adicionada");System.out.println("# Já existe uma coluna com o nome "+name);}}}publicvoidremoveColumn(Stringname){if(name!=null){if(columns.containsKey(name)){columns.remove(name);System.out.println("Coluna "+name+" removida com sucesso!");}else{System.out.println("# Coluna não removida");System.out.println("# Não existe uma coluna com o nome "+name);}}}publicvoidalterColumn(Stringname,Objecttype){if(name!=null&&type!=null){if(columns.containsKey(name)){columns.put(name,type);System.out.println("Coluna "+name+" alterada com sucesso!");}else{System.out.println("# Coluna não alterada");System.out.println("# Não existe uma coluna com o nome "+name);}}}publicObjectgetTypeColumn(Stringname){returncolumns.get(name);}publicMap<String,Object>getColumns(){returncolumns;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}}
Tá pronto a parte superficial … e é uma idéia, pode não ser a melhor.
Qndo eu tiver mais tempo faço a parte dos dados, para q sejam tipados.
aluisiodsv
Eita. Esqueci de colocar os comentários para explicar melhor …
Estou meio sem tempo.
Balena
cara eu até entendi…
o problema é como é que eu preciso adicionar os dados, e verificar tipagem…
não entendi como eu vou fazer isso usando Object
aluisiodsv
Ao adicionar uma nova coluna em coluns vc passa o nome do campo e o tipo.
Por exemplo, usando o método:
addColumn("id",Integer);addColumn("nome",String);
aí no código onde vai ser adicionado os valores ficaria mais ou menos assim:
// Parte em q adiciona na coluna idif(idinstanceofcolumns.get("id")){dados.add(id);}
É claro q o q eu coloquei aí é só pra exemplificar minha idéia.
No código isso vai ficar variável, pois vc pode adicionar quantas colunas quiser.
aluisiodsv
AUHUAuHAUHU … tá pronto!
Quem vê pensa q eu não trabalho…
Realmente tinha razão sobre o Object. Tinha q ser Class.
packageorg.domain.teste.session;importjava.util.ArrayList;importjava.util.LinkedHashMap;importjava.util.List;importjava.util.Map;publicclassTable{privateStringname;privateMap<String,Class>columns;privateList<List<Object>>data;publicTable(Stringname){this.name=name;columns=newLinkedHashMap<String,Class>();setData(newArrayList<List<Object>>());}publicvoidaddNewRow(Object...type){// Verifica se a quantidade de objetos passados é igual a quantidade de// colunasintcount=0;for(Objecto:type)count++;if(count!=columns.size())System.out.println("# Quantidade de objetos passados não confere com a quantidade de colunas da tabela");// Verifica os tipos e adiciona os dados na listaList<Object>row=newArrayList<Object>();List<Class>types=newArrayList<Class>(columns.values());inti=0;for(Objecto:type){if(types.get(i).equals(o.getClass())){row.add(o);i++;}else{row.clear();System.out.println("# Registro não adicionado");System.out.println("# "+o+" não é do tipo "+types.get(i).getClass());break;}}// Verifica se todos os dados foram adicionadosif(row.size()!=count){System.out.println("# Ocorreu algum erro ao adicionar os dados :(");}// Por fim adiciona esta linha na tabeladata.add(row);}publicvoiddataList(){for(List<Object>row:data){StringrowString="[";for(Objecto:row){rowString+=o+",";}rowString+="]";System.out.println(rowString);}}publicvoidaddColumn(Stringname,Classclazz){if(name!=null&&clazz!=null){if(!columns.containsKey(name)){columns.put(name,clazz);System.out.println("Coluna "+name+" adicionada com sucesso!");}else{System.out.println("# Coluna não adicionada");System.out.println("# Já existe uma coluna com o nome "+name);}}}publicvoidremoveColumn(Stringname){if(name!=null){if(columns.containsKey(name)){columns.remove(name);System.out.println("Coluna "+name+" removida com sucesso!");}else{System.out.println("# Coluna não removida");System.out.println("# Não existe uma coluna com o nome "+name);}}}publicvoidalterColumn(Stringname,Classclazz){if(name!=null&&clazz!=null){if(columns.containsKey(name)){columns.put(name,clazz);System.out.println("Coluna "+name+" alterada com sucesso!");}else{System.out.println("# Coluna não alterada");System.out.println("# Não existe uma coluna com o nome "+name);}}}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicObjectgetTypeColumn(Stringname){returncolumns.get(name);}publicMap<String,Class>getColumns(){returncolumns;}publicvoidsetData(List<List<Object>>data){this.data=data;}publicList<List<Object>>getData(){returndata;}}
packageorg.domain.teste.session;publicclassTeste{publicstaticvoidmain(String[]args){// Nova tabelaTabletable=newTable("cliente");// Adicionar as colunas da tabelatable.addColumn("id",Integer.class);table.addColumn("name",String.class);table.addColumn("single",Boolean.class);// Adicionar dados *table.addNewRow(1,"Aluisio",true);table.addNewRow(1,"Teste",false);table.addNewRow(3,"Outro teste",false);table.dataList();}}
Quero meus créditos hein ?!
Balena
Caramba muito bom…
cheguei em algo bem parecido…
agora estou mechendo com o remove…
que no meu caso tem que ser feito de forma arbitrária, acessando o arquivo…
mas to quase lá já…
quando estiver pronto eu posto o código aqui pra você dar uma olhada…
mas ficou fera esse que vc fez aí…
muito bom mesmo…
Obrigado pela ajuda…
Foi bem esclarecedor…
Balena
Um pouco complexo mas como prometi, essa é a solução que conseguimos chegar por aqui…
Agradecimento ao aluisiodsv por ter esclarecido algumas dúvidas, e por ter se empenhado tanto em ajudar com uma solução proópria.
meu código segue:
importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.util.ArrayList;importjava.util.HashMap;/** * * @author Balena */publicclassGravaArquivo{privateHashMap<Object,Integer>hashBanco;privateArrayList<Integer>emUso;privateFilef;privateFilehash;privateBufferedInputStreambInStream;privateBufferedOutputStreambOutStream;privateFileOutputStreamfOutStream;privateFileInputStreamfInStream;privateObjectOutputStreamoutStream;privateObjectInputStreaminStream;privateDataInputStreamdInStream;privateDataOutputStreamdOutStream;privateintindiceArquivo;publicGravaArquivo(){f=newFile("BalenaDB");hash=newFile("HashDB");indiceArquivo=0;}publicvoidaddData(ArrayList<Object>data)throwsException{fOutStream=newFileOutputStream(f,true);outStream=newObjectOutputStream(fOutStream);if(fOutStream==null){throw(newException("Arquivo não existe"));}if(outStream==null){throw(newException("Arquivo não existe, ou existem instancias já abertas"));}outStream.writeObject(data);//hashBanco.put(data.getIndiceChave(), i);outStream.close();fOutStream.close();}publicArrayList<Object>getLinha(Objectchave)throwsException{indiceArquivo=hashBanco.get(chave);fInStream=newFileInputStream(f);bInStream=newBufferedInputStream(fInStream);inStream=newObjectInputStream(bInStream);if(fInStream==null){thrownewException("Este arquivo não existe");}if(inStream==null){thrownewException("Arquivo em uso");}ArrayList<Object>linha=newArrayList<Object>();for(intj=0;j<=indiceArquivo;j++){if(emUso.contains(j)){linha=(ArrayList<Object>)inStream.readObject();inStream=newObjectInputStream(bInStream);}}returnlinha;}publicvoiddeleteLine(Objectchave)throwsException{Integerindice;indice=hashBanco.get(chave);hashBanco.remove(chave);emUso.remove(indice);}publicvoidgravaNaHash(Objectchave){hashBanco.put(chave,indiceArquivo);indiceArquivo++;emUso.add(indiceArquivo);}publicvoidwriteData(ArrayList<Class>colunas,ArrayList<String>nomeColunas)throwsException{fOutStream=newFileOutputStream(hash,true);bOutStream=newBufferedOutputStream(fOutStream);outStream=newObjectOutputStream(bOutStream);outStream.writeObject(hashBanco);outStream.writeObject(emUso);outStream.writeObject(colunas);outStream.writeObject(nomeColunas);outStream.close();bOutStream.close();fOutStream.close();}publicArrayListreadColumns()throwsException{fInStream=newFileInputStream(hash);bInStream=newBufferedInputStream(fInStream);inStream=newObjectInputStream(bInStream);if(fInStream==null){thrownewException("Este arquivo não existe");}if(inStream==null){thrownewException("Arquivo em uso");}hashBanco=(HashMap)inStream.readObject();inStream=newObjectInputStream(bInStream);emUso=(ArrayList)inStream.readObject();inStream=newObjectInputStream(bInStream);return(ArrayList)inStream.readObject();}publicArrayListreadNameColumns()throwsException{fInStream=newFileInputStream(hash);bInStream=newBufferedInputStream(fInStream);inStream=newObjectInputStream(bInStream);if(fInStream==null){thrownewException("Este arquivo não existe");}if(inStream==null){thrownewException("Arquivo em uso");}for(inti=0;i<3;i++){inStream=newObjectInputStream(bInStream);}return(ArrayList)inStream.readObject();}}importjava.io.Serializable;importjava.util.ArrayList;/** * * @author Balena */publicclassTabelaimplementsSerializable{ArrayList<Class>colunas;ArrayList<String>nomeColunas;ArrayList<Object>linha;GravaArquivog;intindiceChave;intnumColunas;publicTabela(){g=newGravaArquivo();this.colunas=leColunas();this.nomeColunas=leNomeColunas();numColunas=0;}publicvoidadicionarColuna(Classclasse,Stringnome){colunas.add(classe);nomeColunas.add(nome);numColunas++;}publicvoidaddDataColumn(Classtype,Objectdata)throwsException,NullPointerException{if(linha==null){linha=newArrayList<Object>();}if(type.toString().equals(data.getClass().toString())){linha.add(data);}else{thrownewException("Tipos inconsistentes de dados");}}publicvoidaddLine(ArrayList<Object>linha){inti=0;for(Objecto:linha){if((o.getClass().equals(colunas.get(i)))){this.linha.add(o);}}try{g.addData(linha);g.gravaNaHash(linha.get(indiceChave));}catch(Exceptionex){System.out.println(ex.toString());}}publicvoiddeleteLine(Objectchave){if(chave.getClass().equals(colunas.get(indiceChave))){try{g.deleteLine(chave);}catch(Exceptionex){System.out.println(ex.toString());}}}publicvoidprintLine(){for(Objecto:linha){System.out.println(o.toString()+" Tipo: "+o.getClass());}}publicvoidsetKey(StringnomeCampo){intaux=0;for(inti=0;i<nomeColunas.size();i++){if(nomeColunas.get(i).equals(nomeCampo)){aux=i;}}indiceChave=aux;}publicvoidgravaColunas(){try{g.writeData(colunas,nomeColunas);}catch(Exceptionex){System.out.println(ex.toString());}}publicfinalArrayListleColunas(){ArrayList<Class>colunas=newArrayList<Class>();try{colunas=g.readColumns();}catch(Exceptionex){System.out.println(ex.toString());}returncolunas;}publicfinalArrayListleNomeColunas(){ArrayList<String>nomeColunas=newArrayList<String>();try{nomeColunas=g.readNameColumns();}catch(Exceptionex){System.out.println(ex.toString());}returnnomeColunas;}publicArrayList<Class>getColunas(){returncolunas;}publicintgetIndiceChave(){returnindiceChave;}}publicclassMain{/** * @param args the command line arguments */publicstaticvoidmain(String[]args){// TODO code application logic hereTabelat=newTabela();t.adicionarColuna(Integer.class,"id");t.adicionarColuna(String.class,"nome");try{t.addDataColumn(Integer.class,1);t.addDataColumn(String.class,"Lucas");}catch(Exceptionex){System.out.println(ex.toString());}t.printLine();ArrayList<Object>linha=newArrayList<Object>();linha.add(2);linha.add("Balena");t.addLine(linha);}}
Mas ainda está dando um errinho…
que eu vou ter qeu descobrir, porque é que ele não consegue criar o arquivo hashDB…
aluisiodsv
AUHUAhuuAhAUH … ficou legal.
Dá pra brincar muito com um negócio desses.
Balena
sim com certeza.
aluisiodsv
Obs: Corrigi alguns errinhos q tinha. Ao passar o código aqui ele mudou um negócio lá:
era assim List<List><…>>
ele pois assim List<List><…>>