As aplicações são guardadas em conjunto com a base de dados numa área isolada (sandbox) no entanto podes fazer uma cópia da base de dados em runtime para a área "documents" que no caso do Android representa a raíz do cartão SD. No caso do iOS representa uma área reservada de documentos dentro da própria sandbox e terás de preparar o xml para esse efeito (depois via iTunes consegues chegar ao ficheiro).
2013/1/22 Luis Costa <[email protected]> > Na generalidade, onde é que as aplicações são guardadas. É que não consigo > encontrar a que criei em nenhuma pasta para ver a base de dados que é > suposto estar criada e que fazendo um trace diz que não existe > > > On Tue, Jan 22, 2013 at 3:48 PM, Hugo Ferreira <[email protected]>wrote: > >> Sim, é preciso permissão de leitura/escrita no SD (podes configurar isto >> via FB ou via xml). >> >> >> 2013/1/22 Luis Costa <[email protected]> >> >>> Boas, continuando neste tópico. >>> Já tenho a app criada, mas não me está a escrever na BD. É necessário >>> algum tipo de permissões no tablet para tal ? >>> >>> O meu código de mysql: >>> >>> >>> private var sqlc:SQLConnection = new SQLConnection(); >>> // sqlc is an SQLStatment which we need to execute our sql commands >>> private var sqls:SQLStatement = new SQLStatement(); >>> // ArrayCollection used as a data provider for the datagrid. It has to >>> be bindable so that data in datagrid changes automatically when we change >>> the ArrayCollection >>> [Bindable] >>> private var dp:ArrayCollection = new ArrayCollection(); >>> >>> // function we call at the begining when application has finished >>> loading and bulding itself >>> private function start():void >>> { >>> // first we need to set the file class for our database (in this >>> example test.db). If the Database doesn't exists it will be created when we >>> open it. >>> var db:File = >>> File.applicationStorageDirectory.resolvePath("booksapp.db"); >>> // after we set the file for our database we need to open it with >>> our SQLConnection. >>> sqlc.openAsync(db); >>> // we need to set some event listeners so we know if we get an sql >>> error, when the database is fully opened and to know when we recive a >>> resault from an sql statment. The last one is uset to read data out of >>> database. >>> sqlc.addEventListener(SQLEvent.OPEN, db_opened); >>> sqlc.addEventListener(SQLErrorEvent.ERROR, error); >>> sqls.addEventListener(SQLErrorEvent.ERROR, error); >>> sqls.addEventListener(SQLEvent.RESULT, resault); >>> >>> } >>> >>> private function db_opened(e:SQLEvent):void >>> { >>> // when the database is opened we need to link the SQLStatment to >>> our SQLConnection, so that sql statments for the right database. >>> // if you don't set this connection you will get an error when you >>> execute sql statment. >>> sqls.sqlConnection = sqlc; >>> // in property text of our SQLStatment we write our sql command. We >>> can also combine sql statments in our text property so that more than one >>> statment can be executed at a time. >>> // in this sql statment we create table in our database with name >>> "test_table" with three columns (id, first_name and last_name). Id is an >>> integer that is auto incremented when each item is added. First_name and >>> last_name are columns in which we can store text >>> // If you want to know more about sql statments search the web. >>> sqls.text = "CREATE TABLE IF NOT EXISTS books_table ( id INTEGER >>> PRIMARY KEY AUTOINCREMENT, title TEXT,author TEXT,year TEXT, spot TEXT, >>> borrowed TEXT, readed TEXT, avaliation TEXT)"; >>> // after we have connected sql statment to our sql connection and >>> writen our sql commands we also need to execute our sql statment. >>> // nothing will change in database until we execute sql statment. >>> sqls.execute(); >>> //Test on Insert >>> sqls.text = "INSERT INTO books_table >>> VALUES('11','22','33','44','55','66','77')"; >>> sqls.execute(); >>> // after we load the database and create the table if it doesn't >>> already exists, we call refresh method which i have created to populate our >>> datagrid >>> refresh(); >>> } >>> // function to add item to our database >>> private function addItem(title:String ,author:String ,year:String , >>> spot:String, borrowed:String, readed:String , avaliation:String):void >>> { >>> // in this sql statment we add item at the end of our table with >>> values first_name.text in column first_name and last_name.text for column >>> last_name >>> sqls.text = "INSERT INTO books_table >>> VALUES('"+title+"','"+author+"','"+year+"','"+spot+"','"+borrowed+"','"+readed+"','"+avaliation+"')"; >>> sqls.execute(); >>> >>> refresh(); >>> } >>> >>> // function to call when we want to refresh the data in datagrid >>> private function refresh(e:TimerEvent = null):void >>> { >>> // timer object which we need if sql statment is still executing so >>> that we can try again after 10 milliseconds. >>> var timer:Timer = new Timer(10,1); >>> timer.addEventListener(TimerEvent.TIMER, refresh); >>> >>> if ( !sqls.executing )// we need to check if our sql statment is >>> still executing our last sql command. If so we use Timer to try again in 10 >>> milliseconds. If we wouldn't check we could get an error because >>> SQLStatment can't execute two statments at the same time. >>> { >>> // sql statment which returns all the data from our >>> "test_table". To retrive only data from first_name and last_name columns we >>> would use "SELECT first_name,last_name FROM test_table" >>> sqls.text = "SELECT * FROM books_table" >>> sqls.execute(); >>> } >>> else >>> { >>> timer.start(); >>> } >>> } >>> >>> // method that gets called if we recive some resaults from our sql >>> commands. >>> //this method would also get called for sql statments to insert item and >>> to create table but in this case sqls.getResault().data would be null >>> private function resault(e:SQLEvent):void >>> { >>> // with sqls.getResault().data we get the array of objects for each >>> row out of our database >>> var data:Array = sqls.getResult().data; >>> // we pass the array of objects to our data provider to fill the >>> datagrid >>> dp = new ArrayCollection(data); >>> } >>> >>> // method to remove row from database. >>> private function remove(selIndex:Number):void >>> { >>> // sql statment to delete from our test_table the row that has the >>> same number in number column as our selected row from datagrid >>> sqls.text = "DELETE FROM books_table WHERE id="+dp[selIndex].id; >>> sqls.execute(); >>> refresh(); >>> } >>> // method which gets called when we recive an error from sql connection >>> or sql statment and displays the error in the alert >>> private function error(e:SQLErrorEvent):void >>> { >>> >>> }// ActionScript file >>> >>> >>> 2013/1/21 Luis Costa <[email protected]> >>> >>>> São os meus primeiros passos em programar para Android, todos as dicas >>>> são bem vindas :-) >>>> >>>> >>>> 2013/1/21 Hugo Ferreira <[email protected]> >>>> >>>>> OK. >>>>> Outra coisa importante a ter em atenção: Cache de dados. >>>>> Pequenas tabelas de dados que não sejam alvo de alterações frequentes >>>>> e que são de consulta frequente, deverão ficar em memória, poupando o >>>>> acesso ao cartão SD, no entanto isto tem de ser feito com peso e medida >>>>> pois como bem sabemos, a memória é um recurso escasso :) >>>>> >>>>> Programar "qualquer um" faz mas desenvolver uma aplicação com pinta :) >>>>> (funcionalidades completas e úteis e ao mesmo tempo rápida pode-se tornar >>>>> um grande desafio e a cereja no topo de bolo é faze-lo com um código de >>>>> fácil legibilidade e manutenção). >>>>> >>>>> >>>>> >>>>> No dia 21 de Janeiro de 2013 à36 18:48, Luis Costa < >>>>> [email protected]> escreveu: >>>>> >>>>> É apenas uma biblioteca, mas quando esta app ficar boa depois passo >>>>>> para outras secalhar mais pesadas. >>>>>> Vou optar por ver como gravar os dados no SQLite. >>>>>> >>>>>> >>>>>> 2013/1/21 Hugo Ferreira <[email protected]> >>>>>> >>>>>>> Boa tarde Luís. >>>>>>> >>>>>>> Se queres guardar um grande volume de dados no cartão SD, recomendo >>>>>>> o uso do SQLite mas atenção que o acesso ao cartão é lento pelo que aqui >>>>>>> toda e qualquer técnica de tunning deverá ser aplicada. >>>>>>> >>>>>>> Posso te dizer que numa das minhas primeiras aplicações nos >>>>>>> marketplaces chegou a demorar mais de 5 segundos ao carregar dados >>>>>>> auxiliares no arranque, após a bd ter ganho um grande volume de dados. >>>>>>> Após >>>>>>> estudar e aplicar todas as técnicas de tunning de sqlite, passou a >>>>>>> demorar >>>>>>> microsegundos. >>>>>>> >>>>>>> O Google aqui é teu amigo para descobrires como usar o SQLite e como >>>>>>> aplicar estas técnicas logo de ínicio. >>>>>>> >>>>>>> Se quiseres apenas guardar variáveis (por exemplo para o estado de >>>>>>> um jogo), então podes usar um processo menos pesado como o shared >>>>>>> object. >>>>>>> >>>>>>> >>>>>>> Cumprimentos, >>>>>>> Hugo. >>>>>>> >>>>>>> >>>>>>> No dia 21 de Janeiro de 2013 à44 18:33, Luis Costa < >>>>>>> [email protected]> escreveu: >>>>>>> >>>>>>>> Boas pessoal, >>>>>>>> Estou a fazer a minha primeira experiência de aplicação para >>>>>>>> Android com Adobe Flash Builder, >>>>>>>> Qual a melhor maneira de guardar os dados no Android ? Mysql ? >>>>>>>> Alguém sabe de um bom tutorial para estar parte ? >>>>>>>> Cumprimentos >>>>>>>> >>>>>>>> -- >>>>>>>> Luís Medeiro Costa >>>>>>>> >>>>>>>> Flex Front-End Developer >>>>>>>> URL: http://www.luiscostaweb.com/ >>>>>>>> E-mail: [email protected] >>>>>>>> MSN: [email protected] >>>>>>>> Twitter: http://twitter.com/LTostas >>>>>>>> >>>>>>>> -- >>>>>>>> Recebeu esta mensagem porque está inscrito no grupo "Mailing List >>>>>>>> da Comunidade Portuguesa de Rich Internet Applications - >>>>>>>> www.riapt.org" dos Grupos do Google. >>>>>>>> Para publicar uma mensagem neste grupo, envie um e-mail para >>>>>>>> [email protected]. >>>>>>>> Para anular a inscrição neste grupo, envie um e-mail para >>>>>>>> [email protected]. >>>>>>>> Para ver mais opções, visite este grupo em >>>>>>>> http://groups.google.com/group/riapt?hl=pt-PT. >>>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Recebeu esta mensagem porque está inscrito no grupo "Mailing List da >>>>>>> Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" >>>>>>> dos Grupos do Google. >>>>>>> Para publicar uma mensagem neste grupo, envie um e-mail para >>>>>>> [email protected]. >>>>>>> Para anular a inscrição neste grupo, envie um e-mail para >>>>>>> [email protected]. >>>>>>> Para ver mais opções, visite este grupo em >>>>>>> http://groups.google.com/group/riapt?hl=pt-PT. >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Luís Medeiro Costa >>>>>> >>>>>> Flex Front-End Developer >>>>>> URL: http://www.luiscostaweb.com/ >>>>>> E-mail: [email protected] >>>>>> MSN: [email protected] >>>>>> Twitter: http://twitter.com/LTostas >>>>>> >>>>>> -- >>>>>> Recebeu esta mensagem porque está inscrito no grupo "Mailing List da >>>>>> Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" >>>>>> dos Grupos do Google. >>>>>> Para publicar uma mensagem neste grupo, envie um e-mail para >>>>>> [email protected]. >>>>>> Para anular a inscrição neste grupo, envie um e-mail para >>>>>> [email protected]. >>>>>> Para ver mais opções, visite este grupo em >>>>>> http://groups.google.com/group/riapt?hl=pt-PT. >>>>>> >>>>> >>>>> -- >>>>> Recebeu esta mensagem porque está inscrito no grupo "Mailing List da >>>>> Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" >>>>> dos Grupos do Google. >>>>> Para publicar uma mensagem neste grupo, envie um e-mail para >>>>> [email protected]. >>>>> Para anular a inscrição neste grupo, envie um e-mail para >>>>> [email protected]. >>>>> Para ver mais opções, visite este grupo em >>>>> http://groups.google.com/group/riapt?hl=pt-PT. >>>>> >>>> >>>> >>>> >>>> -- >>>> Luís Medeiro Costa >>>> >>>> Flex Front-End Developer >>>> URL: http://www.luiscostaweb.com/ >>>> E-mail: [email protected] >>>> MSN: [email protected] >>>> Twitter: http://twitter.com/LTostas >>>> >>> >>> >>> >>> -- >>> Luís Medeiro Costa >>> >>> Flex Front-End Developer >>> URL: http://www.luiscostaweb.com/ >>> E-mail: [email protected] >>> MSN: [email protected] >>> Twitter: http://twitter.com/LTostas >>> >>> -- >>> Recebeu esta mensagem porque está inscrito no grupo "Mailing List da >>> Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" >>> dos Grupos do Google. >>> Para publicar uma mensagem neste grupo, envie um e-mail para >>> [email protected]. >>> Para anular a inscrição neste grupo, envie um e-mail para >>> [email protected]. >>> Para ver mais opções, visite este grupo em >>> http://groups.google.com/group/riapt?hl=pt-PT. >>> >> >> -- >> Recebeu esta mensagem porque está inscrito no grupo "Mailing List da >> Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" dos >> Grupos do Google. >> Para publicar uma mensagem neste grupo, envie um e-mail para >> [email protected]. >> Para anular a inscrição neste grupo, envie um e-mail para >> [email protected]. >> Para ver mais opções, visite este grupo em >> http://groups.google.com/group/riapt?hl=pt-PT. >> > > > > -- > Luís Medeiro Costa > > Flex Front-End Developer > URL: http://www.luiscostaweb.com/ > E-mail: [email protected] > MSN: [email protected] > Twitter: http://twitter.com/LTostas > > -- > Recebeu esta mensagem porque está inscrito no grupo "Mailing List da > Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" dos > Grupos do Google. > Para publicar uma mensagem neste grupo, envie um e-mail para > [email protected]. > Para anular a inscrição neste grupo, envie um e-mail para > [email protected]. > Para ver mais opções, visite este grupo em > http://groups.google.com/group/riapt?hl=pt-PT. > -- Recebeu esta mensagem porque está inscrito no grupo "Mailing List da Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" dos Grupos do Google. Para publicar uma mensagem neste grupo, envie um e-mail para [email protected]. Para anular a inscrição neste grupo, envie um e-mail para [email protected]. Para ver mais opções, visite este grupo em http://groups.google.com/group/riapt?hl=pt-PT.
