FMDBでlike検索

Standard

iOSでSQLite3を使うときの定番wrapper FMDB。クエリパラメータのバインドもやってくれるので楽なわけですが、like検索するときのバインドがうまくいかなくてハマった。変な使い方するみたいなのでメモ。FMDBっていうか、sqlite3_bind_textっていう関数の使い方っぽい。
 
 
普通に条件つきのSQLを使うときはこんな感じにクエリを発行する。

NSString *query = @"select * from ocha_master where name = ?";
FMResultSet *rs = [db_ executeQuery:query,@"ジャスミン"];
while ([rs next]) {
    //カーソルから取り出してサムシングエルス
}
[rs close];

 
で、このままlike検索しようとすると、こうなる

NSString *query = @"select * from ocha_master where name like '%?%'";
FMResultSet *rs = [db_ executeQuery:query,@"ジャスミン"];
while ([rs next]) {
    //カーソルから取り出してサムシングエルス
}
[rs close];

 
んだけど、これだと1件もヒットしない。
where name like '%?%'

where name like '%%?%%'
に変えたりとかいろいろやったけどうまくいかなくて、google x 20ぐらいでたどり着いた結論が

NSString *query = @"select * from ocha_master where name like ?001";
FMResultSet *rs = [db_ executeQuery:query,[NSString stringWithFormat:@"%%%@%%",@"ジャスミン"]];
while ([rs next]) {
    //カーソルから取り出してサムシングエルス
}
[rs close];

 
 
 
sqlite3_bind_textはなんか、泥臭いことしてそ。。

flipするview的なサムシング

Standard

iphoneアプリでカードをめくったりする演出をしないといけなくて、Utility Application風のことやるだけだし、こんぐらいだったらUIKitだけでいけんじゃねって思ったら簡単にできた。

[UIView setAnimationTransition:(UIViewAnimationTransition)transition
                       forView:(UIView *)view
                         cache:(BOOL)cache];

を使えばよかったらしい。
 
 
UntitledViewController.h

#import <UIKit/UIKit.h>

@interface UntitledViewController : UIViewController {
    UIView *baseView_;
    UIView *flipOneView_;
    UIView *flipSecondView_;
    UIButton *flipButton_;
}

@property (nonatomic, retain)UIView *baseView_;
@property (nonatomic, retain)UIView *flipOneView_;
@property (nonatomic, retain)UIView *flipSecondView_;
@property (nonatomic, retain)UIButton *flipButton_;

@end


 
UntitledViewController.m

#import "UntitledViewController.h"

@implementation UntitledViewController
@synthesize flipOneView_,flipSecondView_,flipButton_,baseView_;

- (void)switchViewOne2Second {
    [flipOneView_ removeFromSuperview];
    [baseView_ addSubview:flipSecondView_];
    [flipButton_ removeTarget:self action:@selector(touchOnFlipOne:) forControlEvents:UIControlEventTouchDown];
    [flipButton_ addTarget:self action:@selector(touchOnFlipSecond:) forControlEvents:UIControlEventTouchDown];
}

- (void)switchViewSecond2One {
    [flipSecondView_ removeFromSuperview];
    [baseView_ addSubview:flipOneView_];
    [flipButton_ removeTarget:self action:@selector(touchOnFlipSecond:) forControlEvents:UIControlEventTouchDown];
    [flipButton_ addTarget:self action:@selector(touchOnFlipOne:) forControlEvents:UIControlEventTouchDown];
}

- (IBAction)touchOnFlipOne:(id)sender {
    CGContextRef context = UIGraphicsGetCurrentContext();
    [UIView beginAnimations:nil context:context];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationWillStartSelector:@selector(switchViewOne2Second)];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:baseView_ cache:YES];
    [UIView commitAnimations];
}

- (IBAction)touchOnFlipSecond:(id)sender {
    CGContextRef context = UIGraphicsGetCurrentContext();
    [UIView beginAnimations:nil context:context];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationWillStartSelector:@selector(switchViewSecond2One)];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:baseView_ cache:YES];
    [UIView commitAnimations];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    baseView_ = [[UIView alloc] initWithFrame:CGRectMake(50, 100, 100, 100)];
    [baseView_ setBackgroundColor:[UIColor whiteColor]];
    [self.view addSubview:baseView_];
    
    flipOneView_ = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    [flipOneView_ setBackgroundColor:[UIColor blueColor]];
    
    flipSecondView_ = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    [flipSecondView_ setBackgroundColor:[UIColor redColor]];
    
    flipButton_ = [UIButton buttonWithType:UIButtonTypeInfoDark];
    [flipButton_ setFrame:CGRectMake(280, 300, 20, 20)];
    [flipButton_ addTarget:self action:@selector(touchOnFlipOne:) forControlEvents:UIControlEventTouchDown];
    [self.view addSubview:flipButton_];
    
    [baseView_ addSubview:flipOneView_];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
	[flipOneView_ release];
    flipOneView_ = nil;
    [flipSecondView_ release];
    flipSecondView_ = nil;
    [flipButton_ release];
    flipButton_ = nil;
    [baseView_ release];
    baseView_ = nil;
}

- (void)dealloc {
    [flipOneView_ release];
    [flipSecondView_ release];
    [flipButton_ release];
    [baseView_ release];
    [super dealloc];
}

@end

 
 
こんな感じになる。
 

[iPhone]UITabBarItemの色を変える

Standard

UITabBarItemにアイコン画像を設定した場合、
 
screenshot

screenshot

 
な感じに選択されているタブが青、それ以外はグレーになります。この選択されているタブの色をカスタマイズする方法です。
IBに”Highlightted Image”とかっていう設定があってもよさそうですが、なぜかないのでそれぞれのタブのviewControllerのviewDidLoadとかに自分で書きます。
Continue reading

UITableViewCellの背景透過は原則禁止

Standard

iphoneアプリのテーブルビューの表示がものすごく遅くて、SQLをこねくりまわしたり散々ちらかした挙げ句、UITableVIewのサブクラスで
[self setBackgroundColor [UIColor clearColor]];
をやめたら劇的に改善した。
 
結構どこにでも書いてあるだけど、最後に少しでもパフォーマンスあげるための悪あがきレベルだろうと思ってたせいで半日無駄にした。「劇的に」って言葉がふさわしすぎて笑うしかなかった。教訓はパフォーマンス改善はまず描画から疑っていけってこと。