IOS UIPickView+sqlite 选择中国所有城市案例

1.案例简介

通过读取文件,将中国所有城市写入sqlite数据库中,现通过UIPickView实现中国所有城市的选择,效果图如下所示

2.城市对象模型

中国所有城市数据请看http://blog.csdn.net/whzhaochao/article/details/37969145,城市模型对象如下

//
//  CityModel.h
//  readData
//
//  Created by 赵超 on 14-8-28.
//  Copyright (c) 2014年 赵超. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface CityModel : NSObject

@property (nonatomic,copy) NSString  *pid;      //父级城市ID
@property (nonatomic,copy) NSString  *cityName; //城市名
@property (nonatomic,copy) NSString  *ids;      //城市ID

@end

3.城市数据库操作对象

sqlite封操作BseDB类请看http://blog.csdn.net/whzhaochao/article/details/38865535,然后封装城市对象的数据库操作对象CityDB

CityDB.h文件

//
//  CityDB.h
//  readData
//
//  Created by 赵超 on 14-8-28.
//  Copyright (c) 2014年 赵超. All rights reserved.
//

#import "BaseDB.h"
#import "CityModel.h"

@interface CityDB : BaseDB
/**
 *CityDB单例
 */
+(id)ShareDB;

/**
 * 创建数据库
 * dbName:数据库名称
 */
-(void)creatTableWithDataBaseName:(NSString*) dbName;

/**
 * 增加一个城市
 * city:城市
 * dbName:数据库名称
 */
-(BOOL)addCity:(CityModel*)city dbName:(NSString*)dbName;
/**
 * 选择所有的城市
 * dbName:数据库名称
 */
-(id)selectAllCity:(NSString*)dbName;
/**
 * 选择所有的省份
 * dbName:数据库名称
 */
-(id)selectAllProvince:(NSString *)dbName;
/**
 * 删除所有城市
 * dbName:数据库名称
 */
-(BOOL)deleteAllCity:(NSString*)dbName;
/**
 * 通过上一级省份选择下级市
 * city:上一级城市
 * dbName:数据库名称
 */
-(id)selectCityByProvince:(CityModel*)provice dbName:(NSString*)dbName;

@end

CityDB.m文件实现

//
//  CityDB.m
//  readData
//
//  Created by 赵超 on 14-8-28.
//  Copyright (c) 2014年 赵超. All rights reserved.
//

#import "CityDB.h"

@implementation CityDB

static CityDB *citydb;

+(id)ShareDB{
    if (citydb==nil) {
        citydb=[[CityDB alloc] init];
    }
    return citydb;
}

-(void)creatTableWithDataBaseName:(NSString *)dbName{
     NSString *[email protected]"create table china (ids text primary key,cityName text,pid text )";
    [self createTable:sql dataBaseName:dbName];
}

-(BOOL)addCity:(CityModel *)city dbName:(NSString *)dbName{
    NSString *[email protected]"insert into china values (?,?,?)";
    NSArray *[email protected][city.ids,city.cityName,city.pid];
    return [self execSql:sql parmas:params dataBaseName:dbName];
}

-(id)selectAllCity:(NSString *)dbName{
    NSString *[email protected]"select ids,cityName,pid from china";
    return [self selectCity:sql parmas:nil dbName:dbName];
}

-(id)selectCity:(NSString*)sql parmas:(NSArray*)params dbName:(NSString*)dbName{
    NSArray *result= [self selectSql:sql parmas:params dataBaseName:dbName];
    NSMutableArray *citys=[NSMutableArray array];
    for (NSDictionary *dic in result) {
        CityModel *city=[[CityModel alloc]init];
        city.ids=[dic objectForKey:@"ids"];
        city.cityName=[dic objectForKey:@"cityName"];
        city.pid=[dic objectForKey:@"pid"];
        [citys addObject:city];
    }
    return citys;
}

-(id)selectAllProvince:(NSString *)dbName{
    NSString *[email protected]"select ids,cityName,pid from china where pid=?";
    NSArray  *[email protected][@"0"];
    return [self selectCity:sql parmas:parmas dbName:dbName];
}

-(id)selectCityByProvince:(CityModel *)provice dbName:(NSString *)dbName{
    NSString *[email protected]"select * from china where pid=?";
    NSArray  *[email protected][provice.ids];
    return [self selectCity:sql parmas:params dbName:dbName];
}

-(BOOL)deleteAllCity:(NSString *)dbName{
    NSString *[email protected]"delete from china";
    return [self execSql:sql parmas:nil dataBaseName:dbName];
}

@end

4.城市数据处理

中国城市数据放在china.txt中,需要处理后写入数据库中,读取文件装数据写入数据库代码如下

//调用CitDB对象向数据库中增加一个城市
-(void)addCity:(CityModel* )city{
    [[CityDB ShareDB] addCity:city dbName:@"China.sqlite"];
}
//处理china.txt城市数据,将其写入数据库中
-(void)readData{
    NSString *path=[[NSBundle mainBundle] pathForResource:@"china" ofType:@"txt"];
    NSLog(@"%@",path);
    char  pid[30],name[30],ids[30];

    FILE *f=fopen([path UTF8String], "r");
    int i=0;
    while (!feof(f)) {
        CityModel *city=[[CityModel alloc] init];
        fscanf(f, " %s %s %s ",ids,name,pid);
        NSString *pids=[NSString stringWithUTF8String:pid];
        NSString *names=[NSString stringWithUTF8String:name];
        NSString *idss=[NSString stringWithUTF8String:ids];
        city.ids=idss;
        city.pid=pids;
        city.cityName=names;
        //向数据库插入一个城市
        [self addCity:city];
        NSLog(@"%@ %@ %@ %d",pids,names,idss,++i);

    }
}

5.UIPickView显示数据

MainViewControoler用户数据的显示,其.h文件内容如下

@interface MainViewController : UIViewController<UIPickerViewDataSource,UIPickerViewDelegate>{
    CityModel *privceModel;     //选择的省
    CityModel *cityModel;       //选择的市
    CityModel *subCityModel;    //选择的地级市
    CityModel *areaModel;       //选择的区
    UILabel *selectCity;        //显示选择的结果
}

@property (nonatomic,retain) NSArray *privices;    //所有省份

@property (nonatomic,retain) NSArray *citys;       //省下对应的市

@property (nonatomic,retain) NSArray *subCitys;    //市下对应的地级市

@property (nonatomic,retain) NSArray *area;        //区

@end

在MainViewController的viewDidLoad中添加UIPickView并初始化数据

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor=[UIColor grayColor];

    UIPickerView *pickView=[[UIPickerView alloc] initWithFrame:CGRectMake(0, 100, 0, 0)];
    pickView.dataSource=self;
    pickView.delegate=self;
    pickView.showsSelectionIndicator=YES;
    pickView.backgroundColor=[UIColor whiteColor];

    [self.view addSubview:pickView];
    //初始化数据
    self.privices=[[CityDB ShareDB] selectAllProvince:dataBaseName];
    CityModel *city=[self.privices objectAtIndex:0];
    self.citys=[[CityDB ShareDB] selectCityByProvince:city dbName:dataBaseName];
    city=[self.citys objectAtIndex:0];
    self.subCitys=[[CityDB ShareDB] selectCityByProvince:city dbName:dataBaseName];
    city=[self.citys objectAtIndex:0];
    self.area=[[CityDB ShareDB] selectCityByProvince:city dbName:dataBaseName];

    selectCity=[[UILabel alloc] initWithFrame:CGRectMake(0, 40, 320, 30)];
}

实现UIPickView的列数和行数代理函数,列数只有4列,第一列的行数是中国所有的省数所以中人返回self.privices.count就可以了,但是第二列必需知道第一列选中哪个省份后,再通过这个省份从数据库库查出下面的市才知道要显示的行数,第3列是基于第2列选中的行数,第4列是基于第3列选中的列数,实现代码如下:

//UIPcikView总共4列
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
    return 4;
}

//为每列加载行数
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{

    if (component==0) {
        return self.privices.count;
    }else
    if (component==1) {
        //获取第一列选中的省份列表
        NSInteger privoceIndex=[pickerView selectedRowInComponent:0];
        CityModel *privoice=[self.privices objectAtIndex:privoceIndex];
        //从数据库中查询,省份下面的市
        self.citys=[[CityDB ShareDB] selectCityByProvince:privoice dbName:dataBaseName];
        //返回市的个数
        return self.citys.count;

    }else
    if (component==2) {
        NSInteger cityIndex=[pickerView selectedRowInComponent:1];
        if (self.citys.count==0) {
            return 0;
        }
        CityModel *subCitys=[self.citys objectAtIndex:cityIndex];
        self.subCitys=[[CityDB ShareDB] selectCityByProvince:subCitys dbName:dataBaseName];
        return self.subCitys.count;

    }else
    if (component==3) {
        NSInteger subCityIndex=[pickerView selectedRowInComponent:2];
        if (self.subCitys.count==0) {
            return 0;
        }
        CityModel *ares=[self.subCitys objectAtIndex:subCityIndex];
        self.area=[[CityDB ShareDB] selectCityByProvince:ares dbName:dataBaseName];
        return self.area.count;

    }else{
        return 0;
    }

}

为UIPickView加载每行每列的数据,获取数据时要注意有判断是否为空

//获取每列每行的名称
-(NSString*)getCityName:(NSInteger)row componet:(NSInteger) component{
    if (component==0) {
        CityModel *city=[self.privices objectAtIndex:row];
        return city.cityName;
    }else if (component==1) {
        CityModel *city=[self.citys objectAtIndex:row];
        return city.cityName;
    }else if (component==2) {
        if (self.subCitys==nil) {
            return @"";
        }else{
            CityModel *city=[self.subCitys objectAtIndex:row];
            return city.cityName;
        }
    }
    else if (component==3) {
        if (self.area==nil) {
            return @"";
        }else{
            CityModel *city=[self.area objectAtIndex:row];
            return city.cityName;
        }

    }

    return @"";
}

-(UIView*) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{

    UILabel *lable=[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 60, 30)];
    //获取名称
    lable.text=[self getCityName:row componet:component];
    lable.font=[UIFont systemFontOfSize:14];

    return lable;
}

最后实现UIPickView的选择响应事件刷新Pickview,并显示选择的结果

//获取每列每行的名称
-(NSString*)getCityName:(NSInteger)row componet:(NSInteger) component{
    if (component==0) {
        CityModel *city=[self.privices objectAtIndex:row];
        return city.cityName;
    }else if (component==1) {
        CityModel *city=[self.citys objectAtIndex:row];
        return city.cityName;
    }else if (component==2) {
        if (self.subCitys==nil) {
            return @"";
        }else{
            CityModel *city=[self.subCitys objectAtIndex:row];
            return city.cityName;
        }
    }
    else if (component==3) {
        if (self.area==nil) {
            return @"";
        }else{
            CityModel *city=[self.area objectAtIndex:row];
            return city.cityName;
        }

    }

    return @"";
}

-(UIView*) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{

    UILabel *lable=[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 60, 30)];
    //获取名称
    lable.text=[self getCityName:row componet:component];
    lable.font=[UIFont systemFontOfSize:14];

    return lable;
}

项目完整工程http://download.csdn.net/detail/whzhaochao/7837681

时间: 2024-11-07 13:02:08

IOS UIPickView+sqlite 选择中国所有城市案例的相关文章

咖啡种类华润紫竹毓婷品牌获2013中国创新营销案例奖你知道这些健紫竹药业3

[怎样减少腹胀气]1.少量多餐.2.彻底咀嚼食物,帮助消化.3.坐直吃.4.避免碳酸饮料.5.避免高脂食物,因消化的慢,食物会徘徊在结肠而肠道细菌会产生更多的气体.6.每天运动,维持健康的肠道功能.7.避免会胀气的食物.8.薄荷,洋甘菊,或茴香茶,可助缓解腹胀. 华润紫竹毓婷品牌获"2013中国创新营销案例奖" [水果要吃对时间]1.早上最宜:苹果.梨.葡萄.人的胃肠经过一夜休息之后,适合食用酸性不太强.涩味不太浓的水果.2.餐前别吃:圣女果.橘子.山楂.香蕉.柿子.有一些水果是不可以

最易藏虫的食华润紫竹毓婷品牌获2013中国创新营销案例奖感冒时的自我紫竹药业3

[电视,电脑不要进卧室]电脑或电视放进卧室都会在一定程度上干扰到人们的睡眠,而且还会在使用过程中产生一些辐射,影响健康.所以在条件允许的情况下,一定要将这些电器请出卧室. 华润紫竹毓婷品牌获"2013中国创新营销案例奖" [三种护心的食物]:1.豆腐:能够降低LDL(坏)胆固醇水平,从而减少心血管疾病发生的危险性.2.菜豆:是一种低脂.高纤维的蛋白质来源,它含丰富维生素,不含胆固醇,糖含量低,故是心脏的益友.3.沙丁鱼:含大量OMEGA-3脂肪酸.钙质与烟酸,可预防心脏病. [&quo

卫生纸特指厕华润紫竹毓婷品牌获2013中国创新营销案例奖熬夜伤身体,紫竹药业3

[护肤百科]1.在水里加一点盐,不只杀菌,还可以祛油脂:2.在水里加一点蜂蜜,长期坚持可以让你的肌肤年轻10 岁:3.在水里加一点醋,可以让你的皮肤变的光滑有弹性,还不容易长痘:4.在电脑前工作的女性,洗脸的时候在水中加一点绿茶,可以有效的抵抗辐射. 华润紫竹毓婷品牌获"2013中国创新营销案例奖" [输入法三个实用功能]这些你都知道吗?不会就收藏吧. [解酒常识]1.蜂蜜水:酒后头痛:2.西红柿汁:酒后头晕:3.新鲜葡萄:酒后反胃.恶心:4.西瓜汁:酒后全身发热:5.柚子:酒后口气:

吃海鲜时为何华润紫竹毓婷品牌获2013中国创新营销案例奖感情专一人的紫竹药业3

[初夏养生关键在于"清"]1.心情宜清静.神清气和,心静自然凉.2.饮食宜清淡.夏日的饮食应以清淡.质软,易于消化的食物为主.3.住房宜清凉.早晚室内气温低,应将门窗打开,通风换气.4.游乐宜清幽.炎炎夏日不可远途跋涉,应该就近寻幽. 华润紫竹毓婷品牌获"2013中国创新营销案例奖" [缓解头痛的几款花草茶]1.黄菊花:降血压,头痛眩晕.神经性头痛2.薰衣草:失眠性头痛3.野菊花:平肝明目,风热感冒引发头昏目眩4.合欢花:宁神,治郁结胸闷,神经衰弱5.迷迭香:对宿醉

冬季穿丝袜?华润紫竹毓婷品牌获2013中国创新营销案例奖正常与退化性紫竹药业3

[预防感冒]1.洗--早晨冷水洗脸,晚上热水洗脚:2.漱--早晚淡盐水漱口:3.动--早晨散步.做操:4.搓--两手对掌相搓30次:5.开--经常打开门窗,通风换气:6.饮--早晨饮白开水一杯:7.呼--早晨作深呼吸20次:8.穿--穿衣服根据天气情况注意增减.为了身体健康,这些你都能做到吗? 华润紫竹毓婷品牌获"2013中国创新营销案例奖" [健康的细节让你越活越年轻]1.清晨醒来时多吃食物:2.和孩子一样喝奶:3.保证充足的睡眠:4.饮食宜粗不宜细:5.忙碌时提醒自己放松5分钟:6

巧洗白色袜子华润紫竹毓婷品牌获2013中国创新营销案例奖上火时怎么吃紫竹药业3

[电影里的孕产知识]<北京遇上西雅图>近期火热上映.众主演扮演的孕妇赚足眼球.吴秀波饰演的Frank嘱咐汤唯饰演的文佳佳产前要做眼底检查.专家表示,在妊娠晚期,很多孕妇易并发妊娠高血压综合征,眼底检查可了解到小动脉的病变. 华润紫竹毓婷品牌获"2013中国创新营销案例奖" [和谐家庭10条吵架公约] 1.要热吵不要冷战:2.要文斗不要武斗:3.就事论事不翻帐:4.严禁在公共场合.家人.孩子.朋友面前吵架:5.请使用文明语言:6.当天的气当天解:7.吵架时不提分手:8.双方要

中国省份城市列表(汉字+拼音)

-------------------中国省份和城市列表-------------------------- [ProvinceName] name.1=北京(BeiJing) name.2=上海(ShangHai) name.3=天津(TianJin) name.4=重庆(ChongQing) name.5=香港(XiangGang) name.6=澳门(Aomen) name.7=安徽(AnHui) name.8=福建(FuJian) name.9=广东(GuangDong) name.10

关于代码选择省份和城市?

在项目开发过程中,如何动态的选择省份和城市呢,这要求一个js代码实现,步骤如下: (一).jsp代码,写出城市和省份的选择框: <div class="ac-item"> <label>成立地点</label><div class="input-box"> <div style="width:220px;"> <span style="font-weight:bold&q

多位地产巨头看涨中国一线城市房价

多位地产巨头看涨中国一线城市房价 行业动态中国新闻网[微博]庞无忌2014-11-23 07:13 我要分享 0 [摘要]无论是从土地市场.供求关系还是从宏观政策等角度,多位地产巨头22日均表现出看涨中国一线城市房价的判断. 即将退休的华远地产(华远九都汇)董事长任志强透露,北京.上海.广州.深圳四个一线城市今年以来土地出让收入已突破6000亿元(人民币,下同),住宅用地突破3000亿元.期间地价上涨大约57%.以如此高的地价为基准,房价降很难有下降空间. 以北京市为例,任志强指出,今年以来京城