


#import "AppDelegate.h"
#import "StartViewController.h"
#import "SQLViewController.h"
#import "MessageInfoController.h"
@implementation AppDelegate
@synthesize window = _window;
- (void)dealloc
{
[_window release];
[super dealloc];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
TTNavigator* navigator = [TTNavigator navigator];
navigator.persistenceMode = TTNavigatorPersistenceModeAll;
navigator.window = [[[UIWindow alloc] initWithFrame:TTScreenBounds()] autorelease];
TTURLMap* map = navigator.URLMap;
[map from:@"*" toViewController:[TTWebController class]];
[map from:@"tt://StartView" toSharedViewController:[StartViewController class]];
[map from:@"tt://SQLView/(initInfo:)" toViewController:[SQLViewController class]];
[map from:@"tt://MessageView/(initInfo:)" toViewController:[MessageInfoController class]];
if (![navigator restoreViewControllers])
{
[navigator openURLAction:[TTURLAction actionWithURLPath:@"tt://StartView"]];
}
return YES;
}
@end
StartViewController.m 启动画面
#import "StartViewController.h"
@implementation StartViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//标题栏名称
self.title = @"雨松MOMO";
//设置视图背景颜色
self.view.backgroundColor = [UIColor blackColor];
//创建图片视图
TTImageView *imageview = [[[TTImageView alloc] initWithFrame:
CGRectMake(100, 50, 120, 120)] autorelease];
//设置图片视图显示的图片资源
imageview.defaultImage = TTIMAGE(@"bundle://0.jpg");
//将图片视图加入整个视图当中
[self.view addSubview:imageview];
//创建label视图
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 30)];
//设置显示内容
label.text = @"Three20软件开发之FMDB数据库";
//设置背景颜色
label.backgroundColor = [UIColor blueColor];
//设置文字颜色
label.textColor = [UIColor whiteColor];
//设置显示位置居中
label.textAlignment = UITextAlignmentCenter;
//设置字体大小
label.font = [UIFont fontWithName:[[UIFont familyNames] objectAtIndex:10] size:20];
[self.view addSubview: label];
NSArray *titles = [[NSArray alloc] initWithObjects:
@"插入数据库",
@"更新数据库",
@"删除数据库",
@"查询数据库",
nil];
for (int i =0; i < [titles count]; i++)
{
//创建普通按钮
UIButton *button = [UIButton buttonWithType:1];
//设置按钮位置
button.frame = CGRectMake(0, 200 + i * 40, 320, 30);
//设置按钮现实文字
[button setTitle:[titles objectAtIndex:i] forState:UIControlStateNormal];
//设置按钮标记
button.tag = i;
//设置按钮点击后 绑定响应方法
[button addTarget:self action:@selector(ButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
//将按钮添加入视图中
[self.view addSubview: button];
}
}
//按钮点击后将进入这个方法
-(void)ButtonPressed:(id)buttonID
{
//得到导航对象
TTNavigator* navigator = [TTNavigator navigator];
//获取点击的按钮
UIButton *button = (UIButton *)buttonID;
//注解1
switch (button.tag) {
case 0:
[navigator openURLAction:[[TTURLAction actionWithURLPath:@"tt://SQLView/0"] applyAnimated:YES]];
break;
case 1:
[navigator openURLAction:[[TTURLAction actionWithURLPath:@"tt://SQLView/1"] applyAnimated:YES]];
break;
case 2:
[navigator openURLAction:[[TTURLAction actionWithURLPath:@"tt://SQLView/2"] applyAnimated:YES]];
break;
case 3:
[navigator openURLAction:[[TTURLAction actionWithURLPath:@"tt://SQLView/3"] applyAnimated:YES]];
break;
default:
break;
}
}
@end
SQLViewController.h
#import <Three20/Three20.h>
#import "SingleDate.h"
@interface SQLViewController : TTTableViewController
{
//记录上一页点击的按钮
int pageID;
//获取单例模型的实例
SingleDate *instance;
//数据库对象
FMDatabase *db;
}
@end
SQLViewController.m
#import "SQLViewController.h"
#import "FMDatabase.h"
#import "FMDatabaseAdditions.h"
#define DATABASE_NAME @"Temp.db"
@implementation SQLViewController
-(id)initInfo:(int)page
{
if (self = [super init]) {
//注解1
pageID = page;
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
//注解2
//图片的地址
NSMutableArray *iconurls = [[[NSMutableArray alloc] initWithObjects:
@"bundle://0.jpg",
@"bundle://1.jpg",
@"bundle://2.jpg",
@"bundle://3.jpg",
nil] autorelease];
//姓名
NSMutableArray *names = [[[NSMutableArray alloc] initWithObjects:
@"雨松MOMO",
@"RORO娃娃",
@"小老虎",
@"哇咔咔",
nil] autorelease];
//性别
NSMutableArray *sexs = [[NSMutableArray alloc] initWithObjects:
@"男",
@"女",
@"男",
@"女",
nil];
//地址
NSMutableArray *address = [[[NSMutableArray alloc] initWithObjects:
@"北京市朝阳区",
@"北京市西城区",
@"北京市海淀区",
@"北京市东城区",
nil] autorelease];
//年龄
NSMutableArray *ages = [[[NSMutableArray alloc] initWithObjects:
[NSNumber numberWithInt:28],
[NSNumber numberWithInt:27],
[NSNumber numberWithInt:26],
[NSNumber numberWithInt:25],
nil] autorelease];
//获取单例对象实例
instance = [SingleDate getInstance];
//读取数据库
db = [instance loadDB:DATABASE_NAME];
//结果集
FMResultSet *rs = nil;
//判断当前页面的ID
switch (pageID)
{
case 0:
//注解3
if(![db tableExists:@"Message"])
{
//创建数据库
if ([db executeUpdate:@"CREATE TABLE Message (_id INTEGER PRIMARY KEY AUTOINCREMENT,IconUrl text, Name text, Sex text,Address text,Age integer)"])
{
NSLog(@"创建表成功");
for(int i=0 ;i<[iconurls count]; i++)
{
//遍历测试数据数组,然后将测试数据写入数据库当中
if([db executeUpdate:@"INSERT INTO Message (IconUrl,Name,Sex,Address,Age) VALUES (?,?,?,?,?)", [iconurls objectAtIndex:i],[names objectAtIndex:i], [sexs objectAtIndex:i],[address objectAtIndex:i],[ages objectAtIndex:i]])
{
NSLog(@"插入数据成功");
}
}
}
}
//返回一个结果集
rs=[db executeQuery:@"SELECT * FROM Message"];
break;
case 1:
//判断当数据库中含有Message表时
if([db tableExists:@"Message"])
{
//注释4
if([db executeUpdate:@"UPDATE Message SET Name = ? WHERE _id = ? ", @"雨松MOMO(已修改)",[NSNumber numberWithInt:1]])
{
NSLog(@"更新一个数据成功");
}
if([db executeUpdate:@"UPDATE Message SET Name = ? , Sex = ? , Address = ? WHERE _id = ? ", @"雨松MOMO(已修改)",@"男(已修改)",@"北京市朝阳区(已修改)",[NSNumber numberWithInt:1]])
{
NSLog(@"更新多条数据成功");
}
}
//返回一个结果集
rs=[db executeQuery:@"SELECT * FROM Message"];
break;
case 2:
//判断当数据库中含有Message表时
if([db tableExists:@"Message"])
{
//删除数据
if([db executeUpdate:@"DELETE FROM Message WHERE _id = ?",[NSNumber numberWithInt:2]])
{
NSLog(@"删除数据成功");
}
}
//返回一个结果集
rs=[db executeQuery:@"SELECT * FROM Message"];
break;
case 3:
//返回一个结果集
rs=[db executeQuery:@"SELECT * FROM Message WHERE _id = ? ",[NSNumber numberWithInt:3]];
break;
default:
break;
}
NSMutableArray * array = [[[NSMutableArray alloc]init] autorelease];
//注释5
while ([rs next])
{
[array addObject:[TTTableImageItem itemWithText:[rs stringForColumn:@"Name"]
imageURL:[rs stringForColumn:@"IconUrl"]
URL:[NSString stringWithFormat: @"%@%@", @"tt://MessageView/", [rs stringForColumn:@"_id"]]]];
}
//用完以后一定要关闭
[rs close];
//设置列表自适应高度
self.variableHeightRows = YES;
//设置列表现实的数据
self.dataSource = [TTSectionedDataSource dataSourceWithArrays:@"当前数据库信息",array,nil];
}
@end
在获取数据库对象时,这使用到了单例模式,单例模式在程序语言设计中占据重要地位,而在IOS程序开发中也会频繁使用单例模式。举个简单的例子 从viewA 进入 viewB , 但是viewB需要viewA中计算过的一些数据,有些朋友会想那直接在页面切换时将参数传递给viewB不就行了。这样是可以,但是如果程序中频繁的使用这样的操作肯定会出问题,因为它们属于View层,MVC设计模式告诉我们一定不要让数据放在View层。 在这里单例模型就好比控制器层,在viewA中将数据计算完毕后,写入单例对象中的变量中,进入viewB后,在继续从单例中获取刚刚viewA传递进去的数值。这样的思路会清晰很多,避免后期很多麻烦。
SingleDate.h
#import <Three20/Three20.h>
#import "FMDatabase.h"
@interface SingleDate : NSObject
{
}
//获取单例对象
+(SingleDate *)getInstance;
//读取数据库
-(FMDatabase *)loadDB:(NSString *)dbName;
@end
#import "SingleDate.h"
@implementation SingleDate
static SingleDate *instance = nil;
//获取单例
+(SingleDate *)getInstance
{
@synchronized(self)
{
if (instance == nil)
{
instance = [[self alloc] init];
}
}
return instance;
}
//读取数据库
-(FMDatabase* )loadDB:(NSString *)dbName
{
//获取当前程序路径
NSURL *appUrl = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSString *dbPath = [[appUrl path] stringByAppendingPathComponent:dbName];
//注释1
FMDatabase *db= [FMDatabase databaseWithPath:dbPath] ;
if (![db open]) {
[db release];
NSLog(@"数据库未能创建/打开");
return nil;
}
return db;
}
@end
接着是最后的展示页面,该页面将每一条数据库中的所有数据展示在屏幕当中。将选择列表的ID传入该页面,然后通过ID 去数据库中查询数值,从而将所有的信息展示在该页面中,代码在下面,仔细阅读以下就会明白。
MessageInfoController.h
#import <Three20/Three20.h>
#import "SingleDate.h"
#import "FMDatabase.h"
@interface MessageInfoController
: TTViewController
{
//数据库ID
int sqlID;
//单例对象
SingleDate *instance;
//数据库对象
FMDatabase *db;
}
@end
MessageInfoController.m
#import "MessageInfoController.h"
#define DATABASE_NAME @"Temp.db"
@implementation MessageInfoController
-(id)initInfo:(int)page
{
if (self = [super init]) {
sqlID = page;
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
instance = [SingleDate getInstance];
db = [instance loadDB:DATABASE_NAME];
//查询数据库的结果集
FMResultSet *rs=[db executeQuery:@"SELECT * FROM Message WHERE _id = ? ",[NSNumber numberWithInt:sqlID]];
if(rs != nil)
{
[rs next];
//获取名称
NSString * name = [rs stringForColumn:@"Name"];
//获取图片
UIImage * image = TTIMAGE([rs stringForColumn:@"IconUrl"]);
//获取性别
NSString * sex = [rs stringForColumn:@"Sex"];
//获取地址
NSString * address = [rs stringForColumn:@"Address"];
//获取年龄
int age = [rs intForColumn:@"Age"];
[rs close];
//标题栏名称
self.title = name;
//设置视图背景颜色
self.view.backgroundColor = [UIColor blackColor];
//创建图片视图
TTImageView *imageview = [[[TTImageView alloc] initWithFrame:
CGRectMake(100, 200, 120, 120)] autorelease];
//设置图片视图显示的图片资源
imageview.defaultImage = image;
//将图片视图加入整个视图当中
[self.view addSubview:imageview];
//将所有文字信息写入视图当中
CGRect frame = CGRectMake(10, 60, 300, 100);
TTStyledTextLabel* label = [[[TTStyledTextLabel alloc] initWithFrame:frame] autorelease];
NSString* labelText = [NSString stringWithFormat: @"姓名:%@ 性别:%@ 地址:%@ 年龄%d" , name, sex,address,age];
label.text = [TTStyledText textFromXHTML:labelText];
label.font = [UIFont systemFontOfSize:22];
[self.view addSubview:label];
}
}
@end
最后欢迎各位盆友可以和MOMO一起讨论Three20软件开发,如果你觉得看得不清楚,MOMO附带上本章的源码下载,希望大家可以一起学习 哈哈~。哇咔咔~ MOMO愿和 大家好好学习,大家一起进步哈~!!!