版权声明:本文为博主原创文章,未经博主允许不得转载。
1.案例简介
通过读取文件,将中国所有城市写入sqlite数据库中,现通过UIPickView实现中国所有城市的选择,效果图如下所示
![](https://img-my.csdn.net/uploads/201408/29/1409279795_4916.gif)
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
- // 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 *sql=@"create table china (ids text primary key,cityName text,pid text )";
- [self createTable:sql dataBaseName:dbName];
- }
- -(BOOL)addCity:(CityModel *)city dbName:(NSString *)dbName{
- NSString *sql=@"insert into china values (?,?,?)";
- NSArray *params=@[city.ids,city.cityName,city.pid];
- return [self execSql:sql parmas:params dataBaseName:dbName];
- }
- -(id)selectAllCity:(NSString *)dbName{
- NSString *sql=@"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 *sql=@"select ids,cityName,pid from china where pid=?";
- NSArray *parmas=@[@"0"];
- return [self selectCity:sql parmas:parmas dbName:dbName];
- }
- -(id)selectCityByProvince:(CityModel *)provice dbName:(NSString *)dbName{
- NSString *sql=@"select * from china where pid=?";
- NSArray *params=@[provice.ids];
- return [self selectCity:sql parmas:params dbName:dbName];
- }
- -(BOOL)deleteAllCity:(NSString *)dbName{
- NSString *sql=@"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];
- FILEFILE *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
- - (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)];
- }
- //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;
- }
- }
- //获取每列每行的名称
- -(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;
- }
- //获取每列每行的名称
- -(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;
- }
项目完整工程 https://github.com/whzhaochao/IOSChinaCity