<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    自己選擇的路,摸爬滾打也要走下去

    2011年6月29日

    IOS開發(fā)筆記 多個(gè)tableView的使用

    UITableView是app開發(fā)中常用到的控件,功能很強(qiáng)大,多用于數(shù)據(jù)的顯示。下面以一個(gè)簡單的實(shí)例來介紹tableview的基本用法。(適合新手,高手飄過)



    1. @interface TableViewTestViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>{  
    2.   
    3.     UITableView *DataTable;  
    4.   
    5.     NSMutableArray *dataArray1; //定義數(shù)據(jù)數(shù)組1  
    6.   
    7.     NSMutableArray *dataArray2;//定義數(shù)據(jù)數(shù)組2  
    8.   
    9.     NSMutableArray *titleArray;//定義標(biāo)題數(shù)組  
    10.   
    11. }  
    12.   
    13.    
    14.   
    15. - (void)viewDidLoad  
    16.   
    17. {  
    18.   
    19.     [superviewDidLoad];  
    20.   
    21. //初始化tableview  
    22.   
    23.     DataTable = [[UITableViewalloc] initWithFrame:CGRectMake(0, 0, 320, 420)];//指定位置大小  
    24.   
    25.     [DataTablesetDelegate:self];//指定委托  
    26.   
    27.     [DataTablesetDataSource:self];//指定數(shù)據(jù)委托  
    28.   
    29.     [self.viewaddSubview:DataTable];//加載tableview  
    30.   
    31.       
    32.   
    33.     dataArray1 = [[NSMutableArrayalloc] initWithObjects:@"中國", @"美國", @"英國", nil];//初始化數(shù)據(jù)數(shù)組1  
    34.   
    35.     dataArray2 = [[NSMutableArrayalloc] initWithObjects:@"黃種人", @"黑種人", @"白種人", nil];//初始化數(shù)據(jù)數(shù)組2  
    36.   
    37.     titleArray = [[NSMutableArrayalloc] initWithObjects:@"國家", @"種族", nil];//初始化標(biāo)題數(shù)組  
    38.   
    39.       
    40.   
    41. }  
    42.   
    43.    
    44.   
    45. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
    46.   
    47. {  
    48.   
    49.     // Return YES for supported orientations  
    50.   
    51.     return (interfaceOrientation == UIInterfaceOrientationPortrait);  
    52.   
    53. }  
    54.   
    55.    
    56.   
    57.    
    58.   
    59. //每個(gè)section顯示的標(biāo)題  
    60.   
    61. - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{  
    62.   
    63.     switch (section) {  
    64.   
    65.         case 0:  
    66.   
    67.             return [titleArray objectAtIndex:section];//提取標(biāo)題數(shù)組的元素用來顯示標(biāo)題  
    68.   
    69.         case 1:  
    70.   
    71.             return [titleArray objectAtIndex:section];//提取標(biāo)題數(shù)組的元素用來顯示標(biāo)題  
    72.   
    73.         default:  
    74.   
    75.             return @"Unknown";  
    76.   
    77.     }  
    78.   
    79.    
    80.   
    81. }  
    82.   
    83.    
    84.   
    85. //指定有多少個(gè)分區(qū)(Section),默認(rèn)為1  
    86.   
    87. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {  
    88.   
    89.     return [titleArray count];//返回標(biāo)題數(shù)組中元素的個(gè)數(shù)來確定分區(qū)的個(gè)數(shù)  
    90.   
    91. }  
    92.   
    93.    
    94.   
    95. //指定每個(gè)分區(qū)中有多少行,默認(rèn)為1  
    96.   
    97. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{  
    98.   
    99.     switch (section) {  
    100.   
    101.         case 0:  
    102.   
    103.            return  [dataArray1 count];//每個(gè)分區(qū)通常對(duì)應(yīng)不同的數(shù)組,返回其元素個(gè)數(shù)來確定分區(qū)的行數(shù)  
    104.   
    105.             break;  
    106.   
    107.         case 1:  
    108.   
    109.             return  [dataArray2 count];  
    110.   
    111.             break;  
    112.   
    113.         default:  
    114.   
    115.             return 0;  
    116.   
    117.             break;  
    118.   
    119.     }  
    120.   
    121. }  
    122.   
    123.    
    124.   
    125. //繪制Cell  
    126.   
    127. -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
    128.   
    129.    
    130.   
    131.     static NSString *CellIdentifier = @"Cell";  
    132.   
    133.  //初始化cell并指定其類型,也可自定義cell  
    134.   
    135. UITableViewCell *cell = (UITableViewCell*)[tableView  dequeueReusableCellWithIdentifier:CellIdentifier];  
    136.   
    137.   if(cell == nil)   
    138.   
    139.   {  
    140.   
    141.   cell = [[[UITableViewCellalloc]   
    142.   
    143.   initWithFrame:CGRectZero   
    144.   
    145.   reuseIdentifier:CellIdentifier] autorelease];  
    146.   
    147. }  
    148.   
    149.    switch (indexPath.section) {  
    150.   
    151.   case 0://對(duì)應(yīng)各自的分區(qū)  
    152.   
    153.     [[cell textLabel]  setText:[dataArray1 objectAtIndex:indexPath.row]];//給cell添加數(shù)據(jù)  
    154.   
    155.     break;  
    156.   
    157.   case 1:  
    158.   
    159.     [[cell textLabel]  setText:[dataArray2 objectAtIndex:indexPath.row]];  
    160.   
    161.     break;  
    162.   
    163.   default:  
    164.   
    165.     [[cell textLabel]  setText:@"Unknown"];  
    166.   
    167. }  
    168.   
    169.   return cell;//返回cell  
    170.   
    171. }  

    上面的例子在功能上介紹了tableview的使用,但其在數(shù)據(jù)處理上具有很大的局限性。當(dāng)我們要從服務(wù)器上請(qǐng)求數(shù)據(jù),面對(duì)多種可能的數(shù)據(jù)(主要指數(shù)組的個(gè)數(shù)不穩(wěn)定)此時(shí)上面的switch將無法滿足我們的需求了。使用switch可是代碼的結(jié)構(gòu)清晰明了,但其局限性很致命(switch中case的個(gè)數(shù)無法動(dòng)態(tài)指定),下面的另一種方法可解決上述問題。



    代碼在原由基礎(chǔ)上進(jìn)行的修改:

    1. @interface TableViewTestViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>{  
    2.   
    3.     UITableView *DataTable;  
    4.   
    5.     NSMutableArray *dataArray1;  
    6.   
    7.     NSMutableArray *dataArray2;  
    8.   
    9.     NSMutableArray *titleArray;  
    10.   
    11.     NSMutableArray *dataArray; //加入了用于保存數(shù)組的數(shù)組 dataArray  
    12.   
    13. }  
    14.   
    15.    
    16.   
    17. - (void)viewDidLoad  
    18.   
    19. {  
    20.   
    21.     [superviewDidLoad];  
    22.   
    23.     DataTable = [[UITableViewalloc] initWithFrame:CGRectMake(0, 0, 320, 420)];  
    24.   
    25.     [DataTablesetDelegate:self];  
    26.   
    27.     [DataTablesetDataSource:self];  
    28.   
    29.     [self.viewaddSubview:DataTable];  
    30.   
    31.       
    32.   
    33.     dataArray1 = [[NSMutableArrayalloc] initWithObjects:@"中國", @"美國", @"英國", nil];  
    34.   
    35.     dataArray2 = [[NSMutableArrayalloc] initWithObjects:@"黃種人", @"黑種人", @"白種人", nil];  
    36.   
    37.     titleArray = [[NSMutableArrayalloc] initWithObjects:@"國家", @"種族", nil];  
    38.   
    39.     dataArray = [[NSMutableArrayalloc] initWithObjects:dataArray1, dataArray2, nil]; //初始化dataArray,元素為數(shù)組  
    40.   
    41.       
    42.   
    43. }  
    44.   
    45.    
    46.   
    47.    
    48.   
    49. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
    50.   
    51. {  
    52.   
    53.     // Return YES for supported orientations  
    54.   
    55.     return (interfaceOrientation == UIInterfaceOrientationPortrait);  
    56.   
    57. }  
    58.   
    59.  //制定個(gè)性標(biāo)題,這里通過UIview來設(shè)計(jì)標(biāo)題,功能上豐富,變化多。  
    60.   
    61. - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {  
    62.   
    63.     UIView *view = [[[UIViewalloc] initWithFrame:CGRectMake(0, 0, 320, 40)] autorelease];  
    64.   
    65.     [view setBackgroundColor:[UIColorbrownColor]];//改變標(biāo)題的顏色,也可用圖片  
    66.   
    67.     UILabel *label = [[UILabelalloc] initWithFrame:CGRectMake(5, 5, 100, 30)];  
    68.   
    69.     label.textColor = [UIColorredColor];  
    70.   
    71.     label.backgroundColor = [UIColorclearColor];  
    72.   
    73.     label.text = [titleArrayobjectAtIndex:section];  
    74.   
    75.     [view addSubview:label];  
    76.   
    77.      return view;  
    78.   
    79. }  
    80.   
    81.  //指定標(biāo)題的高度  
    82.   
    83. - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{  
    84.   
    85.     return 40;  
    86.   
    87. }  
    88.   
    89.    
    90.   
    91. //每個(gè)section顯示的標(biāo)題,有了上面的這個(gè)就不要了  
    92.   
    93. - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{  
    94.   
    95. }  
    96.   
    97.    
    98.   
    99. //指定有多少個(gè)分區(qū)(Section),默認(rèn)為1  
    100.   
    101. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {  
    102.   
    103.     return [titleArraycount];  
    104.   
    105. }  
    106.   
    107.    
    108.   
    109. //指定每個(gè)分區(qū)中有多少行,默認(rèn)為1  
    110.   
    111. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{  
    112.   
    113.    /* switch (section) { 
    114.  
    115.         case 0: 
    116.  
    117.            return  [dataArray1 count]; 
    118.  
    119.             break; 
    120.  
    121.         case 1: 
    122.  
    123.             return  [dataArray2 count]; 
    124.  
    125.             break; 
    126.  
    127.         default: 
    128.  
    129.             return 0; 
    130.  
    131.             break; 
    132.  
    133.     }*/  
    134.   
    135.   /*  for(int i = 0; i < [titleArray count]; i++){ 
    136.  
    137.         if(section == i){ 
    138.  
    139.             return [[dataArray objectAtIndex:section] count]; 
    140.  
    141.         } 
    142.  
    143.     }*/  
    144.   
    145.   //上面的方法也是可行的,大家參考比較下  
    146.   
    147.     return [[dataArray objectAtIndex:section] count];  //取dataArray中的元素,并根據(jù)每個(gè)元素(數(shù)組)來判斷分區(qū)中的行數(shù)。  
    148.   
    149.       
    150.   
    151.       
    152.   
    153. }  
    154.   
    155.    
    156.   
    157. //繪制Cell  
    158.   
    159. -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
    160.   
    161.    
    162.   
    163.     static NSString *CellIdentifier = @"Cell";  
    164.   
    165.    
    166.   
    167. UITableViewCell *cell = (UITableViewCell*)[tableView   
    168.   
    169.                                                dequeueReusableCellWithIdentifier:CellIdentifier];  
    170.   
    171. if(cell == nil)   
    172.   
    173. {  
    174.   
    175. cell = [[[UITableViewCellalloc]   
    176.   
    177. initWithFrame:CGRectZero   
    178.   
    179. reuseIdentifier:CellIdentifier] autorelease];  
    180.   
    181. }  
    182.   
    183.    
    184.   
    185. /*switch (indexPath.section) { 
    186.  
    187. case 0: 
    188.  
    189. [[cell textLabel]  
    190.  
    191. setText:[dataArray1 objectAtIndex:indexPath.row]]; 
    192.  
    193. break; 
    194.  
    195. case 1: 
    196.  
    197. [[cell textLabel]  
    198.  
    199. setText:[dataArray2 objectAtIndex:indexPath.row]]; 
    200.  
    201. break; 
    202.  
    203. default: 
    204.  
    205. [[cell textLabel]  
    206.  
    207. setText:@"Unknown"]; 
    208.  
    209. }*/  
    210.   
    211.     //上面的方法也可行,大家比較下。  
    212.   
    213.     [[cell textLabel] setText:[[dataArrayobjectAtIndex:indexPath.section]objectAtIndex:indexPath.row]];  
    214.   
    215.  //同上,取出dataArray中每個(gè)分區(qū)所對(duì)應(yīng)的元素(數(shù)組),并通過其來取值。 (大家要有想像力, 復(fù)制代碼試試就明白了)  
    216.   
    217.       
    218.   
    219. return cell;  
    220.   
    221.    
    222.   
    223. }  
    224.   
    225.    
    226.   
    227.  //改變行的高度  
    228.   
    229. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{  
    230.   
    231.     return40;  
    232.   
    233. }  

    轉(zhuǎn)自:http://www.cnblogs.com/top5/archive/2012/05/17/2506604.html


    posted @ 2014-08-20 10:44 wokaoJune 閱讀(307) | 評(píng)論 (0)編輯 收藏

    IOS開發(fā)筆記 多個(gè)tableView的使用

    UITableView是app開發(fā)中常用到的控件,功能很強(qiáng)大,多用于數(shù)據(jù)的顯示。下面以一個(gè)簡單的實(shí)例來介紹tableview的基本用法。(適合新手,高手飄過)



    1. @interface TableViewTestViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>{  
    2.   
    3.     UITableView *DataTable;  
    4.   
    5.     NSMutableArray *dataArray1; //定義數(shù)據(jù)數(shù)組1  
    6.   
    7.     NSMutableArray *dataArray2;//定義數(shù)據(jù)數(shù)組2  
    8.   
    9.     NSMutableArray *titleArray;//定義標(biāo)題數(shù)組  
    10.   
    11. }  
    12.   
    13.    
    14.   
    15. - (void)viewDidLoad  
    16.   
    17. {  
    18.   
    19.     [superviewDidLoad];  
    20.   
    21. //初始化tableview  
    22.   
    23.     DataTable = [[UITableViewalloc] initWithFrame:CGRectMake(0, 0, 320, 420)];//指定位置大小  
    24.   
    25.     [DataTablesetDelegate:self];//指定委托  
    26.   
    27.     [DataTablesetDataSource:self];//指定數(shù)據(jù)委托  
    28.   
    29.     [self.viewaddSubview:DataTable];//加載tableview  
    30.   
    31.       
    32.   
    33.     dataArray1 = [[NSMutableArrayalloc] initWithObjects:@"中國", @"美國", @"英國", nil];//初始化數(shù)據(jù)數(shù)組1  
    34.   
    35.     dataArray2 = [[NSMutableArrayalloc] initWithObjects:@"黃種人", @"黑種人", @"白種人", nil];//初始化數(shù)據(jù)數(shù)組2  
    36.   
    37.     titleArray = [[NSMutableArrayalloc] initWithObjects:@"國家", @"種族", nil];//初始化標(biāo)題數(shù)組  
    38.   
    39.       
    40.   
    41. }  
    42.   
    43.    
    44.   
    45. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
    46.   
    47. {  
    48.   
    49.     // Return YES for supported orientations  
    50.   
    51.     return (interfaceOrientation == UIInterfaceOrientationPortrait);  
    52.   
    53. }  
    54.   
    55.    
    56.   
    57.    
    58.   
    59. //每個(gè)section顯示的標(biāo)題  
    60.   
    61. - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{  
    62.   
    63.     switch (section) {  
    64.   
    65.         case 0:  
    66.   
    67.             return [titleArray objectAtIndex:section];//提取標(biāo)題數(shù)組的元素用來顯示標(biāo)題  
    68.   
    69.         case 1:  
    70.   
    71.             return [titleArray objectAtIndex:section];//提取標(biāo)題數(shù)組的元素用來顯示標(biāo)題  
    72.   
    73.         default:  
    74.   
    75.             return @"Unknown";  
    76.   
    77.     }  
    78.   
    79.    
    80.   
    81. }  
    82.   
    83.    
    84.   
    85. //指定有多少個(gè)分區(qū)(Section),默認(rèn)為1  
    86.   
    87. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {  
    88.   
    89.     return [titleArray count];//返回標(biāo)題數(shù)組中元素的個(gè)數(shù)來確定分區(qū)的個(gè)數(shù)  
    90.   
    91. }  
    92.   
    93.    
    94.   
    95. //指定每個(gè)分區(qū)中有多少行,默認(rèn)為1  
    96.   
    97. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{  
    98.   
    99.     switch (section) {  
    100.   
    101.         case 0:  
    102.   
    103.            return  [dataArray1 count];//每個(gè)分區(qū)通常對(duì)應(yīng)不同的數(shù)組,返回其元素個(gè)數(shù)來確定分區(qū)的行數(shù)  
    104.   
    105.             break;  
    106.   
    107.         case 1:  
    108.   
    109.             return  [dataArray2 count];  
    110.   
    111.             break;  
    112.   
    113.         default:  
    114.   
    115.             return 0;  
    116.   
    117.             break;  
    118.   
    119.     }  
    120.   
    121. }  
    122.   
    123.    
    124.   
    125. //繪制Cell  
    126.   
    127. -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
    128.   
    129.    
    130.   
    131.     static NSString *CellIdentifier = @"Cell";  
    132.   
    133.  //初始化cell并指定其類型,也可自定義cell  
    134.   
    135. UITableViewCell *cell = (UITableViewCell*)[tableView  dequeueReusableCellWithIdentifier:CellIdentifier];  
    136.   
    137.   if(cell == nil)   
    138.   
    139.   {  
    140.   
    141.   cell = [[[UITableViewCellalloc]   
    142.   
    143.   initWithFrame:CGRectZero   
    144.   
    145.   reuseIdentifier:CellIdentifier] autorelease];  
    146.   
    147. }  
    148.   
    149.    switch (indexPath.section) {  
    150.   
    151.   case 0://對(duì)應(yīng)各自的分區(qū)  
    152.   
    153.     [[cell textLabel]  setText:[dataArray1 objectAtIndex:indexPath.row]];//給cell添加數(shù)據(jù)  
    154.   
    155.     break;  
    156.   
    157.   case 1:  
    158.   
    159.     [[cell textLabel]  setText:[dataArray2 objectAtIndex:indexPath.row]];  
    160.   
    161.     break;  
    162.   
    163.   default:  
    164.   
    165.     [[cell textLabel]  setText:@"Unknown"];  
    166.   
    167. }  
    168.   
    169.   return cell;//返回cell  
    170.   
    171. }  

    上面的例子在功能上介紹了tableview的使用,但其在數(shù)據(jù)處理上具有很大的局限性。當(dāng)我們要從服務(wù)器上請(qǐng)求數(shù)據(jù),面對(duì)多種可能的數(shù)據(jù)(主要指數(shù)組的個(gè)數(shù)不穩(wěn)定)此時(shí)上面的switch將無法滿足我們的需求了。使用switch可是代碼的結(jié)構(gòu)清晰明了,但其局限性很致命(switch中case的個(gè)數(shù)無法動(dòng)態(tài)指定),下面的另一種方法可解決上述問題。



    代碼在原由基礎(chǔ)上進(jìn)行的修改:

    1. @interface TableViewTestViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>{  
    2.   
    3.     UITableView *DataTable;  
    4.   
    5.     NSMutableArray *dataArray1;  
    6.   
    7.     NSMutableArray *dataArray2;  
    8.   
    9.     NSMutableArray *titleArray;  
    10.   
    11.     NSMutableArray *dataArray; //加入了用于保存數(shù)組的數(shù)組 dataArray  
    12.   
    13. }  
    14.   
    15.    
    16.   
    17. - (void)viewDidLoad  
    18.   
    19. {  
    20.   
    21.     [superviewDidLoad];  
    22.   
    23.     DataTable = [[UITableViewalloc] initWithFrame:CGRectMake(0, 0, 320, 420)];  
    24.   
    25.     [DataTablesetDelegate:self];  
    26.   
    27.     [DataTablesetDataSource:self];  
    28.   
    29.     [self.viewaddSubview:DataTable];  
    30.   
    31.       
    32.   
    33.     dataArray1 = [[NSMutableArrayalloc] initWithObjects:@"中國", @"美國", @"英國", nil];  
    34.   
    35.     dataArray2 = [[NSMutableArrayalloc] initWithObjects:@"黃種人", @"黑種人", @"白種人", nil];  
    36.   
    37.     titleArray = [[NSMutableArrayalloc] initWithObjects:@"國家", @"種族", nil];  
    38.   
    39.     dataArray = [[NSMutableArrayalloc] initWithObjects:dataArray1, dataArray2, nil]; //初始化dataArray,元素為數(shù)組  
    40.   
    41.       
    42.   
    43. }  
    44.   
    45.    
    46.   
    47.    
    48.   
    49. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
    50.   
    51. {  
    52.   
    53.     // Return YES for supported orientations  
    54.   
    55.     return (interfaceOrientation == UIInterfaceOrientationPortrait);  
    56.   
    57. }  
    58.   
    59.  //制定個(gè)性標(biāo)題,這里通過UIview來設(shè)計(jì)標(biāo)題,功能上豐富,變化多。  
    60.   
    61. - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {  
    62.   
    63.     UIView *view = [[[UIViewalloc] initWithFrame:CGRectMake(0, 0, 320, 40)] autorelease];  
    64.   
    65.     [view setBackgroundColor:[UIColorbrownColor]];//改變標(biāo)題的顏色,也可用圖片  
    66.   
    67.     UILabel *label = [[UILabelalloc] initWithFrame:CGRectMake(5, 5, 100, 30)];  
    68.   
    69.     label.textColor = [UIColorredColor];  
    70.   
    71.     label.backgroundColor = [UIColorclearColor];  
    72.   
    73.     label.text = [titleArrayobjectAtIndex:section];  
    74.   
    75.     [view addSubview:label];  
    76.   
    77.      return view;  
    78.   
    79. }  
    80.   
    81.  //指定標(biāo)題的高度  
    82.   
    83. - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{  
    84.   
    85.     return 40;  
    86.   
    87. }  
    88.   
    89.    
    90.   
    91. //每個(gè)section顯示的標(biāo)題,有了上面的這個(gè)就不要了  
    92.   
    93. - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{  
    94.   
    95. }  
    96.   
    97.    
    98.   
    99. //指定有多少個(gè)分區(qū)(Section),默認(rèn)為1  
    100.   
    101. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {  
    102.   
    103.     return [titleArraycount];  
    104.   
    105. }  
    106.   
    107.    
    108.   
    109. //指定每個(gè)分區(qū)中有多少行,默認(rèn)為1  
    110.   
    111. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{  
    112.   
    113.    /* switch (section) { 
    114.  
    115.         case 0: 
    116.  
    117.            return  [dataArray1 count]; 
    118.  
    119.             break; 
    120.  
    121.         case 1: 
    122.  
    123.             return  [dataArray2 count]; 
    124.  
    125.             break; 
    126.  
    127.         default: 
    128.  
    129.             return 0; 
    130.  
    131.             break; 
    132.  
    133.     }*/  
    134.   
    135.   /*  for(int i = 0; i < [titleArray count]; i++){ 
    136.  
    137.         if(section == i){ 
    138.  
    139.             return [[dataArray objectAtIndex:section] count]; 
    140.  
    141.         } 
    142.  
    143.     }*/  
    144.   
    145.   //上面的方法也是可行的,大家參考比較下  
    146.   
    147.     return [[dataArray objectAtIndex:section] count];  //取dataArray中的元素,并根據(jù)每個(gè)元素(數(shù)組)來判斷分區(qū)中的行數(shù)。  
    148.   
    149.       
    150.   
    151.       
    152.   
    153. }  
    154.   
    155.    
    156.   
    157. //繪制Cell  
    158.   
    159. -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
    160.   
    161.    
    162.   
    163.     static NSString *CellIdentifier = @"Cell";  
    164.   
    165.    
    166.   
    167. UITableViewCell *cell = (UITableViewCell*)[tableView   
    168.   
    169.                                                dequeueReusableCellWithIdentifier:CellIdentifier];  
    170.   
    171. if(cell == nil)   
    172.   
    173. {  
    174.   
    175. cell = [[[UITableViewCellalloc]   
    176.   
    177. initWithFrame:CGRectZero   
    178.   
    179. reuseIdentifier:CellIdentifier] autorelease];  
    180.   
    181. }  
    182.   
    183.    
    184.   
    185. /*switch (indexPath.section) { 
    186.  
    187. case 0: 
    188.  
    189. [[cell textLabel]  
    190.  
    191. setText:[dataArray1 objectAtIndex:indexPath.row]]; 
    192.  
    193. break; 
    194.  
    195. case 1: 
    196.  
    197. [[cell textLabel]  
    198.  
    199. setText:[dataArray2 objectAtIndex:indexPath.row]]; 
    200.  
    201. break; 
    202.  
    203. default: 
    204.  
    205. [[cell textLabel]  
    206.  
    207. setText:@"Unknown"]; 
    208.  
    209. }*/  
    210.   
    211.     //上面的方法也可行,大家比較下。  
    212.   
    213.     [[cell textLabel] setText:[[dataArrayobjectAtIndex:indexPath.section]objectAtIndex:indexPath.row]];  
    214.   
    215.  //同上,取出dataArray中每個(gè)分區(qū)所對(duì)應(yīng)的元素(數(shù)組),并通過其來取值。 (大家要有想像力, 復(fù)制代碼試試就明白了)  
    216.   
    217.       
    218.   
    219. return cell;  
    220.   
    221.    
    222.   
    223. }  
    224.   
    225.    
    226.   
    227.  //改變行的高度  
    228.   
    229. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{  
    230.   
    231.     return40;  
    232.   
    233. }  

    轉(zhuǎn)自:http://www.cnblogs.com/top5/archive/2012/05/17/2506604.html


    posted @ 2014-08-20 10:44 wokaoJune 閱讀(2700) | 評(píng)論 (0)編輯 收藏

    三十而立,從零開始學(xué)ios開發(fā)(十):Multiview Applications(多個(gè)xib之前的切換)

    這篇學(xué)習(xí)的主要內(nèi)容是Multiview,在我們學(xué)習(xí)iphone旋轉(zhuǎn)的時(shí)候,介紹過多個(gè)view的使用方法,不過這里的view和旋轉(zhuǎn)屏幕中所指的多個(gè)view是不同的,旋轉(zhuǎn)屏幕中涉及到的多個(gè)view是在一個(gè)xib文件中的,而我們這里所指的mulitview,則是指多個(gè)xib,在多個(gè)xib中進(jìn)行view的切換,也就是從一個(gè)xib切換到另一個(gè)xib,而每個(gè)xib中只有一個(gè)view。

    另外的一個(gè)不同點(diǎn)體現(xiàn)在創(chuàng)建項(xiàng)目的時(shí)候,到目前為止,我們創(chuàng)建的所有項(xiàng)目的template都是single view,這次創(chuàng)建的項(xiàng)目將使用新的template。

    Multiview applicatin的基本架構(gòu),一般來說,一個(gè)multiview application會(huì)有一個(gè)主要的controller來控制view的呈現(xiàn),這個(gè)主要的controller可以是toolbar(iphone上的Safari打開后,地下的一排按鈕就是toolbar)或者是tab bar(iphone打開phone,最下面一個(gè)一個(gè)的tab),或者其他的一些控件,他們控制到底那個(gè)view應(yīng)該顯示,那個(gè)view應(yīng)該被隱藏,也就是說,至少需要3個(gè)view才能實(shí)現(xiàn)view的切換,一個(gè)主要的controller view,2個(gè)其他的用于切換的view,主要的controller view是一直顯示在屏幕上的,而其他的view中,只有1個(gè)會(huì)顯示出來,其他的都被隱藏。ok,下面開始一步一步實(shí)現(xiàn)multiview吧,再說下去會(huì)越來越糊涂的。

    0)項(xiàng)目簡介
    今天要做的例子中包含3個(gè)view,一個(gè)controller view,我們會(huì)使用toolbar,2個(gè)用于切換的view,一個(gè)藍(lán)色底,一個(gè)黃色底,他們中間都有一個(gè)button,單擊button會(huì)有一個(gè)警告框彈出,告訴用戶當(dāng)前顯示的是哪個(gè)view。

    1)創(chuàng)建一個(gè)工程,選擇Empty Application

    這次不再選擇Single View Application,而選擇Empty Application,項(xiàng)目中的所有文件我們都會(huì)手動(dòng)進(jìn)行添加。

    單擊Next按鈕,之后的操作和創(chuàng)建Single View項(xiàng)目一樣,設(shè)定項(xiàng)目名稱“View Switcher”,設(shè)定項(xiàng)目保存路徑,項(xiàng)目創(chuàng)建完成。

    2)添加View Controller
    由于我們使用的模板是Empty Application,因此當(dāng)創(chuàng)建完項(xiàng)目后,只有以下一些文件

    里面并沒有我們需要的controller view,也沒有任何xib文件,這些都是需要我們手動(dòng)添加的。使用快捷鍵command+N或者菜單欄File>New>New File...,在彈出的窗口中,左邊選擇Cocoa Touch,右邊選擇UIViewController subclass,點(diǎn)擊Next按鈕

    填寫類名BIDSwitchViewController,其他都是默認(rèn)選項(xiàng)(注意最后一個(gè)checkbox,如果選擇了,則將創(chuàng)建一個(gè)和BIDSwitchViewController關(guān)聯(lián)的xib文件,我們?cè)谶@里可以選上,但是為了弄清楚view controller和xib文件是如何關(guān)聯(lián)在一起的,在這個(gè)項(xiàng)目中我們暫時(shí)不選,后面我們會(huì)手動(dòng)連接這兩個(gè)文件),點(diǎn)擊Next按鈕。

    選擇保持的位置,保存在“View Switcher”目錄下,完成創(chuàng)建。

    BIDSwitchViewController是項(xiàng)目的最頂層的view controller(root controller),它用于控制另外2個(gè)view的切換,下面按照同樣的方法,創(chuàng)建另外2個(gè)view controller,一個(gè)名字教BIDBlueViewController,另一個(gè)叫做BIDYellowViewController,他們都不需要關(guān)聯(lián)xib,且都保存在“View Switcher”目錄下。創(chuàng)建完成后的“View Switcher”結(jié)構(gòu)如下

    3)添加xib文件
    使用快捷鍵command+N或者菜單欄File>New>New File...,在彈出的窗口中,左邊選擇User Interface,右邊選擇View,點(diǎn)擊Next按鈕

    Device Family中選擇iphone,點(diǎn)擊Next

    命名為SwitchView.xib,同樣保持在“View Switcher”目錄下,點(diǎn)擊Create,完成創(chuàng)建。

    使用同樣的方法創(chuàng)建另外兩個(gè)xib,分別命名為BlueView.xib和YellowView.xib。至此,我們所有的文件都已經(jīng)創(chuàng)建完畢,整個(gè)的“View Switcher”結(jié)構(gòu)圖如下

    接下來就是寫代碼的工作了。

    4)編輯BIDAppDelegate文件
    當(dāng)一個(gè)app啟動(dòng)的時(shí)候,我們都會(huì)默認(rèn)的把一個(gè)view載入當(dāng)前的iphone窗口(application's main window),在這個(gè)例子中,這個(gè)view就是我們的root view,即BIDSwitchViewController。我們是在BIDAppDelegate文件中設(shè)置默認(rèn)載入的view的,因此首先打開BIDAppDelegate.h,添加class BIDSwitchViewController,和它的一個(gè)property,如下

    復(fù)制代碼
    #import <UIKit/UIKit.h> @class BIDSwitchViewController; @interface BIDAppDelegate : UIResponder <UIApplicationDelegate>  @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) BIDSwitchViewController *switchViewController;  @end
    復(fù)制代碼

    其中,@class是告訴BIDAppDelegate,后面的BIDSwitchViewController是一個(gè)類,應(yīng)該以類的方式處理該對(duì)象,后面在聲明property的時(shí)候,BIDAppDelegate就知道BIDSwitchViewController是一個(gè)類,不會(huì)不認(rèn)該對(duì)象。

    接著打開BIDAppDelegate.m,添加如下代碼

    復(fù)制代碼
    #import "BIDAppDelegate.h" #import "BIDSwitchViewController.h"  @implementation BIDAppDelegate  @synthesize window = _window; @synthesize switchViewController;  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];     // Override point for customization after application launch.          self.switchViewController = [[BIDSwitchViewController alloc] initWithNibName:@"SwitchView" bundle:nil];     UIView *switchView = self.switchViewController.view;     CGRect switchViewFrame = switchView.frame;     switchViewFrame.origin.y += [UIApplication sharedApplication].statusBarFrame.size.height;     switchView.frame = switchViewFrame;     [self.window addSubview:switchView];          self.window.backgroundColor = [UIColor whiteColor];     [self.window makeKeyAndVisible];     return YES; }  ......
    復(fù)制代碼

    首先import BIDSwitchViewController,然后聲明synthesize,對(duì)應(yīng)于頭文件中的property。

    didFinishLaunchingWithOption方法,當(dāng)一個(gè)app載入完成后需要做一些什么事情,在這里,我們指定了哪個(gè)view被載入到windows中作為默認(rèn)顯示的view。

    self.switchViewController = [[BIDSwitchViewControlleralloc] initWithNibName:@"SwitchView" bundle:nil];
    通過xib(在舊的版本中,xib被稱為nib,因此這里出現(xiàn)的是NibName)的名字來制定初始化哪個(gè)view

    UIView *switchView = self.switchViewController.view;
    獲取view

    CGRect switchViewFrame = switchView.frame;
    得到view的frame,也就是這個(gè)view的顯示位置,在前幾篇的文章中提到過這個(gè)屬性。

    switchViewFrame.origin.y += [UIApplicationsharedApplication].statusBarFrame.size.height;
    我覺得這句話比較重要,它將view的位置往下移動(dòng)了20point(point在非retina屏幕中是20px,在retina屏幕中是40px),這樣就不會(huì)擋住iphone頂部的狀態(tài)欄了。

    switchView.frame = switchViewFrame;
    將修改過的frame從新賦值給switchView

    [self.window addSubview:switchView];
    將switchView設(shè)置成window的subview。怎么理解這句話呢,就是說,一個(gè)app只有一個(gè)窗口(window),這個(gè)window只能同時(shí)顯示一個(gè)view,且這個(gè)view是基于這個(gè)window而存在的,是放在這個(gè)window里面的,因此稱之為window的subview,子視圖。

    5)編輯BIDSwitchViewController.h
    BIDSwitchViewController是root controller,用于控制其他2個(gè)view的切換,因此需要在其頭文件中聲明其他兩個(gè)controller,然后需要定義一個(gè)Action,用來完成對(duì)2個(gè)view的切換,將BIDSwitchViewController.h修改成如下

    復(fù)制代碼
    #import <UIKit/UIKit.h>  @class BIDBlueViewController; @class BIDYellowViewController;  @interface BIDSwitchViewController : UIViewController  @property (strong, nonatomic) BIDBlueViewController *blueViewController; @property (strong, nonatomic) BIDYellowViewController *yellowViewController;  - (IBAction)switchViews:(id)sender;  @end
    復(fù)制代碼

    代碼還是很好理解的,和前面在BIDAppDelegate.h中添加BIDSwitchViewController是一樣的。

    6)關(guān)聯(lián)BIDSwitchViewController和SwitchView.xib
    在Project Navigator中選中SwitchView.xib,在xib的dock中選中File's Owner

    然后在Identity inspector中將Class改成BIDSwitchViewController

    這樣就將SwitchView.xib關(guān)聯(lián)到了BIDSwitchViewController,如果我們選擇Connections inspector,會(huì)看到我們剛才在BIDSwitchViewController.h中定義的Action:switchViews出現(xiàn)在Received Actions,我們之后就可以將這個(gè)Action關(guān)聯(lián)到SwitchView.xib的控件上。

    7)在SwitchView.xib上添加Toolbar
    在這個(gè)例子總,我們切換veiw的方式是點(diǎn)擊Toolbar上的一個(gè)button,然后切換2個(gè)view,SwitchView.xib使我們的root view,因此我們需要在SwitchView.xib上添加一個(gè)toolbar,然后點(diǎn)擊toolbar上的按鈕,切換BlueView.xib和YellowView.xib。

    選中SwitchView.xib,在object library中找到Toolbar

    拖動(dòng)到View上,放在最下方

    默認(rèn)的,已經(jīng)有一個(gè)button在Toolbar上了,雙擊button改變文字,將文字改成“Switch Views”

    接著就是將“Switch Views”按鈕關(guān)聯(lián)到switchViews,選中“Switch Views”,control-dragged到File's Owner,在彈出的框中選中switchViews

    打開Connections inspector,我們可以看到關(guān)聯(lián)后的情況

    有一個(gè)不同的地方,Toolbar上的button不像一般的button,會(huì)有很多的方法讓你進(jìn)行關(guān)聯(lián),Toolbar上button的Sent Actions(其他的button叫做Send Events,有很多個(gè)方法)只有一個(gè)方法,而它的作用相當(dāng)于一般button的touch up inside。

    8)關(guān)聯(lián)SwitchView.xib和BIDSwitchViewController's view outlet
    BIDSwitchViewController繼承自UIViewController,在UIViewController中有一個(gè)outlet view,另外當(dāng)我們?cè)谧龅?)步的時(shí)候,將SwitchView.xib的class改成了BIDSwitchViewController,所以我們要將這個(gè)view關(guān)聯(lián)到SwitchView.xib,關(guān)聯(lián)的方法是選中SwitchView.xib,然后選中File's Owner,control-drag到下面的View

    釋放鼠標(biāo)后,在填出的框中選則view,這樣就關(guān)聯(lián)好了。

    關(guān)聯(lián)好后,查看Connections inspector,也可以看到關(guān)聯(lián)后的結(jié)果

    9)編輯BIDSwitchViewController.m
    添加如下代碼

    復(fù)制代碼
    #import "BIDSwitchViewController.h" #import "BIDYellowViewController.h" #import "BIDBlueViewController.h"  @implementation BIDSwitchViewController @synthesize yellowViewController; @synthesize blueViewController;
    復(fù)制代碼

    2個(gè)#import這個(gè)很好理解,因?yàn)锽IDSwitchViewController是root controller,會(huì)控制另外2個(gè)controller,因此需要把另外2個(gè)controller引入進(jìn)來,這樣才可以對(duì)他們進(jìn)行操作。
    2個(gè)synthesize對(duì)著頭文件中的2個(gè)property。

    復(fù)制代碼
    // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad {     self.blueViewController = [[BIDBlueViewController alloc] initWithNibName:@"BlueView" bundle:nil];     [self.view insertSubview:self.blueViewController.view atIndex:0];     [super viewDidLoad]; }
    復(fù)制代碼

    首先去掉viewDidLoad的注釋,然后添加以上的代碼。從最后一句可以看出,viewDidLoad方法繼承自UIViewController,在這里對(duì)其重載,這個(gè)方法發(fā)生在當(dāng)view已經(jīng)載入完成后,我們所要做的是當(dāng)root view載入完成后,在載入root view的subview,在我們的這個(gè)例子中是BlueView。BlueView的載入方法和前面的一樣,使用initWithNibName,然后作為subView插入到當(dāng)前的view中(當(dāng)前的view就是root view,也就是SwitchView)。

    復(fù)制代碼
    - (IBAction)switchViews:(id)sender {     if(self.yellowViewController.view.superview == nil) {         if(self.yellowViewController == nil) {             self.yellowViewController = [[BIDYellowViewController alloc] initWithNibName:@"YellowView" bundle:nil];         }         [blueViewController.view removeFromSuperview];         [self.view insertSubview:self.yellowViewController.view atIndex:0];     } else {         if (self.blueViewController ==nil) {             self.blueViewController = [[BIDBlueViewController alloc] initWithNibName:@"BlueView" bundle:nil];         }         [yellowViewController.view removeFromSuperview];         [self.view insertSubview:self.blueViewController.view atIndex:0];     } }
    復(fù)制代碼

    實(shí)現(xiàn)switchViews Action,上面的代碼還是很好理解的,首先判斷當(dāng)前哪個(gè)subview是沒有superview的,因?yàn)檫@2個(gè)subview不會(huì)同時(shí)顯示,當(dāng)blueSubview顯示時(shí),YellowSubview就會(huì)從root view中移除,因此不會(huì)具有superview,當(dāng)?shù)弥莻€(gè)subview沒有superview,就說明應(yīng)該顯示這個(gè)subview。知道該顯示哪個(gè)subview后,再判斷這個(gè)subview是否還存在(是否需要重新載入初始化),然后將另一個(gè)subview從superview中移除,再將subview顯示出來。

    復(fù)制代碼
    - (void)didReceiveMemoryWarning {     // Releases the view if it doesn't have a superview.     [super didReceiveMemoryWarning];          // Release any cached data, images, etc that aren't in use.     if (self.blueViewController.view.superview == nil){         self.blueViewController = nil;     } else {         self.yellowViewController = nil;     } }
    復(fù)制代碼

    當(dāng)ios的內(nèi)存不夠用時(shí),didReceiveMemoryWarning會(huì)被系統(tǒng)自動(dòng)調(diào)用,來釋放可利用的內(nèi)存。在這里如果哪個(gè)subview沒有顯示,就釋放該subview,騰出內(nèi)存。

    至此BIDSwitchViewController的所有代碼都寫好了,下面就應(yīng)該處理BIDBlueVeiwController和BIDYellowViewController了。

    (友情提示,時(shí)不時(shí)的編譯一下你的project,盡早發(fā)現(xiàn)問題,容易修改,否則到后面自己都不知道錯(cuò)在哪里)

    10)編輯BlueView.xib和YellowView.xib
    分別在BlueView.xib和YellowView.xib上添加一個(gè)button,并命名為“Press me”。

    修改BlueView.xib的class為BIDBlueViewController,修改YellowView.xib的class為BIDYellowController(修改方法:選中xib,點(diǎn)擊File's Owner,在Identity inspector中更改class)
     
    class改變了,就需要重新關(guān)聯(lián)一下File's owner的view,方法和之前的一樣,選中File‘s Owner,control-drag到下面的View上,在彈出的框中選擇view,關(guān)聯(lián)完畢,2個(gè)xib都需要進(jìn)行這個(gè)操作。

    在Attributes inspector中,將BlueView.xib的background顏色改成藍(lán)色

    同樣的方法將YellowView.xib的background顏色改成黃色

    還有一個(gè)地方需要設(shè)置,因?yàn)槲覀兪窃趓oot view中顯示這2個(gè)subview,而root view有一個(gè)toolbar在最下方,因此subview需要把toolbar的位置空出來,再進(jìn)行自己的布局,還是打開Attributes inspector,在Simulated Metrics欄中有很多現(xiàn)象,他們都是用來模擬iphone屏幕上各種占位控件的,我們將Button Bar的選項(xiàng)設(shè)成Toolbar,這樣xib就會(huì)空出Toolbar的位置來進(jìn)行布局計(jì)算了

    仔細(xì)看的話,“Press me”按鈕的位置往上移動(dòng)了那么一點(diǎn)點(diǎn)

    11)在BIDBlueViewController和BIDYellowViewController中添加代碼
    在BIDBlueViewController.h中添加Action,如下

    @interface BIDBlueViewController : UIViewController - (IBAction)blueButtonPressed; @end

    在BIDBlueViewController.m中實(shí)現(xiàn)blueButtonPressed,如下

    復(fù)制代碼
    - (IBAction)blueButtonPressed {     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Blue View Button Pressed"                                                     message:@"You pressed the button on the blue view"                                                    delegate:nil                                           cancelButtonTitle:@"Yep, I did"                                           otherButtonTitles:nil];     [alert show]; }
    復(fù)制代碼

    在BIDYellowViewController.h添加Action,如下

    @interface BIDYellowViewController : UIViewController - (IBAction)yellowButtonPressed; @end

    在BIDYellowViewController.m中實(shí)現(xiàn)yellowButtonPressed,如下

    復(fù)制代碼
    - (IBAction)yellowButtonPressed {     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Yellow View Button Pressed"                                                     message:@"You pressed the button on the yellow view"                                                    delegate:nil                                           cancelButtonTitle:@"Yep, I did"                                           otherButtonTitles:nil];     [alert show]; }
    復(fù)制代碼

    代碼都很簡單,就不多做解釋了。

    12)關(guān)聯(lián)button和Action
    打開BlueView.xib,選中“Press me”按鈕,control-drag到File's owner釋放,在填出的框中選擇blueButtonPressed。
    打開YellowView.xib,選中“Press me”按鈕,control-drag到File's owner釋放,在填出的框中選擇yellowButtonPressed。

    13)編譯運(yùn)行
    至此我們已經(jīng)可以編譯運(yùn)行程序了,編譯成功后,iphone模擬器中顯示的效果(“Press me”按鈕的效果就不演示了)

    按下“Switch Views”按鈕,BlueSubview會(huì)切換到Y(jié)ellowSubview

    14)更炫的切換view的方法
    有沒有發(fā)現(xiàn)上面切換view效果很無聊,ios中有更炫的切換view的方法,使用動(dòng)畫的方式切換view,打開BIDSwitchViewController.m,重新編輯switchViews方法,如下

    復(fù)制代碼
    - (IBAction)switchViews:(id)sender {         [UIView beginAnimations:@"View Flip" context:nil];     [UIView setAnimationDuration:1.25];     [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];          if(self.yellowViewController.view.superview == nil) {         if(self.yellowViewController == nil) {             self.yellowViewController = [[BIDYellowViewController alloc] initWithNibName:@"YellowView" bundle:nil];         }         [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];         [blueViewController.view removeFromSuperview];         [self.view insertSubview:self.yellowViewController.view atIndex:0];     } else {         if (self.blueViewController ==nil) {             self.blueViewController = [[BIDBlueViewController alloc] initWithNibName:@"BlueView" bundle:nil];         }         [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];         [yellowViewController.view removeFromSuperview];         [self.view insertSubview:self.blueViewController.view atIndex:0];     }     [UIView commitAnimations]; }
    復(fù)制代碼

    [UIViewbeginAnimations:@"View Flip" context:nil];
    先可以不用理解這句話的意思,因?yàn)槲乙矝]有理解,反正這行代碼是聲明一個(gè)animation block,前一個(gè)參數(shù)是設(shè)置animation block的title,后一個(gè)參數(shù)是設(shè)置一個(gè)對(duì)象,我也搞不清楚是干什么的,大概在以后的學(xué)習(xí)中會(huì)有所了解。

    [UIViewsetAnimationDuration:1.25];
    設(shè)定動(dòng)畫時(shí)間,即切換view的時(shí)間

    [UIViewsetAnimationCurve:UIViewAnimationCurveEaseInOut];
    設(shè)定動(dòng)畫的運(yùn)動(dòng)方式,開始慢,中間快,最后慢,大家開始看ios自己的說明吧。(An ease-in ease-out curve causes the animation to begin slowly, accelerate through the middle of its duration, and then slow again before completing. This is the default curve for most animations.)

    [UIViewsetAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];
    設(shè)定切換的樣式,一共有4個(gè)值可以選:
    UIViewAnimationTransitionFlipFromRight
    UIViewAnimationTransitionFlipFromLeft
    UIViewAnimationTransitionFlipCurUp
    UIViewAnimationTransitionFlipCurDown
    這個(gè)大家自試試就可以知道了

    [UIViewcommitAnimations];
    當(dāng)所有動(dòng)畫的值設(shè)置完畢后,提交動(dòng)畫,之后view就會(huì)按照設(shè)定的動(dòng)畫進(jìn)行view的切換了。

    (此圖截于書本,因此不同清晰)

    15)總結(jié)
    ok,所有的功能都已經(jīng)完成了,在這個(gè)例子中,我們使用toolbar來完成對(duì)不同view的切換,我們需要一個(gè)root view進(jìn)行總的控制,然后多個(gè)subview進(jìn)行切換,最后還使用一個(gè)比較炫的效果進(jìn)行view之間的轉(zhuǎn)換,內(nèi)容很充實(shí)!

    View Switcher

    原文地址
    :http://www.cnblogs.com/minglz/archive/2012/12/11/2809368.html

    posted @ 2014-06-27 10:04 wokaoJune 閱讀(404) | 評(píng)論 (0)編輯 收藏

    常見Oracle HINT的用法

    在SQL語句優(yōu)化過程中,我們經(jīng)常會(huì)用到hint,現(xiàn)總結(jié)一下在SQL優(yōu)化過程中常見Oracle HINT的用法:
    1. /*+ALL_ROWS*/
    表明對(duì)語句塊選擇基于開銷的優(yōu)化方法,并獲得最佳吞吐量,使資源消耗最小化.
    例如:
    SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
    2. /*+FIRST_ROWS*/
    表明對(duì)語句塊選擇基于開銷的優(yōu)化方法,并獲得最佳響應(yīng)時(shí)間,使資源消耗最小化.
    例如:
    SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
    3. /*+CHOOSE*/
    表明如果數(shù)據(jù)字典中有訪問表的統(tǒng)計(jì)信息,將基于開銷的優(yōu)化方法,并獲得最佳的吞吐量;
    表明如果數(shù)據(jù)字典中沒有訪問表的統(tǒng)計(jì)信息,將基于規(guī)則開銷的優(yōu)化方法;
    例如:
    SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
    4. /*+RULE*/
    表明對(duì)語句塊選擇基于規(guī)則的優(yōu)化方法.
    例如:
    SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
    5. /*+FULL(TABLE)*/
    表明對(duì)表選擇全局掃描的方法.
    例如:
    SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='SCOTT';
    6. /*+ROWID(TABLE)*/
    提示明確表明對(duì)指定表根據(jù)ROWID進(jìn)行訪問.
    例如:
    SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE ROWID>='AAAAAAAAAAAAAA'
    AND EMP_NO='SCOTT';
    7. /*+CLUSTER(TABLE)*/
    提示明確表明對(duì)指定表選擇簇掃描的訪問方法,它只對(duì)簇對(duì)象有效.
    例如:
    SELECT /*+CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS
    WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
    8. /*+INDEX(TABLE INDEX_NAME)*/
    表明對(duì)表選擇索引的掃描方法.
    例如:
    SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS */ FROM BSEMPMS WHERE SEX='M';
    9. /*+INDEX_ASC(TABLE INDEX_NAME)*/
    表明對(duì)表選擇索引升序的掃描方法.
    例如:
    SELECT /*+INDEX_ASC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';
    10. /*+INDEX_COMBINE*/
    為指定表選擇位圖訪問路經(jīng),如果INDEX_COMBINE中沒有提供作為參數(shù)的索引,將選擇出位圖索引的布爾組合方式.
    例如:
    SELECT /*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ * FROM BSEMPMS
    WHERE SAL<5000000 AND HIREDATE<SYSDATE;
    11. /*+INDEX_JOIN(TABLE INDEX_NAME)*/
    提示明確命令優(yōu)化器使用索引作為訪問路徑.
    例如:
    SELECT /*+INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE
    FROM BSEMPMS WHERE SAL<60000;
    12. /*+INDEX_DESC(TABLE INDEX_NAME)*/
    表明對(duì)表選擇索引降序的掃描方法.
    例如:
    SELECT /*+INDEX_DESC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';
    13. /*+INDEX_FFS(TABLE INDEX_NAME)*/
    對(duì)指定的表執(zhí)行快速全索引掃描,而不是全表掃描的辦法.
    例如:
    SELECT /*+INDEX_FFS(BSEMPMS IN_EMPNAM)*/ * FROM BSEMPMS WHERE DPT_NO='TEC305';
    14. /*+ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,...*/
    提示明確進(jìn)行執(zhí)行規(guī)劃的選擇,將幾個(gè)單列索引的掃描合起來.
    例如:
    SELECT /*+INDEX_FFS(BSEMPMS IN_DPTNO,IN_EMPNO,IN_SEX)*/ * FROM BSEMPMS WHERE EMP_NO='SCOTT' AND DPT_NO='TDC306';
    15. /*+USE_CONCAT*/
    對(duì)查詢中的WHERE后面的OR條件進(jìn)行轉(zhuǎn)換為UNION ALL的組合查詢.
    例如:
    SELECT /*+USE_CONCAT*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';
    16. /*+NO_EXPAND*/
    對(duì)于WHERE后面的OR 或者IN-LIST的查詢語句,NO_EXPAND將阻止其基于優(yōu)化器對(duì)其進(jìn)行擴(kuò)展.
    例如:
    SELECT /*+NO_EXPAND*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';
    17. /*+NOWRITE*/
    禁止對(duì)查詢塊的查詢重寫操作.
    18. /*+REWRITE*/
    可以將視圖作為參數(shù).
    19. /*+MERGE(TABLE)*/
    能夠?qū)σ晥D的各個(gè)查詢進(jìn)行相應(yīng)的合并.
    例如:
    SELECT /*+MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELET DPT_NO
    ,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO
    AND A.SAL>V.AVG_SAL;
    20. /*+NO_MERGE(TABLE)*/
    對(duì)于有可合并的視圖不再合并.
    例如:
    SELECT /*+NO_MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELECT DPT_NO,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO AND A.SAL>V.AVG_SAL;
    21. /*+ORDERED*/
    根據(jù)表出現(xiàn)在FROM中的順序,ORDERED使ORACLE依此順序?qū)ζ溥B接.
    例如:
    SELECT /*+ORDERED*/ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C WHERE A.COL1=B.COL1 AND B.COL1=C.COL1;
    22. /*+USE_NL(TABLE)*/
    將指定表與嵌套的連接的行源進(jìn)行連接,并把指定表作為內(nèi)部表.
    例如:
    SELECT /*+ORDERED USE_NL(BSEMPMS)*/ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
    23. /*+USE_MERGE(TABLE)*/
    將指定的表與其他行源通過合并排序連接方式連接起來.
    例如:
    SELECT /*+USE_MERGE(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
    24. /*+USE_HASH(TABLE)*/
    將指定的表與其他行源通過哈希連接方式連接起來.
    例如:
    SELECT /*+USE_HASH(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
    25. /*+DRIVING_SITE(TABLE)*/
    強(qiáng)制與ORACLE所選擇的位置不同的表進(jìn)行查詢執(zhí)行.
    例如:
    SELECT /*+DRIVING_SITE(DEPT)*/ * FROM BSEMPMS,DEPT@BSDPTMS WHERE BSEMPMS.DPT_NO=DEPT.DPT_NO;
    26. /*+LEADING(TABLE)*/
    將指定的表作為連接次序中的首表.
    27. /*+CACHE(TABLE)*/
    當(dāng)進(jìn)行全表掃描時(shí),CACHE提示能夠?qū)⒈淼臋z索塊放置在緩沖區(qū)緩存中最近最少列表LRU的最近使用端
    例如:
    SELECT /*+FULL(BSEMPMS) CAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;
    28. /*+NOCACHE(TABLE)*/
    當(dāng)進(jìn)行全表掃描時(shí),CACHE提示能夠?qū)⒈淼臋z索塊放置在緩沖區(qū)緩存中最近最少列表LRU的最近使用端
    例如:
    SELECT /*+FULL(BSEMPMS) NOCAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;
    29. /*+APPEND*/
    直接插入到表的最后,可以提高速度.
    insert /*+append*/ into test1 select * from test4 ;
    30. /*+NOAPPEND*/
    通過在插入語句生存期內(nèi)停止并行模式來啟動(dòng)常規(guī)插入.
    insert /*+noappend*/ into test1 select * from test4 ;





    參考blog:http://blog.csdn.net/tianlesoftware/article/details/4969702

    posted @ 2014-06-16 17:31 wokaoJune 閱讀(245) | 評(píng)論 (0)編輯 收藏

    [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?

    WordPress是一套很方便的個(gè)人部落格系統(tǒng)架設(shè)軟體,免費(fèi)開放的原始碼,任何人都可以取得、修改、架設(shè)。但你知道嗎?其實(shí)WordPress除了個(gè)人部落格之外,其實(shí)還有另一個(gè)Project,就是「WordPress MU」。這個(gè)WordPress MU是多用戶的WordPress架設(shè)程式,架設(shè)成功的話就可以自己經(jīng)營BSP了,自己就像無名小站站長或是痞客邦這樣的部落格服務(wù)提供商,提供給有部落格需求的使用者使用。

    雖然知道的人不多,但現(xiàn)在更棒的是這個(gè)WordPress MU從WordPress3.0版開始直接整合到WordPress之中,算是一項(xiàng)隱藏功能,需要透過一個(gè)代碼才能啟用這項(xiàng)服務(wù),以往架設(shè)WordPress MU是要在額外架設(shè),現(xiàn)在完全不用了,直接在自己本來的部落格系統(tǒng)內(nèi)就可以啟用WordPress MU,有興趣的話趕快來喚醒沉睡的WordPress MU吧!

    目前全球最大的WordPress MU使用者就是WordPress.com這個(gè)免費(fèi)的WordPress免費(fèi)部落格服務(wù),這個(gè)網(wǎng)站就是由WordPress MU系統(tǒng)建立的,如果把WordPress MU經(jīng)營的好當(dāng)然就會(huì)像那樣囉!以往MU系統(tǒng)是額外獨(dú)立的專案,從3.0版的WordPress就把它整合進(jìn)來,不再成為一個(gè)獨(dú)立的專案程式了,現(xiàn)在任何WordPress的使用者都可以把自己的網(wǎng)站改裝成WordPress MU。

    WordPress MU被簡稱為「WPMU」,但全名其實(shí)是「WordPress Multi User」多用戶程式。這套程式之所以大家會(huì)很少聽到是因?yàn)閷?duì)於一般使用者來說,用途其實(shí)不大,因?yàn)榇蠹壹茉O(shè)網(wǎng)站都是獨(dú)立架設(shè)、擁有自己的網(wǎng)站,很少有人和別人共用一個(gè)網(wǎng)址,利用他的子網(wǎng)域或是子資料夾架設(shè)獨(dú)立的WordPress。

    那這套程式不就沒用了嗎?其實(shí)並不然。如果你有三五好友想要擁有一個(gè)部落格,但是不想要使用常見的BSP部落格,可是如果要自架,又不會(huì)改程式碼的話,又或是另一種情況,假若你有工作上的需要,需要架設(shè)多個(gè)WordPress,可是想要同一管理,這個(gè)WordPress MU就可以幫上忙了,因?yàn)樗梢蚤_通多個(gè)部落格,網(wǎng)站的設(shè)定統(tǒng)一由最大的管理者「超級(jí)管理」來處理,其他使用者只要負(fù)責(zé)使用就可以了,這樣一來對(duì)管理者來說管理輕鬆,對(duì)其他用戶來說也方便使用。

    • 程式名稱:WordPress MU
    • 官方網(wǎng)站:http://mu.wordpress.org/
    • 程式下載按這裡
    • 備註事項(xiàng):從WordPress3.0起整合於WordPress,所以直接下載WordPress。

    第1步 首先請(qǐng)您下載程式並進(jìn)行WordPress的安裝,詳細(xì)安裝過程這邊不多做說明,如果不會(huì)安裝請(qǐng)參考:如何架設(shè)安裝WordPress部落格?,先將WordPress架設(shè)起來。當(dāng)您的WordPress架設(shè)好後,請(qǐng)下載FTP內(nèi)的wp-config.php檔案,在檔案內(nèi)加入語法,避免加錯(cuò)位置,可在「/* 設(shè)定完成,請(qǐng)儲(chǔ)存檔案。然後開始 Blogging 吧! */」之上加入,儲(chǔ)存後將檔案上傳到FTP中。

      define('WP_ALLOW_MULTISITE', true);

    [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?

    第2步 重新整理部落格後臺(tái),點(diǎn)擊左方【工具】→「網(wǎng)誌網(wǎng)路」,進(jìn)入後請(qǐng)將網(wǎng)誌網(wǎng)路的標(biāo)題和聯(lián)絡(luò)信箱設(shè)定好,並點(diǎn)擊﹝安裝﹞。

    [請(qǐng)注意]

    如果您是從現(xiàn)有的部落格修改wp-config.php,想改裝成WordPress MU多用戶系統(tǒng),而非剛剛新架設(shè)的WordPress,那在子網(wǎng)域安裝部分無法設(shè)定,系統(tǒng)會(huì)強(qiáng)制您只能使用子目錄分類,來區(qū)分每個(gè)部落格。如果您是新架設(shè)的,那會(huì)出現(xiàn)子網(wǎng)域設(shè)定,請(qǐng)參考後面的教學(xué)說明。

    錯(cuò)誤訊息是:The main site in a sub-directory install will need to use a modified permalink structure, potentially breaking existing links.

    [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?

    第3步 一旦設(shè)定好後,就無法再變更網(wǎng)站結(jié)構(gòu)類型了。接著請(qǐng)按照畫面指示的訊息新增資料。

    [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?

    第4步 請(qǐng)開啟FTP連上網(wǎng)站後在「/public_html/wp-content」目錄下新建一個(gè)資料夾「blogs.dir」並設(shè)定資料夾屬性為「777」,因?yàn)檫@邊是要儲(chǔ)存用戶上傳的檔案。

    [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?

    第5步 接著請(qǐng)下載FTP根目錄中的「wp-config.php」請(qǐng)將WordPress後臺(tái)指示的資料加入倒wp-config.php的「/* 設(shè)定完成,請(qǐng)儲(chǔ)存檔案。然後開始 Blogging 吧! */」這句話之上,儲(chǔ)存然後上傳。

    語法可能如下,但不完全一樣。

    define('WP_ALLOW_MULTISITE', true); define( 'MULTISITE', true ); define( 'SUBDOMAIN_INSTALL', false );  $base = '/'; define( 'DOMAIN_CURRENT_SITE', 'wpblog.net.ru' ); define( 'PATH_CURRENT_SITE', '/' ); define( 'SITE_ID_CURRENT_SITE', 1 ); define( 'BLOG_ID_CURRENT_SITE', 1 );

    [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?

    第6步 接著請(qǐng)?jiān)賹TP上的「.htaccess」檔案下載,並根據(jù)WordPress後臺(tái)指示的說明將資料加入到「.htaccess」檔案中,設(shè)定好後請(qǐng)上傳。

    語法類似以下,但可能不完全一樣。

    RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] # uploaded files RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L] # add a trailing slash to /wp-admin RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] RewriteRule  ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L] RewriteRule  ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L] RewriteRule . index.php [L]

    [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?

    第7步 設(shè)定好後,請(qǐng)重新登入WordPress後臺(tái),如果啟動(dòng)成功進(jìn)入後就會(huì)看到左上角會(huì)多出一個(gè)「超級(jí)管理」,這就是WordPress MU的管理選項(xiàng),可以在那邊新增用戶、設(shè)定等等,因?yàn)樯?jí)成MU之後,原本的部落格也會(huì)屬於WordPress MU的一部分,所以在畫面中會(huì)多出限制用戶的儲(chǔ)存空間選項(xiàng),預(yù)設(shè)都是10MB的儲(chǔ)存空間,使用者可以自己調(diào)整。

    [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?

    第8步 點(diǎn)擊【超級(jí)管理】→﹝選項(xiàng)﹞可以對(duì)MU站點(diǎn)做設(shè)定,不過這有些部分的中文描述好像怪怪的,有點(diǎn)不通順就是了。設(shè)定上大家自己可以玩玩看囉!

    [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?

    第9步 點(diǎn)擊【超級(jí)管理】中的「網(wǎng)誌」則可以建立新網(wǎng)誌,就是開一個(gè)獨(dú)立的部落格,開設(shè)在子資料夾內(nèi)。輸入您要的網(wǎng)站名稱在網(wǎng)誌位址以及網(wǎng)誌標(biāo)題和該網(wǎng)誌站長的聯(lián)絡(luò)信箱就可以了,伺服器將會(huì)自動(dòng)寄信通知部落格使用者。

    [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?

    第10步 在網(wǎng)誌的清單中可以點(diǎn)擊您剛剛建立的部落格,點(diǎn)進(jìn)去後可以對(duì)部落格做一些設(shè)定與調(diào)整,當(dāng)然也可以保持預(yù)設(shè)不動(dòng)作。

    [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?

    第11步 建立好的部落格就像這樣子囉!

    [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?

    WordPress MU 設(shè)定子網(wǎng)域

    前面有提到,如果是新安裝的WordPress,那在您啟動(dòng)WordPress MU功能同時(shí),設(shè)定選項(xiàng)中會(huì)讓使用者選擇「子網(wǎng)域」或是「子目錄」。當(dāng)然設(shè)定成子網(wǎng)域會(huì)比較好看,網(wǎng)址感覺高級(jí)一點(diǎn),但相對(duì)的困難度也提高,因?yàn)樾枰獎(jiǎng)拥较到y(tǒng)設(shè)定檔案,目前網(wǎng)路上還沒有一個(gè)教學(xué)是針對(duì)「虛擬主機(jī)(Share Hosting)」,因?yàn)樾枰獎(jiǎng)拥较到y(tǒng)的阿帕契和DNS之類的設(shè)定,所以非常的麻煩。

    第1步 如果是新架設(shè)的WordPress,在啟動(dòng)MU功能時(shí),會(huì)在【工具】→「網(wǎng)誌網(wǎng)路」中看見「子網(wǎng)域」和「子目錄」的設(shè)定,請(qǐng)您選擇子網(wǎng)域進(jìn)行設(shè)定。請(qǐng)記住這邊一但選擇了網(wǎng)站架構(gòu),就不能進(jìn)行更改,如果強(qiáng)制更改原始碼,可能會(huì)出現(xiàn)無法意料的錯(cuò)誤。

    [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?

    第2步 接著WordPress會(huì)偵測(cè)您的空間是否有辦法自動(dòng)建立子網(wǎng)域,但在虛擬主機(jī)中,實(shí)驗(yàn)的結(jié)果都是會(huì)失敗的,因?yàn)橐话闶褂谜邲]有權(quán)限去調(diào)整伺服器的設(shè)定。以最常見的虛擬主機(jī)系統(tǒng)cPanel來說,用戶無法對(duì)其網(wǎng)址進(jìn)行變更,必須由cPanel管理者透過WHM內(nèi)的DNS功能進(jìn)行調(diào)整才行。如果您是自架主機(jī),基本上應(yīng)該就有權(quán)限可以設(shè)定,因此請(qǐng)先根據(jù)這頁面內(nèi)的資料把網(wǎng)站設(shè)定一下,這邊的設(shè)定就跟前面提到的部分是一樣的,因此就不多做說明。

    [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?

    第3步 接著就是設(shè)定伺服器或虛擬主機(jī)以及網(wǎng)址部份了。關(guān)於虛擬主機(jī)要設(shè)定的「Wildcard DNS Record」等等之類的,以下有幾篇教學(xué)可以參考看看:這裡這裡這裡。如果虛擬主機(jī)支援的話,只要到DNS代管站新增一筆A紀(jì)錄,然後網(wǎng)域部分請(qǐng)輸入通用符號(hào)「*」,然後再輸入IP並新增就可以了。

    大部分DNS代管站都可以,當(dāng)然仍是有可能不支援的,目前測(cè)試的GoDaddy是可以新增前面提到所謂的「Wildcard DNS Record」資料。

    You can create a wildcard A record by setting the Host Name value to “*" (asterisk). The wildcard causes the server to respond with the IP address specified instead of an error if the subdomain queried does not exist within your zone file.

    [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?

    第4步 設(shè)定好後,您可以自由的新增部落格,新增部落格的時(shí)候會(huì)發(fā)現(xiàn)網(wǎng)誌位址部分變成讓使用者輸入網(wǎng)域囉!

    以下展示網(wǎng)站為殺氣測(cè)試,使用H-Sphere空間作為測(cè)試!

    網(wǎng)域部落格http://tgcc.org.ru/

    網(wǎng)域部落格http://happy.tgcc.org.ru/

    [教學(xué)]如何架設(shè)WordPress MU 多用戶部落格?

    基本上設(shè)定就是這樣子而已,其實(shí)如果不使用子網(wǎng)域,一般虛擬主機(jī)都可以很輕鬆的啟用WordPress MU多用戶功能。不過有些人可能啟用會(huì)失敗,那就是主機(jī)不支援不支援固定網(wǎng)址的功能,您的Apache的「mod_rewrite」這個(gè)模組被禁用了,如果是個(gè)人用戶可以到系統(tǒng)檔案「httpd.conf」把分號(hào)去掉,如果是虛擬主機(jī)請(qǐng)聯(lián)絡(luò)管理員。

    如果你本身沒有多用戶需求,建議不要啟動(dòng)MU,因?yàn)閱?dòng)MU之後,部落格的資料庫會(huì)多一些資料表,每建立一個(gè)部落格,就會(huì)多出10多張的資料表。另外,啟動(dòng)MU之後系統(tǒng)資源也會(huì)吃比較重,因?yàn)榫偷褥对谝粋€(gè)網(wǎng)站上架設(shè)好幾個(gè)部落格在運(yùn)作,只是管理上比獨(dú)立架設(shè)方便,如果您有需要架設(shè)MU,最好要挑選一個(gè)限制比較少的虛擬主機(jī)來架設(shè),否則三天兩頭資源就吃完了,空間被停是早晚的事情。

    posted @ 2013-06-16 15:38 wokaoJune 閱讀(1896) | 評(píng)論 (1)編輯 收藏

    兩個(gè)WordPress共享同一個(gè)用戶數(shù)據(jù)庫表教程

    這兩天在全力設(shè)計(jì)東方設(shè)計(jì)圖庫頻道 期間嘗試了多種辦法來盡可能的與東方設(shè)計(jì)工作室主站集成在一起,起初嘗試了WordPress的Multisite功能,分別以Sub directory和Sub domain的形式分別各自試了一次,發(fā)覺,WP一旦開啟了Multisite以后結(jié)構(gòu)變得復(fù)雜了很多,而且不夠穩(wěn)定,數(shù)據(jù)庫表也一下子飆升了很多,顯得非常臃腫,顯然這個(gè)并不是我所要的效果,于是經(jīng)過整個(gè)周末的來回嘗試,最后放棄了Multisite的形式,還是全新安裝了一個(gè)WP,經(jīng)過反復(fù)調(diào)試,已經(jīng)初具模型,但是問題就是用戶也得重新注冊(cè)一次,這個(gè)顯然再次違背了我的初衷,經(jīng)過反復(fù)Google,終于找到了一個(gè)完美的解決方案,那就是兩個(gè)完全獨(dú)立的WordPress共享同一個(gè)數(shù)據(jù)表,堪稱完美,不敢獨(dú)享,現(xiàn)將教程共享給各位。

    因?yàn)閳D庫站新建的WP已經(jīng)搭建出來了,而這個(gè)集成必須是后邊這個(gè)WP需要在共享前一個(gè)數(shù)據(jù)庫的用戶表的基礎(chǔ)上全新安裝才可以實(shí)現(xiàn),而且兩個(gè)WP必須建在同一個(gè)數(shù)據(jù)庫里邊,這個(gè)問題不大,只要改變一下前綴即可,于是說干就敢。

    第一步、通過WP的工具》導(dǎo)出功能將已經(jīng)建立好的文章頁面等統(tǒng)統(tǒng)導(dǎo)出成一個(gè)XML文件;

    第二步、修改新建的WP的配置文件wp-config.php如下所示:

    $table_prefix = ‘blogb_’;

    修改數(shù)據(jù)庫表前綴為新的前綴,防止和第一個(gè)WP沖突,然后在同個(gè)文件里找到

    /* That’s all, stop editing! Happy blogging. */

    在這斷話上方插入:

    define(‘CUSTOM_USER_TABLE’, ‘wp_users’); define(‘CUSTOM_USER_META_TABLE’, ‘wp_usermeta’);

    注意這里的wp_users和wp_usermeta都是第一個(gè)WP的用戶數(shù)據(jù)表,這里我們假設(shè)第一個(gè)WP用了默認(rèn)的前綴;

    第三步、修改完配置文件以后,就可以開始安裝第二個(gè)WP,安裝過程不是本教程討論的范疇,因此略過;

    第四步、安裝完成你會(huì)發(fā)現(xiàn)可以直接用第一個(gè)WP網(wǎng)站的管理員直接登陸第二個(gè)WP網(wǎng)站后臺(tái),然后進(jìn)入工具》導(dǎo)入,將第一步導(dǎo)出的XML文件重新導(dǎo)入,然后進(jìn)行一些必要的配置即可。

    搞定收工,經(jīng)過測(cè)試非常完美,至此,在任意第一個(gè)或者第二個(gè)上新注冊(cè)的用戶,立馬可以直接用來登陸另外一個(gè)網(wǎng)站的后臺(tái),F(xiàn)antastic,所謂踏破鐵鞋無覓處、得來全不費(fèi)工夫,這幾天的忙活沒有白費(fèi),有了這個(gè)方法,理論上你可以設(shè)置任意多個(gè)獨(dú)立的WP系統(tǒng)共用同一個(gè)用戶數(shù)據(jù)表,有點(diǎn)類似于discuz的ucenter,但是這個(gè)顯然整合的更徹底,直接就是同一個(gè)表,不用擔(dān)心還需要再次同步的問題。

    posted @ 2013-06-15 19:53 wokaoJune 閱讀(2525) | 評(píng)論 (3)編輯 收藏

    兩種wordpress更換后臺(tái)登錄界面logo圖標(biāo)方

    wordpress網(wǎng)站后臺(tái)登陸界面有個(gè)Logo圖標(biāo),在自己的網(wǎng)站擺著官方的圖標(biāo),很多人看起來很不舒服,所以大家都希望更換掉這個(gè)圖標(biāo),為此,小編推薦兩種wordpress更換圖標(biāo)的方法:

    • 第一種方法:只需要把其原本調(diào)用的logo圖片替換為自己的logo圖片即可,具體步驟如下:

            準(zhǔn)備一張命名為logo-login.gif的背景透明的圖片大小規(guī)格為310px*70px

            在wordpress根目錄的wp-admin/images文件夾中找到logo-login.gif文件,

            用這張圖片覆蓋替換為自己準(zhǔn)備好的logo-login.gif圖片即可

            訪問后臺(tái)登陸界面,圖標(biāo)已更換。

            優(yōu)點(diǎn):簡單,快捷,適合新手使用;

            缺點(diǎn):更新升級(jí)版本時(shí)又得重新修改。

    • 第二種方法、在functions.php修改,具體步驟如下:

    1. 在主題函數(shù)文件functions.php中,添加如下一行,以修改鏈接地址:

      add_filter(‘login_headerurl’, create_function(false,’return get_bloginfo(‘siteurl’);”));

    2. 在主題函數(shù)文件functions.php中,添加如下一行,以修改鏈接地址的標(biāo)題提示:

      add_filter(‘login_headertitle’, create_function(false,”return get_bloginfo(‘description’);”));

    3. 在主題函數(shù)文件functions.php中,添加如下內(nèi)容,以修改由CSS控制顯示的鏈接圖片:

      function nowspark_login_head() {    echo ‘<style type=”text/css”>body.login #login h1 a {background:url(http://www.mengzhiyi.info/wp-content/themes/mengzhiyi/images/buttom_logo.gif) no-repeat 0 0 transparent;height: 31px;width: 155px;padding:0;margin:0 auto 1em;}</style>’;}add_action(“login_head”, “nowspark_login_head”);//modify the background image

    4. 將url中鏈接修改為你自己的鏈接即可!

    優(yōu)點(diǎn):更新版本無需重新更改,更改圖片的同時(shí)把鏈接地址和標(biāo)題提示也同時(shí)修改掉了;(本站推薦使用方法)

    參考資料

    posted @ 2013-06-09 19:57 wokaoJune 閱讀(292) | 評(píng)論 (0)編輯 收藏

    Rails 更改和驗(yàn)證相關(guān)的錯(cuò)誤顯示消息

    http://pragprog.com/wikis/wiki/RailsPlayTime 

    posted @ 2013-04-21 15:22 wokaoJune 閱讀(216) | 評(píng)論 (0)編輯 收藏

    Rails 305安裝以及Rake版本修改

    http://wenku.baidu.com/view/e18f5cd3b14e852458fb5761.html### 

    posted @ 2013-04-20 21:39 wokaoJune 閱讀(256) | 評(píng)論 (0)編輯 收藏

    gem update --system 302 錯(cuò)誤 解決方案(轉(zhuǎn))

    具體過程如下: 

    1、InstantRails-2.0安裝后,在配置環(huán)境變量path中配置ruby/bin目錄(如果系統(tǒng)中有多個(gè)RUBY,執(zhí)行命令行的時(shí)候系統(tǒng)認(rèn)的就是path中的) 

    2、進(jìn)入DOS命令行,執(zhí)行g(shù)em update --system,結(jié)果 

    Updating RubyGems... 
    ERROR:  While executing gem ... (Gem::RemoteSourceException) 
    HTTP Response 302 fetching http://rubygems.org/yaml 

         這是因?yàn)間em的配置過低,無法進(jìn)行遠(yuǎn)程更新,執(zhí)行g(shù)em -v 發(fā)現(xiàn)是1.0.1 

    3、從下面這個(gè)地址下載 rubygems-update-1.3.7.gem,http://rubyforge.org/frs/download.php/70695/rubygems-update-1.3.7.gem 

        然后DOS命令進(jìn)行該文件所在的目錄,執(zhí)行g(shù)em install --local rubygems-update-1.3.7.gem,出現(xiàn)信息 

    Successfully installed rubygems-update-1.3.7 
    1 gem installed 
    Installing ri documentation for rubygems-update-1.3.7... 
    Installing RDoc documentation for rubygems-update-1.3.7... 
    Could not find main page README 
    Could not find main page README 
    Could not find main page README 
    Could not find main page README 

      執(zhí)行g(shù)em -v查看,發(fā)現(xiàn)并沒有更新成功,Could not find main page README是什么意思我沒弄明白,但是我從http://production.s3.rubygems.org/yaml上發(fā)現(xiàn)這么一句 

          If you have an older version of RubyGems installed, then you can still 
          do it in two steps: 
         
            $ gem install rubygems-update  # again, might need to be admin/root 
            $ update_rubygems              # ... here too 
    我照著再執(zhí)行 update_rubygems,接著出現(xiàn)的信息很多,就不帖出來,再執(zhí)行g(shù)em -v,發(fā)現(xiàn)更新成功,已經(jīng)是1.3.7了 

    這一步是一切成功的源泉!!!!!! 

    4、接著再執(zhí)行g(shù)em update --system,提示 

    Updating RubyGems 
    Nothing to update 

      這是為什么我不明白,請(qǐng)高手指點(diǎn)一下 

    5、再執(zhí)行g(shù)em update rails --include-dependencies,提示信息 

    Updating installed gems 
    Updating rails 
    ERROR:  Error installing rails: 
            actionpack requires rack (~> 1.0.0, runtime) 
    Gems updated: activesupport, activerecord 
    Installing ri documentation for activesupport-2.3.3... 
    Installing ri documentation for activerecord-2.3.3... 
    Installing RDoc documentation for activesupport-2.3.3... 
    Installing RDoc documentation for activerecord-2.3.3... 

    執(zhí)行rails -v,發(fā)現(xiàn)還是2.0.2沒有更新成功,根據(jù)actionpack requires rack (~> 1.0.0, runtime),應(yīng)該是actionpack 需要1.0.0版本的rack 

    6、執(zhí)行g(shù)em install rack -v=1.0.0 

    Successfully installed rack-1.0.0 
    1 gem installed 
    Installing ri documentation for rack-1.0.0... 
    Installing RDoc documentation for rack-1.0.0... 

    更新成功 

    7、再次執(zhí)行 gem update rails --include-dependencies 

    出現(xiàn)信息 

    Updating installed gems 
    Updating rails 
    Successfully installed rake-0.8.7 
    Successfully installed activesupport-2.3.8 
    Successfully installed activerecord-2.3.8 
    Successfully installed rack-1.1.0 
    Successfully installed actionpack-2.3.8 
    Successfully installed actionmailer-2.3.8 
    Successfully installed activeresource-2.3.8 
    Successfully installed rails-2.3.8 
    Gems updated: rake, activesupport, activerecord, rack, actionpack, actionmailer, activeresource, rails 
    Installing ri documentation for rake-0.8.7... 
    Installing ri documentation for activesupport-2.3.8... 
    Installing ri documentation for activerecord-2.3.8... 
    Installing ri documentation for rack-1.1.0... 
    Installing ri documentation for actionpack-2.3.8... 
    Installing ri documentation for actionmailer-2.3.8... 
    Installing ri documentation for activeresource-2.3.8... 
    Installing ri documentation for rails-2.3.8... 
    Installing RDoc documentation for rake-0.8.7... 
    Installing RDoc documentation for activesupport-2.3.8... 
    Installing RDoc documentation for activerecord-2.3.8... 
    Installing RDoc documentation for rack-1.1.0... 
    Installing RDoc documentation for actionpack-2.3.8... 
    Installing RDoc documentation for actionmailer-2.3.8... 
    Installing RDoc documentation for activeresource-2.3.8... 
    Installing RDoc documentation for rails-2.3.8... 

    執(zhí)行rails -v,發(fā)現(xiàn)已更新成功 



    總結(jié):rails更新有兩種方式:1、聯(lián)機(jī)更新;2本地更新 

    聯(lián)機(jī)更新過程中如果出現(xiàn)HTTP Response 302 fetching http://rubygems.org/yaml無法更新,有兩種情況 

    一是gem的版本過低,二是與服務(wù)器的連接不通 

    此時(shí)可以試著加入其他服務(wù)器地址 

    gem source -l  查看列表 

    gem source -a http://rubygems.org 加入新的服務(wù)器地址 

    或者直接gem install rubygems-update --source http://rubygems.org 

    本地更新需要下載相應(yīng)的gem包,版本需與要更新的rails版本對(duì)應(yīng),同時(shí)安裝順序有要求,因此gem包之間有依賴關(guān)系 

    順序從上面的顯示信息中可以看出來 

    Successfully installed rake-0.8.7 
    Successfully installed activesupport-2.3.8 
    Successfully installed activerecord-2.3.8 
    Successfully installed rack-1.1.0 
    Successfully installed actionpack-2.3.8 
    Successfully installed actionmailer-2.3.8 
    Successfully installed activeresource-2.3.8 
    Successfully installed rails-2.3.8 

    至于gem包的下載地址都在http://rubyforge.org/,但是有些項(xiàng)目的并不好找到,可以在google中直接搜索,就能找到在http://rubyforge.org/中的地址。

    posted @ 2013-02-05 14:13 wokaoJune 閱讀(2825) | 評(píng)論 (0)編輯 收藏

    【Oracle】極限挑戰(zhàn)—C#+ODP 100萬條數(shù)據(jù)導(dǎo)入Oracle數(shù)據(jù)庫僅用不到1秒

         摘要: 作者: Aicken(李鳴)  來源: 博客園  發(fā)布時(shí)間: 2010-09-09 21:32  閱讀: 1021 次  原文鏈接   全屏閱讀  [收藏]  摘要:在這里我們將看到的是C#中利用ODP實(shí)現(xiàn)在Oracle數(shù)據(jù)庫中瞬間導(dǎo)入百萬...  閱讀全文

    posted @ 2011-08-26 14:48 wokaoJune 閱讀(884) | 評(píng)論 (0)編輯 收藏

    【Oracle】SQL優(yōu)化34條

         摘要: 我們要做到不但會(huì)寫SQL,還要做到寫出性能優(yōu)良的SQL,以下為筆者學(xué)習(xí)、摘錄、并匯總部分資料與大家分享! (1)選擇最有效率的表名順序(只在基于規(guī)則的優(yōu)化器中有效): ORACLE 的解析器按照從右到左的順序處理FROM子句中的表名,F(xiàn)ROM子句中寫在最后的表(基礎(chǔ)表 driving table)將被最先處理,在FROM子句中包含多個(gè)表的情況下,你必須選擇記錄條數(shù)最少的表作為基...  閱讀全文

    posted @ 2011-08-26 11:28 wokaoJune 閱讀(414) | 評(píng)論 (0)編輯 收藏

    【Oracle】Oracle Pl/sql 配置備忘錄

    PL/SQL配置:

    注意:請(qǐng)下載最新的oracle instant客戶端..有些pl/sql Developer不支持老版本的..

    還有種情況是原來裝過oracle客戶端..再用pl/sql的..配置的客戶端地址可能不起效果..需要確定pl/sql指定的oracle目錄到底是那個(gè)

    可以通過連接不存在的 數(shù)據(jù)庫sid...彈出錯(cuò)誤中可以顯示  找不到d:\oracleclient\tnsname.ora

    如果提示找不到相關(guān)sid的...表示設(shè)置成功..只是讀取的tnsname.ora文件是舊的客戶端文件...

    配置PL/SQL的oracle的目錄位置,或者client的位置: 

                        tool-->preferences-->connection-->oracle home 

    搜索出tnsnames.ora文件(此文件是oracle數(shù)據(jù)庫的文件不是PL/SQL的) 并添加下面代碼 
    XLSGRID = (DESCRIPTION = 
    (ADDRESS_LIST = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = www.xls.net)(PORT = 1521))  

    (CONNECT_DATA = 
    (SERVICE_NAME = ORCL) 

      )//服務(wù)器上的 
    XE = 
    (DESCRIPTION = 
      (ADDRESS = (PROTOCOL = TCP)(HOST = foolraty-7e652c)(PORT = 1521)) 
    (CONNECT_DATA = 
    (SERVER = DEDICATED) 
    (SERVICE_NAME = XE) 

      )//本地的 
    登錄PL/SQL后,數(shù)據(jù)庫中的數(shù)據(jù)在PL/SQL,左邊object里的tablespace -&gt;user里 

    了解Oracle Database Instant Client的作用,需要通過它進(jìn)行oracle數(shù)據(jù)庫連接開發(fā),也可以用PL/SQL通過它的tnsnames.ora配置遠(yuǎn)程連接oracle 





    免安裝Oracle客戶端使用PL/SQL連接Oracle  
    大家都知道,用PL/SQL連接Oracle,是需要安裝Oracle客戶端軟件的。有沒要想過不安裝Oracle客戶端直接連接Oracle呢? 

    其實(shí)我一直想這樣做,因?yàn)檫@個(gè)客戶端實(shí)在太讓人討厭了!!!不但會(huì)安裝一個(gè)JDK,而且還會(huì)把自己放在環(huán)境變量的最前面,會(huì)造成不小的麻煩。 

    其實(shí)我之前問過很多人的,但是他們都說一定需要安裝Oracle客戶端的.......直到昨天無意中發(fā)現(xiàn)了以下這個(gè)方法: 

    只需要在Oracle下載一個(gè)叫Instant Client Package的軟件就可以了,這個(gè)軟件不需要安裝,只要解壓就可以用了,很方便,就算重裝了系統(tǒng)還是可以用的。 

    下載地址:http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/winsoft.html 

    下載這個(gè),Instant Client Package - Basic包。然后解壓到任意目錄,在這個(gè)目錄下建立NETWORK文件夾,接著再這個(gè)文件夾下再建立ADMIN文件夾,然后建立tnsnames.ora文件,內(nèi)容如下: 

    oracledata = 
    (DESCRIPTION = 
    (ADDRESS_LIST = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = yourhostIp )(PORT = 1521)) 

    (CONNECT_DATA = 
    (SERVICE_NAME = yourSID ) 


    這里根據(jù)自己的實(shí)際情況配置。接著打開PL/SQL,在perference里面設(shè)置OCI Library和Oracle_home,我的設(shè)置是OCI Library=c:\oracleclient\oci.dll,Oracle_home=c:\oracleclient。 

      根據(jù)自己的實(shí)際情況配置,其實(shí)就是剛才下載下來的那個(gè)包的路徑。 

    原文連接:http://www.bootad.cn/post/185.html 







    oracle字符集   
    詳細(xì)信息可以google搜索:"subset-superset pairs site:oracle.com"


    設(shè)置window的字符集:regedit-&gt;HKEY_LOCAL_MACHINE-&gt;SOFTWARE-&gt;ORACLE-&gt;HOMEO-&gt;NLS_LANG 
    windows本身:SIMPLIFIED 
    AMERICAN_AMERICA.ZHS16GBK 

    在DOS下查看字符集:echo %NLS_LANG% 


    在不同數(shù)據(jù)庫做數(shù)據(jù)遷移、同其它系統(tǒng)交換數(shù)據(jù)等,常常因?yàn)樽址煌鴮?dǎo)致遷移失敗或數(shù)據(jù)庫內(nèi)數(shù)據(jù)變成亂碼。現(xiàn)在我將oracle字符集相關(guān)的一些知識(shí)做個(gè)簡單總結(jié) 

    一、什么是oracle字符集 

    Oracle字符集是一個(gè)字節(jié)數(shù)據(jù)的解釋的符號(hào)集合,有大小之分,有相互的包容關(guān)系。ORACLE 支持國家語言的體系結(jié)構(gòu)允許你使用本地化語言來存儲(chǔ),處理,檢索數(shù)據(jù)。它使數(shù)據(jù)庫工具,錯(cuò)誤消息,排序次序,日期,時(shí)間,貨幣,數(shù)字,和日歷自動(dòng)適應(yīng)本地化語言和平臺(tái)。 

    影響oracle數(shù)據(jù)庫字符集最重要的參數(shù)是NLS_LANG參數(shù)。它的格式如下: 

    NLS_LANG = language_territory.charset 

    它有三個(gè)組成部分(語言、地域和字符集),每個(gè)成分控制了NLS子集的特性。其中: 

    Language 指定服務(wù)器消息的語言,territory 指定服務(wù)器的日期和數(shù)字格式,charset 指定字符集。如:AMERICAN _ AMERICA. ZHS16GBK 

    從NLS_LANG的組成我們可以看出,真正影響數(shù)據(jù)庫字符集的其實(shí)是第三部分。所以兩個(gè)數(shù)據(jù)庫之間的字符集只要第三部分一樣就可以相互導(dǎo)入導(dǎo)出數(shù)據(jù),前面影響的只是提示信息是中文還是英文。 

    二、如何查詢Oracle的字符集 

    很多人都碰到過因?yàn)樽址煌箶?shù)據(jù)導(dǎo)入失敗的情況。這涉及三方面的字符集,一是oracel server端的字符集,二是oracle client端的字符集;三是dmp文件的字符集。在做數(shù)據(jù)導(dǎo)入的時(shí)候,需要這三個(gè)字符集都一致才能正確導(dǎo)入。 

    1、查詢oracle server端的字符集 

    有很多種方法可以查出oracle server端的字符集,比較直觀的查詢方法是以下這種: 

    SQL&gt;select userenv(‘language’) from dual; 

    結(jié)果類似如下:AMERICAN _ AMERICA. ZHS16GBK 

    2、如何查詢dmp文件的字符集 

    用oracle的exp工具導(dǎo)出的dmp文件也包含了字符集信息,dmp文件的第2 和第3個(gè)字節(jié)記錄了dmp文件的字符集。如果dmp文件不大,比如只有幾M或幾十M,可以用UltraEdit打開(16進(jìn)制方式),看第2第3個(gè)字節(jié)的內(nèi)容,如0354,然后用以下SQL查出它對(duì)應(yīng)的字符集: 

    SQL&gt; select nls_charset_name(to_number('0354','xxxx')) from dual; 

    ZHS16GBK 

    如果dmp文件很大,比如有2G以上(這也是最常見的情況),用文本編輯器打開很慢或者完全打不開,可以用以下命令(在unix主機(jī)上): 

    cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6 

    然后用上述SQL也可以得到它對(duì)應(yīng)的字符集。 

    3、查詢oracle client端的字符集 

    這個(gè)比較簡單。在windows平臺(tái)下,就是注冊(cè)表里面相應(yīng)OracleHome的NLS_LANG。還可以在dos窗口里面自己設(shè)置,比如: 

    set nls_lang=AMERICAN_AMERICA.ZHS16GBK 

    這樣就只影響這個(gè)窗口里面的環(huán)境變量。 

    在unix平臺(tái)下,就是環(huán)境變量NLS_LANG。 

    $echo $NLS_LANG 


    AMERICAN_AMERICA.ZHS16GBK 

    如果檢查的結(jié)果發(fā)現(xiàn)server端與client端字符集不一致,請(qǐng)統(tǒng)一修改為同server端相同的字符集。 

    三、修改oracle的字符集 

    上文說過,oracle的字符集有互相的包容關(guān)系。如us7ascii就是 zhs16gbk的子集,從us7ascii到zhs16gbk不會(huì)有數(shù)據(jù)解釋上的問題,不會(huì)有數(shù)據(jù)丟失。在所有的字符集中utf8應(yīng)該是最大,因?yàn)樗趗nicode,雙字節(jié)保存字符(也因此在存儲(chǔ)空間上占用更多)。 
    一旦數(shù)據(jù)庫創(chuàng)建后,數(shù)據(jù)庫的字符集理論上講是不能改變的。因此,在設(shè)計(jì)和安裝之初考慮使用哪一種字符集十分重要。根據(jù)Oracle的官方說明,字符集的轉(zhuǎn)換是從子集到超集受支持,反之不行。如果兩種字符集之間根本沒有子集和超集的關(guān)系,那么字符集的轉(zhuǎn)換是不受oracle支持的。對(duì)數(shù)據(jù)庫server而言,錯(cuò)誤的修改字符集將會(huì)導(dǎo)致很多不可測(cè)的后果,可能會(huì)嚴(yán)重影響數(shù)據(jù)庫的正常運(yùn)行,所以在修改之前一定要確認(rèn)兩種字符集是否存在子集和超集的關(guān)系。一般來說,除非萬不得已,我們不建議修改oracle數(shù)據(jù)庫server端的字符集。特別說明,我們最常用的兩種字符集ZHS16GBK和ZHS16CGB231280之間不存在子集和超集關(guān)系,因此理論上講這兩種字符集之間的相互轉(zhuǎn)換不受支持。 

    1、修改server端字符集(不建議使用) 

    在oracle 8之前,可以用直接修改數(shù)據(jù)字典表props$來改變數(shù)據(jù)庫的字符集。但oracle8之后,至少有三張系統(tǒng)表記錄了數(shù)據(jù)庫字符集的信息,只改props$表并不完全,可能引起嚴(yán)重的后果。正確的修改方法如下: 

    $sqlplus /nolog 


    SQL&gt;conn / as sysdba; 

    若此時(shí)數(shù)據(jù)庫服務(wù)器已啟動(dòng),則先執(zhí)行SHUTDOWN IMMEDIATE命令關(guān)閉數(shù)據(jù)庫服務(wù)器,然后執(zhí)行以下命令: 

    SQL&gt;STARTUP MOUNT; 

    SQL&gt;ALTER SYSTEM ENABLE RESTRICTED SESSION; 

    SQL&gt;ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; 


    SQL&gt;ALTER SYSTEM SET AQ_TM_PROCESSES=0; 

    SQL&gt;ALTER DATABASE OPEN; 

    SQL&gt;ALTER DATABASE CHARACTER SET ZHS16GBK; 

    SQL&gt;ALTER DATABASE national CHARACTER SET ZHS16GBK; 

    SQL&gt;SHUTDOWN IMMEDIATE; 

    SQL&gt;STARTUP 

    2、修改dmp文件字符集 

    上文說過,dmp文件的第2第3字節(jié)記錄了字符集信息,因此直接修改dmp文件的第 2第3字節(jié)的內(nèi)容就可以‘騙’過oracle的檢查。這樣做理論上也僅是從子集到超集可以修改,但很多情況下在沒有子集和超集關(guān)系的情況下也可以修改,我們常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因?yàn)楦牡闹皇莇mp 文件,所以影響不大。 

    具體的修改方法比較多,最簡單的就是直接用UltraEdit修改dmp文件的第2和第3個(gè)字節(jié)。比如想將dmp文件的字符集改為ZHS16GBK,可以用以下SQL查出該種字符集對(duì)應(yīng)的16進(jìn)制代碼: 

    SQL&gt; select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual; 


    0354 

    然后將dmp文件的2、3字節(jié)修改為0354即可。 

    如果dmp文件很大,用ue無法打開,就需要用程序的方法了。網(wǎng)上有人用java存儲(chǔ)過程寫了轉(zhuǎn)換的程序(用java存儲(chǔ)過程的好處是通用性教好,缺點(diǎn)是比較麻煩)。我在windows下測(cè)試通過。但要求oracle數(shù)據(jù)庫一定要安裝 JVM選項(xiàng)。有興趣的朋友可以研究一下程序代碼 



                                 關(guān)閉Oracle 開機(jī)自動(dòng)啟動(dòng): 

    在你的管理--- 服務(wù)---找到orcl的所有服務(wù).屬性改成手機(jī)的就行了.想用的話只要起二個(gè)服務(wù).一個(gè)是server,一個(gè)是tns服務(wù). 



    windows下Orcale查詢結(jié)果中文顯示?亂碼問題  

    還有最后一個(gè)問題,需要設(shè)置一個(gè)字符集,這樣查詢出來的數(shù)據(jù)才不會(huì)是亂碼,寫一個(gè)批處理pldev. bat放到pl安裝目錄下,內(nèi)容如下: 

    set nls_lang=SIMPLIFIED CHINESE_CHINA.ZHS16GBK 
    PLSQLDev.exe 

    這個(gè)字符集,指的是服務(wù)器端的字符集,請(qǐng)根據(jù)實(shí)際情況配置。 

    或者: 

    posted @ 2011-06-29 14:28 wokaoJune 閱讀(1086) | 評(píng)論 (0)編輯 收藏

    <2011年6月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789

    導(dǎo)航

    統(tǒng)計(jì)

    公告

    GO ,GO,GO
    自己選擇的路,摸爬滾打也要走下去

    常用鏈接

    留言簿

    隨筆分類(26)

    隨筆檔案(29)

    文章分類

    最新隨筆

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲AⅤ无码一区二区三区在线| 亚洲人成人无码网www电影首页| 成人亚洲国产精品久久| 久久精品国产亚洲Aⅴ香蕉 | 亚洲一卡二卡三卡四卡无卡麻豆 | 亚洲成AV人片在线观看无| 国产国产人免费视频成69堂| 国产亚洲精品免费| 亚洲成人精品久久| 国产一级一片免费播放i| 久久久高清日本道免费观看| 亚洲色成人WWW永久在线观看| 在线亚洲97se亚洲综合在线| 国产免费av片在线看| 91视频精品全国免费观看| 亚洲一区二区三区在线网站| 国产啪亚洲国产精品无码| 日韩版码免费福利视频| xxxxx做受大片在线观看免费| 亚洲一区中文字幕在线电影网| 亚洲国产成人久久综合区| 午夜性色一区二区三区免费不卡视频| 曰批全过程免费视频免费看 | 精品人妻系列无码人妻免费视频| 亚洲AV无码一区二区三区在线| 精品国产人成亚洲区| 老司机永久免费网站在线观看| 久久精品免费视频观看| 日韩大片在线永久免费观看网站| 亚洲综合色一区二区三区| 亚洲另类激情综合偷自拍图| 国产免费131美女视频| 999国内精品永久免费观看| 91成人免费观看在线观看| 国产尤物在线视精品在亚洲| 亚洲av无码久久忘忧草| 亚洲毛片在线观看| 亚洲午夜福利717| 亚洲精品和日本精品| 国产无遮挡裸体免费视频| 国产乱码免费卡1卡二卡3卡|