Skip to content


Alterar SQLite on the fly

Olá pessoal, hoje o post foi uma necessidade do meu amigo Victor, então ele compartilhou sua solução e eu achei interessante deixar gravado aqui no blog, pois pode ser muito útil, afinal trabalhamos com informática, né :)

Alterar um banco de dados em produção é sempre tenso, então o Victor criou uma solução para isso.

Temos que criar dois métodos, um para saber qual a versão do SQLite e outro para incrementar essa versão.

Após realizar a alteração, incrementamos a versão da base e para saber se é preciso rodar o script de alter table na versão atual, verificamos a versão do banco.

Se quiserem sugerir otimizações, fiquem a vontade!!

- (int)getUserVersion
{
    static sqlite3_stmt *stmt_version;
    sqlite3 *database;

    int databaseVersion;

    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
    {
        if(sqlite3_prepare_v2(database, "PRAGMA user_version;", -1, &stmt_version, NULL) == SQLITE_OK)
        {
            while(sqlite3_step(stmt_version) == SQLITE_ROW)
                databaseVersion = sqlite3_column_int(stmt_version, 0);

            NSLog(@"%s: the databaseVersion is: %d", __FUNCTION__, databaseVersion);
        }
        else
            NSLog(@"%s: ERROR Preparing: , %s", __FUNCTION__, sqlite3_errmsg(database));

        sqlite3_finalize(stmt_version);
        sqlite3_close(database);
    }
    return databaseVersion;
}

- (void)incrementUserVersion:(int)newVersion
{
    static sqlite3_stmt *stmt_version;
    sqlite3 *database;

    const char *newPragmaVersion = [[NSString stringWithFormat:@"PRAGMA user_version = %d;", newVersion] UTF8String];

    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
    {
        if(sqlite3_prepare_v2(database, newPragmaVersion, -1, &stmt_version, NULL) == SQLITE_OK)
            sqlite3_step(stmt_version);
        else
            NSLog(@"%s: ERROR Preparing: , %s", __FUNCTION__, sqlite3_errmsg(database));

        sqlite3_finalize(stmt_version);
        sqlite3_close(database);
    }
}

Espero que tenha ajudado, enjoy e até a próxima!
Victor, obrigado pela contribuição, grande abraço!

Posted in Dev, Dicas, iOS, Mobile.

Tagged with , , , , , , , , , .


Auto Layout

Pessoal agora estamos com algumas fragmentações nos devices da Apple, mas ela não nos abandonou, temos o Auto Layout para posicionar os objetos por referencia e não um frame fixo, então vamos falar um pouco de como funciona.

Para começarmos é requisito o xcode 4.5 e iOS 6 e confirmando o que eu havia dito, não vai ser suportado a arquitetura do iPhone 3G e lembrando que todos os demais podem rodar iOS 6.

Se você criar um novo nib ou usar algum já existente já pode habilitar o Auto Layout como nessa imagem:

Não precisaremos mais de definir os frames como faziamos no - (void)layoutSubviews, por exemplo.

Mas lembre-se de desabilitar o autoresizing maks translation para todas as views que você criou programaticamente, senão o resultado pode não ser o esperado com o Auto Layout.

[view setTranslatesAutoresizingMaskIntoConstraints:NO];

O segredo não está nos objetos ou em suas posições, mas sim nas CONSTRAINTS, elas e suas prioridades que ditam as regras, então escolha a constraint que melhor lhe servir. Vamos botar a mão na massa e ver como se faz.

Na imagem abaixo a constraint selecionada é referente ao objeto, assim como o Button tem as suas constraints que também são referidas ao tamanho do mesmo. Caso contrário são as que tanto queremos, as constraints que definem as posições e a quem elas estão se referindo, ou seja, o objeto vai se posicionar em relação a qual outro objeto.

Ao arrastar um objeto para a tela (nem preciso dizer que é com o AutoLayout habilitado, né) o IB já cria as constraints e habilita as que ele resolve, que não necessariamente são as que você quer, então habilite a que lhe melhor atende e para apagar as que você não quer é só clicar sobre ela e delete:

Vamos trabalhar em cima de uma constraint então, pois ela possui Relation, Constant e Priority.

Relation é a relação de igualdade, assim como uma equação, por exemplo se uma constraint for menor ou igual a um objeto, significa que a distância do objeto poderá ser igual à definida ou diminuir se for necessário, no caso de uma rotação onde a altura da tela fica menor, o objeto se moverá para continuar atendendo à constraint.

Constant é o valor inicial da constraint, digo inicial, pois se for menor ou igual ele vai ser o valor máximo, por exemplo e no caso de maior ou igual, será o valor mínimo, pois o mesmo poderá se extender para atender à Relation.

E mais, se um objeto em portrait, por exemplo, estiver bem em cima da borda, ao invés de definir um valor Constant, clique em Standard, com isso o objeto sempre vai manter no mínimo aquela margem que o IB já define quando você está arrastando os objetos para a tela.

Priority é a prioridade daquela constraint, pois um objeto para ser definido em uma determinada parte da tela, o mesmo precisa atender algumas regras, por exemplo, um objeto não pode definitivamente sair do lado de outro, mas em determinada posição (portrait ou landscape) ele pode se movimentar mais para a direita ou esquerda, então a constraint que define isso tem que ter uma prioridade menor do que a constraint que define a distância entre ambos objetos que têm que ficar lado a lado.

E a prioridade que não vai permitir quem um texto seja cortado, por exemplo, tem que ser a mais alta também, para que um objeto não tente o sobrepor.

Agora, se você quiser definir uma posição em relação a outro objeto é o mesmo princípio, a única diferença vai ser que para você definir tais constraints, você terá que selecionar ambos os objetos e clicar naquele icone para definir as constraints quem referencia um objeto a outro.

E pra encerrar com um slide sessão 202:

Mas como que eu vou saber se deu conflito, o primeiro passo é perceber que o layout não saiu como você esperava e para comprovar:

E isso acontece quando você não consegue satisfazer as regras da “grande equação”, composta pelas constraints que a compõe.

Bom, pessoal, eu tentei mencionar como que as constraints funcionam e não ensinar e mostrar passo a passo, mas recomendo que criem um projeto e testem o que foi dito aqui para você sentir e perceber melhor como é a relação entre todos os atributos e a repetição da palavra constraint, durante o post, foi proposital para que fique bem claro de quem estávamos falando.

Eu subi o projeto que eu criei para testar as combinações aqui no github, então fiquem a vontade para baixá-lo, mas lembre-se que ele só tem alguns casos.

Se quiserem se aprofundar no assunto e trabalhar nas constraints via código [NSLayoutConstraint], o princípio é o mesmo e na WWDC de 2012, sessões 202, 228, 232 e também na ajuda do próprio xcode você encontra mais informações.

Qualquer dúvida ou esclarecimento deixem nos comentários, obrigado e até a próxima!!

 

Posted in Dev, iOS, Mobile, tutorial.

Tagged with , , , , , , , , , , , .


NSDate e NSDateFormatter

Olá pessoal, uma coisa chata é data e quase nunca usamos, ai quando vamos usar novamente já nos esquecemos qual letra que imprime o que, né…

Esse post vai ser mais um guia para que nós possamos consultar toda vez que quisermos imprimir data.

Segue a tabela completa:

y 2012
yy 12
M 8
MM 08
MMM Aug
MMMM August
MMMMM A
D 214
d 1
dd 01
E Wed
EEEE Wednesday
EEEEE W
a AM || PM
h 5
hh 05
H 17
m 2
mm 02
s 2
ss 02
Z -0300
ZZZZ || z GMT-03:00
zzzz Brasilia Time

Essa tabela deu trabalho, mas acho que ficou de um jeito simples e fácil de entender, né.
Agora eu já sei onde recorrer quando eu precisar formatar data novamente, caso eu me esqueça :)

Enjoy e até a próxima!!

ps. se eu tiver me esquecido de algum, comente aqui que eu atualizo o post, valeu!!!

Posted in Dicas, iOS, Mobile.

Tagged with , , , , , , , , , , , , , .


iOS 4 ou iOS 5?

Pessoal eu estava pensando se ainda vale a pena dar suporte ao iOS 4, vou lavantar uns pontos que eu considero relevantes.

É realmente eu achei mais interessante começar com esses números da Apple.
O iOS 3, nem preciso dizer muito, pois 2% para não poder nem usar o ARC, fora as inúmeras melhorias do iOS 4, eu nem vou colocar em questão.
O iOS 4 já é uma parcela considerável, mas existem dois pontos:
1. iPhone 3G que já é muito lento e que muitas dessas pessoas gostam simplesmente do celular e não são heavy user da AppStore
2. Pessoas que não atualizam sei lá porque, então a gente não dando mais suporte para o iOS 4, elas vão acabar se sentindo pressionadas e vão acabar atualizando, pois device pra isso elas têm.

Você já deu uma olhada em quantas melhorias e facilidades o iOS 5 lhe oferece?!?!

Bom, nem preciso falar que o iOS 6 já está liberado para nós desenvolvedores, né??
E sim, ele vai ser compatível com o iPhone 3GS, mas não com o primeiro iPad :(

Pessoal, estive lendo um artigo falando da incompatibilidade do xcode 4.4 com a arquitetura armv6 (iPhone 3G) e a Apple afirmou que o xcode 4.5 não vai mais suportar essa arquitetura.

Com isso afirma mais ainda que todos os devices suportados pelo xcode podem rodar iOS 5, mais um motivo para não criarmos um app que rode no iOS 4, para podermos usufruir das melhorias do iOS 5.

Este é o meu ponto de vista, compartilhe nos comentários o seu ;)

Como não é o intuito deste post analisar outros pontos, para quem quiser o artigo que fala dessa incompatibilidade com referências da Apple, está aqui: Cocoanetics (em inglês).

Boa reflexão e até a próxima!!

Posted in Dicas, iOS, Mobile, Xcode.

Tagged with , , , , , , , .


Literals e Subscripting

Olá pessoal, recentemente a Apple lançou o Xcode 4.4 com o compilador LLVM alterado mais uma vez por ela com isso ganhamos algumas facilidades, vou mostrar algumas delas e como funciona.
Eu achei mais fácil ir direto na fonte, então na Session 405 – Modern Objective-C, tirei algumas screeshots para demonstrar facilmente como era e como é.
Mas eu sou obrigado a fazer assim agora?
- Não, você não é obrigado, mas eu quero ver você resistir :)

Vamos começar por Literals
Antes

Agora

Antes

Agora

Antes

Agora

Antes

Agora

Antes

Agora

Agora vamos mostrar como fica a parte de subscripting
Antes

Agora

Antes

Agora

Ah tá, gostei mas pra isso eu não vou poder fazer app para versões antigas do iOS??
- Ai que é o melhor, assim como o ARC funciona a partir do iOS 4 Literals e Subscripting funciona em versões anteriores, olhem só:

Bom, eu coloquei essa fotinha ai para vocês virem que tem mais coisa nova no novo LLVM da Apple e assistirem aos videos da WWDC.
Bom, é isso ai pessoal, boa sorte!!

Posted in Dev, iOS, Mobile.

Tagged with , , , , , , , , , , , , , , , , .


UIColor

Olá pessoal,

Essa é uma dica simples, mas eu não sabia que funcionava assim.

Ao usar cor RGB com o UIColor, eu não conseguia a cor que eu
queria, então descobri como que os parâmetros do método têm que ficar :)

[UIColor colorWithRed:38.0/255.0 green:54.0/255.0 blue:87.0/255.0 alpha:1.0]

O /255 é fundamental para funcionar, ok?

Até a próxima!

Posted in Dev, Dicas, iOS, Mobile.

Tagged with , , , , , , , , .


NO ARC – iOS

Olá pessoal,

Hoje vai uma dica rápida para que está usando ARC para o desenvolvimento dos aplicativos para iOS.

Eu tenho um arquivo de um terceiro que não está preparado para o ARC e estou com medo de convertê-lo, como é possível clicando em Edit -> Refactor -> Convert to ObjectiveC ARC, então você utilizá-lo sem ARC.

Clique no nome do SeuProjeto, vá para a aba Build Phases e no(s) arquivo(s) desejado(s) adicione o parametro -fno-objc-arc.

Lembrando que o ARC está disponível a partir da versão 4 do iOS.

Abraços!!

Posted in Dicas, iOS, Mobile.

Tagged with , , , , , .


Adicione um iOS Local Notification

Olá pessoal, depois de algum tempo sem escrever aos poucos eu vou postando novamente.

Hoje vamos fazer uma coisa simples e muito útil que é Local Notification, ou seja, enviar notificações do próprio aplicativo, não precisa ter conexão à internet.

Para isso precisamos de data e hora e isso conseguimos facilmente com o UIDatePicker, que eu não vou entrar no mérito da questão, mas a ação do Picker tem que ser do tipo valueChanged.

Adicione o trecho de código na classe onde você está definindo a data:

- (void)addNotification {
    UILocalNotification *localNotification = [[UILocalNotification alloc] init];

    localNotification.fireDate = self.datePicker.date;
    localNotification.alertBody = self.messageField.text;
    localNotification.soundName = UILocalNotificationDefaultSoundName;
    localNotification.applicationIconBadgeNumber = 1;

    NSDictionary *infoDict = [NSDictionary dictionaryWithObjectsAndKeys:@"Object 1", @"Key 1", @"Object 2", @"Key 2", nil];
    localNotification.userInfo = infoDict;

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
    [localNotification release];
}

Agora, no método

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

do AppDelegate, adicione:

UILocalNotification *localNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    if (localNotification) {
        NSLog(@"Notification Body: %@",localNotification.alertBody);
        NSLog(@"%@", localNotification.userInfo);
    }
    application.applicationIconBadgeNumber = 0;

E ainda no AppDelegate adicione o método:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
    NSLog(@"Notification Body: %@", notification.alertBody);
    NSLog(@"%@", notification.userInfo);
    application.applicationIconBadgeNumber = 0;
}

Pronto, simples assim e até a próxima.

Posted in Dev, iOS, Mobile, tutorial.

Tagged with , , , , , , .


Adicionar fontes a um projeto iOS

Olá pessoal, para que nossos aplicativos sejam cada dia mais únicos temos sempre que procurar o novo e pra dar um ‘tcham’ no projeto com fontes que não são nativas do iOS basta seguir os passos a seguir.

1) Adicione o arquivo da fonte ao projeto

2) Adicione uma nova entrada no arquivo info.plist, chamada “Fonts provided by application”, antigo UIAppFonts. E no ‘array’ da entrada adicione o nome do arquivo que você adicionou ao projeto, inclusive a extensão

3) Descubra o nome real da fonte, no Finder, dê um duplo clique na fonte para abrir o Font Book já com a fonte que você deseja

4) Use a fonte com o nome real (sem a extensão) no seu projeto assim como você usa uma de sistema

Você pode adicionar, quase todo tipo de fonte, .ttf, .ps e inúmeras outras.

Bom final de semana a todos e estimulem a criatividade dos designers!!

Posted in Dev, Dicas, iOS, Mobile.

Tagged with , , , , , , , , .


NSUserDefaults

Pessoal, vou usar NSUserDefaults no meu próximo post, então achei melhor já dar uma palinha a respeito e esclarecer pra que serve e como se usa.

O NSUserDefaults é utilizado para guardar as preferências do usuário, como login e senha, por exemplo, para eu não ter que manipular um banco de dados é mais fácil e prático eu guardar esse tipo de informação com get/set.

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

Salvando valores:

[preferences setObject:@"paulo" forKey:@"string"];
[preferences setInteger:28 forKey@"integer"];
[preferences setFloat:1.7 forKey@"float"];

Existe a possibilidade de sincronizar assim que os valores são adicionados, mas eu particularmente não uso:

[preferences synchronize];

Recuperando valores:

[preferences stringForKey@"string"];
[preferences integerForKey@"integer"];
[preferences floatForKey@"float"];
[preferences arrayForKey@"some_array"];
[preferences dictionaryForKey:@"some_dictionary"];

Para adicionar um array ou um dictionary é com o setObject e para resgatá-lo tem as opções acima.

O NSUserDefaults herda de NSObject, mas é praticamente um NSDictionary e não precisa de nenhuma configuração extra.

Por hoje é isso ai, no próximo post vocês verão um exemplo prático de como utiliza-lo.

Até a próxima e um bom final de semana a todos!!

Posted in Dev, iOS, Mobile.

Tagged with , , , , , .