源码地址http://www.cocoachina.com/bbs/read.php?tid=114580
源码地址2http://www.oschina.net/code/snippet_730880_14482
学习iOS开发有一段时间了,可能很多人也会有一样的想法,究竟自己现在能写出点什么看上去能算是应用的程序,我在左思右想之后,用了8个小时,写了这个归属地查询软件,我想说的是,这个软件从代码上看其实很简单,学了iOS开发一段时间的人都应该能写出来,无非就是从一个textfield接收一个电话号码,之后对电话号码稍加转换,之后是用数据库查询。
在这里呢,我们输入的号码,无非就是几种(可能是客服电话,10XXXX;可能是固话:0XXxxxxxxxx,和0XXXxxxxxxxx,这里我们允许用户只输入区号(0XX,0XXX);可能是移动电话:1XXxxxxxxxx,861XXxxxxxxxx,+861XXxxxxxxxx,这里我们同样允许用户输入电话号码的前7位,即(1XXxxxx,861XXxxxx,+861XXxxxx)),其余输入我们一律视为格式不正确输入,显示内容为:输入的手机号码,归属地,运营商,城市区号;
我们需要一个数据库,如果想做做练习,大家可以自己随便写一个数据库,
这里我会为大家展示一些核心的代码:
第一段代码:拷贝数据库
-(void)DoCopyDatabase{ NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *documentLibraryFolderPath = [documentsDirectory stringByAppendingPathComponent:@"location_Numbercity_citynumber.db"]; if ([[NSFileManager defaultManager] fileExistsAtPath:documentLibraryFolderPath]) { }else { NSString *resourceSampleImagesFolderPath =[[NSBundle mainBundle] pathForResource:@"location_Numbercity_citynumber" ofType:@"db"]; NSData *mainBundleFile = [NSData dataWithContentsOfFile:resourceSampleImagesFolderPath]; [[NSFileManager defaultManager] createFileAtPath:documentLibraryFolderPath contents:mainBundleFile attributes:nil]; } }这段代码,在Documents文件夹下没有我们的数据库的时候将数据库拷贝到该位置。
第二段代码:数据的整理操作
- (IBAction)SearchButton:(id)sender { [textfieldyourphonenumber resignFirstResponder]; mylabelmobile.text = @""; mylabellocation.text = @""; mylabelphonenumber.text = @""; mylabelzonecode.text = @""; NSString *findPhonenumber = @""; NSString *findPhoneNumberMobile = @""; NSString *findPhoneNumberIsACall = @""; NSString *findPhoneNumberIsMobile = @""; NSInteger phonenumberlength = [textfieldyourphonenumber.text length]; if (phonenumberlength == 3 || phonenumberlength == 4 || phonenumberlength == 5 || phonenumberlength == 7 || phonenumberlength == 11|| phonenumberlength == 12|| phonenumberlength == 13|| phonenumberlength == 14) { NSString *tempstring = textfieldyourphonenumber.text; if ((phonenumberlength == 14) && ([tempstring characterAtIndex:0] == '+') &&([tempstring characterAtIndex:1] == '8')&&([tempstring characterAtIndex:2] == '6')&&([tempstring characterAtIndex:3] == '1')) { NSMutableString *tempstring02 = [NSMutableString stringWithString:tempstring]; NSRange range; range.location = 0; range.length = 3; [tempstring02 deleteCharactersInRange:range]; NSString *tempstring03 = [tempstring02 stringByPaddingToLength:7 withString:nil startingAtIndex:0]; NSString *findPhonenumberFull = [tempstring02 stringByPaddingToLength:11 withString:nil startingAtIndex:0]; mylabelphonenumber.text = findPhonenumberFull; findPhoneNumberMobile = [tempstring02 stringByPaddingToLength:3 withString:nil startingAtIndex:0]; findPhonenumber = tempstring03; }else if . . . }else if (((phonenumberlength == 12) && ([tempstring characterAtIndex:0] == '0'))||((phonenumberlength == 4) && ([tempstring characterAtIndex:0] == '0'))) { NSMutableString *tempstring02 = [NSMutableString stringWithString:tempstring]; mylabelphonenumber.text = tempstring02; NSMutableString *tempstring03 = [[NSMutableString alloc] initWithCapacity:1]; [tempstring03 appendString:[tempstring02 stringByPaddingToLength:4 withString:nil startingAtIndex:0]]; mylabelzonecode.text = tempstring03; NSRange range; range.location = 0; range.length = 1; [tempstring03 deleteCharactersInRange:range]; findPhoneNumberIsACall = tempstring03; }else if . . . }else if ((phonenumberlength == 5) &&([tempstring characterAtIndex:0] == '1')) { mylabelphonenumber.text = tempstring; findPhoneNumberIsMobile = tempstring; }else { [self PhoneNumberError]; } }else { [self PhoneNumberError]; } if ([findPhonenumber length] ==7 && [findPhoneNumberMobile length] ==3) { [self SelectInfoByPhone:findPhonenumber WithMobile:findPhoneNumberMobile]; }else if ([findPhoneNumberIsACall length] == 3||[findPhoneNumberIsACall length] == 4) { [self SelectInfoByCall:findPhoneNumberIsACall]; }else if ([findPhoneNumberIsMobile length] == 5) { NSInteger findPhoneNumberIsMobileInt = [findPhoneNumberIsMobile intValue]; [self SelectInfoByPhoneNumberIsMobile:findPhoneNumberIsMobileInt]; } textfieldyourphonenumber.text = @""; }这里我为大家展示了部分对数据操作代码,省略的代码与其他大同小异,所以我们就提供一个特殊的5位,和移动电话,和固话,各一段操作。
第三段代码:查询数据库
-(void)SelectInfoByPhone:(NSString *)phonenumber WithMobile:(NSString *)phonemobile { NSString *SelectWhatMobile = @"SELECT mobile FROM numbermobile where uid="; NSString *SelectWhatMobileFull = [SelectWhatMobile stringByAppendingFormat:phonemobile]; sqlite3 *database; if (sqlite3_open([[self FindDatabase] UTF8String], &database) != SQLITE_OK) { sqlite3_close(database); NSAssert(0, @"Failed to open database"); } sqlite3_stmt *stmt; if (sqlite3_prepare_v2(database, [SelectWhatMobileFull UTF8String], -1, &stmt, nil) == SQLITE_OK) { while (sqlite3_step(stmt) == SQLITE_ROW) { int mobilenumber = sqlite3_column_int(stmt, 0); if (mobilenumber) { NSString *mobileNumberString = [NSString stringWithFormat:@"%d",mobilenumber]; NSString *SelectWhatMobileName = @"SELECT mobile FROM mobilenumber WHERE uid="; NSString *SelectWhatMobileNameFull = [SelectWhatMobileName stringByAppendingFormat:mobileNumberString]; sqlite3_stmt *stmt2; if (sqlite3_prepare_v2(database, [SelectWhatMobileNameFull UTF8String], -1, &stmt2, nil) == SQLITE_OK) { while (sqlite3_step(stmt2) == SQLITE_ROW) { char *mobilename = (char *)sqlite3_column_text(stmt2, 0); NSString *mobilenamestring = [[NSString alloc] initWithUTF8String:mobilename]; if (mobilenamestring!= NULL) { mylabelmobile.text = mobilenamestring; } } }sqlite3_finalize(stmt2); } } sqlite3_finalize(stmt); } sqlite3_stmt *stmt3; NSString *SelectCityNumberByPhoneNumber = @"SELECT city FROM phonenumberwithcity WHERE uid="; NSString *SelectCityNumberByPhoneNumberFull = [SelectCityNumberByPhoneNumber stringByAppendingFormat:phonenumber]; if (sqlite3_prepare_v2(database, [SelectCityNumberByPhoneNumberFull UTF8String], -1, &stmt3, nil) == SQLITE_OK) { if (sqlite3_step(stmt3) == SQLITE_ROW) { int citynumber = sqlite3_column_int(stmt3, 0); NSString *citynumberNSString = [NSString stringWithFormat:@"%d",citynumber]; if (citynumberNSString != nil) { NSString *SelectCityNameAndCtiyZoneByCityBumber = @"SELECT city,zone FROM citywithnumber WHERE uid="; NSString *SelectCityNameAndCtiyZoneByCityBumberFull = [SelectCityNameAndCtiyZoneByCityBumber stringByAppendingFormat:citynumberNSString]; sqlite3_stmt *stmt4; if (sqlite3_prepare_v2(database, [SelectCityNameAndCtiyZoneByCityBumberFull UTF8String], -1, &stmt4, nil) == SQLITE_OK) { if (sqlite3_step(stmt4) == SQLITE_ROW) { char *cityname = (char *)sqlite3_column_text(stmt4, 0); int cityzonecode = sqlite3_column_int(stmt4, 1); NSString *cityNameNSString = [[NSString alloc] initWithUTF8String:cityname]; NSString *cityzonecodeNnumber = [@"0" stringByAppendingFormat:@"%d",cityzonecode]; if (cityNameNSString != nil && cityzonecodeNnumber != nil) { mylabellocation.text = cityNameNSString; mylabelzonecode.text = cityzonecodeNnumber; } }else { [self PhoneNumberError]; } sqlite3_finalize(stmt4); } } }else { [self PhoneNumberError]; } sqlite3_finalize(stmt3); } sqlite3_close(database); }上面代码,对移动电话的查询方法
同样我们还有-(void)SelectInfoByCall:(NSString *) callnumber和-(void)SelectInfoByPhoneNumberIsMobile:(NSInteger)PhoneNumberIsMobile
在这里我不做太多的讲解,因为在程序内使用的都是特别基础的语法,我们还可以再继续写下去,比如添加读取最近的10条通话,供用户选择等等等等,程序运行图片我会在周一为大家添加上