精华内容
下载资源
问答
  • 利用列标题对列表视图进行数据排序 利用列标题对列表视图进行数据排序 利用列标题对列表视图进行数据排序
  • Oracle之数据字典、空间、的操作、视图

    知识点引用:

    http://www.2cto.com/database/201207/142874.html
    http://blog.csdn.net/haiross/article/details/11772847

    一. 彻底卸载Oracle

    方式1、重装操作系统

    方式2、

    2.1 DBCA删除数据库
       开始 → 程序 → Oracle → 开发与移植工具 → Database Configuration Assistant → 下一步 → 删除数据库(系统会同时删除OracleService+SID)
    
    2.2 Oracle Universal Installer 删除Oracle一部分组件
       开始 → 程序 → Oracle →  Oracle Installation Products → Universal Installer → 卸载产品
    
    2.3 手动删除Oracle的其他组件
        2.3.1 Oracle注册表
           运行 → regedit → 搜索(ctrl + F) → 删除以以下单词开头的文件inst_loc、ora、oracle、orcl、enumora
        2.3.2 环境变量
           path、classpath、oracle_home、oracle_sid、tns_admin等
        2.3.3 重启操作系统
        2.3.4 删除安装目录
           inst_loc 所在位置
           C:\Users\user\AppData\Local\Temp
        2.3.5 删除启动菜单
    

    二. 数据字典(Data Dactionary)

    存放于system表空间,Oracle数据库的核心组成部分,主要作用是存放数据库相关的信息,存储的信息主要包括:用户信息、表空间、数据文件信息、数据库对象(表、视图、序列、存储过程等)、权限、角色信息、完整性约束信息、以及其他与数据库相关的信息。数据字典的组成部分主要有一些表和一些视图,创建数据库是Oracle会自动创建。

    其中表是真正存放数据的地方。数据以加密的形式存在,数据不需要用户维护,用户也无权操作,由Oracle自己维护。

    视图是在表的基础上创建的,数据来源于表,加工处理后形成自己的数据。当表中的数据信息发生改变时,视图数据会自动发生改变。下面列举一些常用的视图:

    视图的名称规律如下:
        user_xxx 当前用户可以访问,当前用户相关的数据
        dba_xxx 只有dba用户可以访问,所有用户相关的数据
        all_xxx 有权限访问的用户可以访问,有权限访问的用户相关的数据
    
    常用的视图
         user_tables 当前用户的表信息
         dba_tables 所有用户的表信息
         user_sys_privs 当前用户的系统权限
         user_role_privs 当前用户的角色
         role_sys_privs 角色权限信息
         dictionary | dict 提供了数据字典中所有视图的描述
         dba_sys_privs 所有用户的系统权限
         dba_role_privs 所有用户的角色
         user_users 当前用户的信息
         dba_users 所有用户的信息
    
    oracle中,创建视图的基本方式是:
        create or replace view  视图名称  as  + 查询语句
    
    用sql语句查看oracle视图创建语句:
    
        1.查看所有视图的名字
        select view_name from all_views; 或者select view_name from user_views;
    
        2.查看某视图名为“某某视图”的创建语句
        select text from all_views where view_name = '某某视图';
    

    对象本身的信息都是存放在数据字典中,表的结构信息是放在数据字典中的,表的数据放在默认或指定的表空间下的数据文件中。

    附录一:Oracle语句练习

    三、表空间(tablespace)

    代码实例详见附录二

    数据库指的就是一些文件,文件在硬盘上,一个数据库由若干个表空间组成,一个表空间由若干个数据文件组成,一个数据文件由若干个分区组成。其中分区(extend)为逻辑结构,人为虚构的,一个分区是数据我文件中一段连续的存储空间。数据文件(datafiles)是数据的物理载体,后缀名为.dbf,数据库中的所有数据都存放在数据文件中,数据文件不可以过大,过大会影响数据的存取性能。

    表空间是逻辑结构,并不是物理分割成的,数据库创建的时候,自动创建:
    系统表空间system:数据字典使用的就是该表空间
    零食表空间temp:主要用于排序

    创建自定义表空间
        create tablespace 表空间名 datafile 'D://myfile.dbf(数据文件路径)' size xM(文件大小),… extent management local uniform size yM(容量大小);
        datafile 用于指定创建的表空间下的数据文件
        extent manager local 用于指定表空间的管理为本地管理,要求分区,大小一致
        uniform 用于指定分区的统一大小
    
    查找某张表使用的表空间
       select tablespace_name from user_tables where table_name = '表名';
       select tablespace_name from dba_tables where table_name = '表名';
    
    查找默认表空间'USERS'有哪些文件
       select file_name from dba_data_files where tablespace_name = 'USERS';
    
    查找用户的默认表空间
       select default_tablespace from user_users; 当前用户
       select default_tablespace from dba_users; 所有dba用户
    
    扩充表空间
       alter tablespace 表空间名 add datafile '数据文件路径' size xxM(大小);
    
    创建用户的时指定表空间
       create user username identified by password [account lock | unlock][password expire(设置密码过期)][default tablespace 表空间名];
    default tablespace 表空间名:该用户创建的所有对象的数据都将存放在该表空间下
    表空间中的文件
       *.dbf DatabaseFile :数据文件 
       *.ctl Control :控制文件
       *.log :重做日志文件

    四、SQL(Structured Query Language)

    SQL(Structured Query Language)即结构化查询语句,应用程序与数据库交互的接口,集数据操作、数据定义、数据控制等功能于一体,ANSI先后制定推出了SQL-89、SQL-92、SQL-99标准。
    Oracle SQL 语句主要分为一下四类:
    DML(Data Mannipulation Language)数据操纵语言:查询、操纵数据表资料行

          SELECT : 检索数据库表或视图数据 
    
          INSERT :  将数据行新增至数据库表或视图中
    
          UPDATE : 修改表或视图中现有的数据行
    
          DELETE : 删除表或视图中现有的数据行
    

    注意:DML语句不会自动提交事务!

    DDL(Data Definition Language)数据定义语言:建立、修改、删除数据库中数据表对象

         CREATE TABLE : 创建表 
    
         ALTER TABLE : 修改表
    
         DROP TABLE : 删除表
    

    注意:DLL语句会自动提交事务!所以:DML语句事务提交之前可以回滚,DDL语句不能回滚事务

    DCL(Data Control Language)数据控制语言:用于执行权限授予与收回操作

        GRANT : 给用户或角色授予权限
    
        REVOKE : 收回用户或角色的所有权限
    

    TCL(Transactional Control Language)事物控制语言:维护数据的一致性

       COMMIT :提交已经进行的数据库改变
    
       ROLLBACK : 回滚已经进行的数据改变
    
       SAVEPOINT : 设置保存点,用于部分数据改变的取消
    
      其中SQL关键字不区分大小写,对象名与列名不区分大小写,字符串值区分大小写,即''里面的内容区分大小写
    
      注意:数据字典自动将数据转换成大写
    
      SQL语句运行的过程:
          客户端把SQL语句发送到服务端,服务器对SQL进行编译,执行,服务器把执行结果再发挥给客户端
    
    
    

    五、表的创建

    Oracle数据库中创建表语句(Create table)语法详解及示例详见:http://blog.csdn.net/haiross/article/details/11772847

    1、创建表基本语法:
    create table 表名(列定义列表) [tablespace 表空间名];
    列表定义: 至少要有一列定义(列名 类型)

    创建表:
    CREATE TABLE DEPT(
    EPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
    DNAME VARCHAR2(14),
    LOC VARCHAR2(13)) ;
    CREATE TABLE region(
    ID number(2) NOT NULL PRIMARY KEY,
    postcode number(6) default '0' NOT NULL,
    areaname varchar2(30) default ' ' NOT NULL);

    2、创建表时的命名规则和注意事项

        1)表名和字段名的命名规则:必须以字母开头,可以含符号A-Z,a-z,0-9,_,$,#
        2)大小写不区分
        3)不用SQL里的保留字, 一定要用时可用双引号把字符串括起来.
        4)用和实体或属性相关的英文符号长度有一定的限制
        注意事项:
        1)建表时可以用中文的字段名, 但最好还是用英文的字段名
        2)创建表时要把较小的不为空的字段放在前面, 可能为空的字段放在后面
        3)建表时如果有唯一关键字或者唯一的约束条件,建表时自动建了索引
        4)一个表的最多字段个数也是有限制的,254个.
    

    3、Oracle常用的字段类型

    ORACLE常用的字段类型:
    
        VARCHAR2 (size) 可变长度的字符串, 必须规定长度
    
        CHAR(size) 固定长度的字符串, 不规定长度默认值为1
    
        NUMBER(p,s) 数字型p是位数总长度, s是小数的长度, 可存负数最长38位. 不够位时会四舍五入.
    
        DATE 日期和时间类型
    
        LOB 超长字符, 最大可达4G
    
        CLOB 超长文本字符串
    
        BLOB 超长二进制字符串
    
        BFILE 超长二进制字符串, 保存在数据库外的文件里是只读的.
    
        数字字段类型位数及其四舍五入的结果
    
        数字字段类型位数 存储的值
    
     Oracle内置类型
    
          varchar2 长度可变的字符串,且使用时必须指定长度varchar2(n),长度单位为字节,最大长度为4000字节;
    
          char 固定长度的字符串,默认长度为1,单位:字节,最大长度2000字节;
    
          number 数值类型,既可以表示整数,也可以表示浮点数,
             number(p,s):
             p表示整个数值的长度,不包含小数点
             s表示小数占的长度
             注意:
                没有指定小数的长度,插入的数据如果带小数,则小数位四舍五入
                如果小数长度不足以保存插入的数据,在精度允许的下一位开始四舍五入
                如果指定的小数长度是负数,则表示整数,整数长度为p-s
    
          date 时间和日期数据:
             select to_char(列名,'yy-mm-dd hh24:mi:ss') from 表名
             timestamp 时间和日期数据,包含了上下午标识,6位的微秒,时区
    

    附录一:

    一、 Oracle常用数据字典表
    
    1、 查看当前用户的缺省表空间
    SQL>select username,default_tablespace from user_users; 
    2、 查看当前用户的角色
    SQL>select * from user_role_privs;
    3、 查看当前用户的系统权限和表级权限
    SQL>select * from user_sys_privs;
    SQL>select * from user_tab_privs;
    4、 查看用户下所有的表
    SQL>select * from user_tables;
    5、 查看用户下所有的表的列属性
    SQL>select * from USER_TAB_COLUMNS where table_name=:table_Name;
    6、 显示用户信息(所属表空间)
    select default_tablespace, temporary_tablespace
      from dba_users  www.2cto.com  
     where username = 'GAME';
    7、 显示当前会话所具有的权限
    SQL>select * from session_privs;
    8、 显示指定用户所具有的系统权限
    SQL>select * from dba_sys_privs where grantee='GAME';
    9、 显示特权用户
    select * from v$pwfile_users;
    10、 显示用户信息(所属表空间)
    select default_tablespace,temporary_tablespace 
    from dba_users where username='GAME';
    11、 显示用户的PROFILE
    select profile from dba_users where username='GAME'; 
    
    二、表
    
    1、 查看用户下所有的表
    SQL>select * from user_tables;
    2、 查看名称包含log字符的表
    SQL>select object_name,object_id from user_objects
    where instr(object_name,'LOG')>0;
    3、 查看某表的创建时间
    SQL>select object_name,created from user_objects where object_name=upper('&table_name');
    4、 查看某表的大小
    SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
    where segment_name=upper('&table_name');
    5、 查看放在Oracle的内存区里的表
    SQL>select table_name,cache from user_tables where instr(cache,'Y')>0; 
    
    三、索引
    
    1、 查看索引个数和类别
    SQL>select index_name,index_type,table_name from user_indexes order by table_name;
    2、 查看索引被索引的字段
    SQL>select * from user_ind_columns where index_name=upper('&index_name');
    3、 查看索引的大小
    SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
    where segment_name=upper('&index_name');
    
    四、序列号
    
    1、 查看序列号,last_number是当前值
    SQL>select * from user_sequences;
    
    五、视图
    
    1、 查看视图的名称
    SQL>select view_name from user_views;
    2、 查看创建视图的select语句
    SQL>set view_name,text_length from user_views;
    SQL>set long 2000; 说明:可以根据视图的text_length值设定set long 的大小
    SQL>select text from user_views where view_name=upper('&view_name'); 
    
    六、同义词
    
    1、 查看同义词的名称
    SQL>select * from user_synonyms; 
    
    七、约束条件
    
    1、 查看某表的约束条件
        SQL>select constraint_name, constraint_type,search_condition, r_constraint_name
        from user_constraints where table_name = upper('&table_name');
        SQL>select c.constraint_name,c.constraint_type,cc.column_name
        from user_constraints c,user_cons_columns cc
        where c.owner = upper('&table_owner') and c.table_name = upper('&table_name')
        and c.owner = cc.owner and c.constraint_name = cc.constraint_name
        order by cc.position;
    
    八、存储函数和过程
    
    1、 查看函数和过程的状态
    SQL>select object_name,status from user_objects where object_type='FUNCTION';
    SQL>select object_name,status from user_objects where object_type='PROCEDURE';
    2、 查看函数和过程的源代码
    SQL>select text from all_source where owner=user and name=upper('&plsql_name'); 
    
    九、常用的数据字典
    
    dba_data_files:通常用来查询关于数据库文件的信息
    dba_db_links:包括数据库中的所有数据库链路,也就是databaselinks。
    dba_extents:数据库中所有分区的信息
    dba_free_space:所有表空间中的自由分区
    dba_indexs:关于数据库中所有索引的描述
    dba_ind_columns:在所有表及聚集上压缩索引的列
    dba_objects:数据库中所有的对象
    dba_rollback_segs:回滚段的描述
    dba_segments:所有数据库段分段的存储空间
    dba_synonyms:关于同义词的信息查询
    dba_tables:数据库中所有数据表的描述
    dba_tabespaces:关于表空间的信息
    dba_tab_columns:所有表描述、视图以及聚集的列
    dba_tab_grants/privs:对象所授予的权限
    dba_ts_quotas:所有用户表空间限额
    dba_users:关于数据的所有用户的信息
    dba_views:数据库中所有视图的文本
    
    十、常用的动态性能视图
    
    v$datafile:数据库使用的数据文件信息
    v$librarycache:共享池中SQL语句的管理信息
    v$lock:通过访问数据库会话,设置对象锁的所有信息
    v$log:从控制文件中提取有关重做日志组的信息
    v$logfile有关实例重置日志组文件名及其位置的信息
    v$parameter:初始化参数文件中所有项的值
    v$process:当前进程的信息  www.2cto.com  
    v$rollname:回滚段信息
    v$rollstat:联机回滚段统计信息
    v$rowcache:内存中数据字典活动/性能信息
    v$session:有关会话的信息
    v$sesstat:在v$session中报告当前会话的统计信息
    v$sqlarea:共享池中使用当前光标的统计信息,光标是一块内存区域,有Oracle处理SQL语句时打开。
    v$statname:在v$sesstat中报告各个统计的含义
    v$sysstat:基于当前操作会话进行的系统统计
    v$waitstat:出现一个以上会话访问数据库的数据时的详细情况。当有一个以上的会话访问同一信息时,可出现等待情况。
    总结了一下这些,彻底区别了视图与数据字典,也不那么容易混淆。嘿嘿!!!
    
    十一、常用SQL查询
    
    1、查看表空间的名称及大小
    select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size
    from dba_tablespaces t, dba_data_files d
    where t.tablespace_name = d.tablespace_name
    group by t.tablespace_name;
    
    2、查看表空间物理文件的名称及大小
    select tablespace_name, file_id, file_name,
    round(bytes/(1024*1024),0) total_space
    from dba_data_files
    order by tablespace_name;
    
    3、查看回滚段名称及大小
    select segment_name, tablespace_name, r.status, 
    (initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent, 
    max_extents, v.curext CurExtent
    From dba_rollback_segs r, v$rollstat v
    Where r.segment_id = v.usn(+)
    order by segment_name;
    
    4、查看控制文件
    select name from v$controlfile;
    
    5、查看日志文件
    select member from v$logfile;
    
    6、查看表空间的使用情况
    select sum(bytes)/(1024*1024) as free_space,tablespace_name 
    from dba_free_space
    group by tablespace_name;
    SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,
    (B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"
    FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
    WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME; 
    
    7、查看数据库库对象
    select owner, object_type, status, count(*) count# from all_objects group by owner, object_type, status;
    
    8、查看数据库的版本 
    Select version FROM Product_component_version 
    Where SUBSTR(PRODUCT,1,6)='Oracle';
    
    9、查看数据库的创建日期和归档方式
    Select Created, Log_Mode, Log_Mode From V$Database; 
    
    10、捕捉运行很久的SQL
    column username format a12 
    column opname format a16 
    column progress format a8 
    select username,sid,opname, 
    round(sofar*100 / totalwork,0) || '%' as progress, 
    time_remaining,sql_text 
    from v$session_longops , v$sql 
    where time_remaining <> 0 
    and sql_address = address 
    and sql_hash_value = hash_value 
    
    11、查看数据表的参数信息
    SELECT   partition_name, high_value, high_value_length, tablespace_name,
    pct_free, pct_used, ini_trans, max_trans, initial_extent,
    next_extent, min_extent, max_extent, pct_increase, FREELISTS,
    freelist_groups, LOGGING, BUFFER_POOL, num_rows, blocks,
    empty_blocks, avg_space, chain_cnt, avg_row_len, sample_size,
    last_analyzed
    FROM dba_tab_partitions
    --WHERE table_name = :tname AND table_owner = :towner
    ORDER BY partition_position
    
    12、查看还没提交的事务
    select * from v$locked_object;
    select * from v$transaction; 

    附录二、

    
    C:\Users\Administrator>sqlplus
    
    SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 10月 5 11:23:58 2016
    
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
    
    请输入用户名:  scott
    输入口令:
    
    连接到:
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
    With the Partitioning, OLAP and Data Mining options
    
    SQL> connect sys/root as sysdba;
    已连接。
    SQL> show user;
    USER 为 "SYS"
    SQL> select username from dba_users;
    
    USERNAME
    ------------------------------
    MGMT_VIEW
    SYS
    SYSTEM
    DBSNMP
    SYSMAN
    ZHANGSAN
    SCOTT
    TEST
    TEST_USER
    ROBINSON
    OUTLN
    
    USERNAME
    ------------------------------
    MDSYS
    ORDSYS
    EXFSYS
    DMSYS
    WMSYS
    CTXSYS
    ANONYMOUS
    XDB
    ORDPLUGINS
    SI_INFORMTN_SCHEMA
    OLAPSYS
    
    USERNAME
    ------------------------------
    TSMSYS
    BI
    PM
    MDDATA
    IX
    SH
    DIP
    OE
    HR
    
    已选择31行。
    
    SQL> --上述是利用dba_users数据字典
    SQL> drop user mary cascade;
    drop user mary cascade
              *
    第 1 行出现错误:
    ORA-01918: 用户 'MARY' 不存在
    
    
    SQL> create user jack identified by jack;
    
    用户已创建。
    
    SQL> frant dba to jack;
    SP2-0734: 未知的命令开头 "frant dba ..." - 忽略了剩余的行。
    SQL> grant dba to jack;
    
    授权成功。
    
    SQL> select tablespace_name from dba_tablespaces;
    
    TABLESPACE_NAME
    ------------------------------
    SYSTEM
    UNDOTBS1
    SYSAUX
    TEMP
    USERS
    EXAMPLE
    FUND
    
    已选择7行。
    
    SQL> select tablespaces_name from user_tablespaces;
    select tablespaces_name from user_tablespaces
           *
    第 1 行出现错误:
    ORA-00904: "TABLESPACES_NAME": 标识符无效
    
    
    SQL> select tablespace_name from user_tablespaces;
    
    TABLESPACE_NAME
    ------------------------------
    SYSTEM
    UNDOTBS1
    SYSAUX
    TEMP
    USERS
    EXAMPLE
    FUND
    
    已选择7行。
    
    SQL> create tablespace test1_tablespace datafile 'test1file.dbf' size 10M;
    
    表空间已创建。
    
    SQL> --上面是创建永久表空间
    SQL> --下面是创建临时表空间
    SQL> create temporary tablespace temptest1_tablespace tempfile 'tempfile1.dbf' size 10M;
    
    表空间已创建。
    
    SQL> select file_name from dba_dta_files where tablespace_name 'TEST1_TABLESPACE';
    select file_name from dba_dta_files where tablespace_name 'TEST1_TABLESPACE'
                                                              *
    第 1 行出现错误:
    ORA-00920: 无效的关系运算符
    
    
    SQL> select file_name from dba_data_files where tablespace_name = 'TEST1_TABLESPACE';
    
    FILE_NAME
    --------------------------------------------------------------------------------
    E:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\TEST1FILE.DBF
    
    SQL> select file_name from dba_temp_file where tablespace_name = 'TEMPTEST1_TABLESPACE';
    select file_name from dba_temp_file where tablespace_name = 'TEMPTEST1_TABLESPACE'
                          *
    第 1 行出现错误:
    ORA-00942: 表或视图不存在
    
    
    SQL> select file_name from dba_temp_files where tablespace_name = 'TEMPTEST1_TABLESPACE';
    
    FILE_NAME
    --------------------------------------------------------------------------------
    E:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\TEMPFILE1.DBF
    
    SQL> alter tablespace test1_tablespace read only;
    
    表空间已更改。
    
    SQL> select status from dba_tablespaces where tablespace_name = 'TEST1_TABLESPACE';
    
    STATUS
    ---------
    READ ONLY
    
    SQL> alter tablespace test1_tablespace read write;
    
    表空间已更改。
    
    SQL> select status from dba_tablespaces where tablespace_name = 'TEST1_TABLESPACE';
    
    STATUS
    ---------
    ONLINE
    
    SQL> alter tablespace test1_tablespace add datafile 'test2_file.dbf' size 10M;
    
    表空间已更改。
    
    SQL> select file_name from dba_date_files where tablespace_name = 'TEST_TABLESPACE';
    select file_name from dba_date_files where tablespace_name = 'TEST_TABLESPACE'
                          *
    第 1 行出现错误:
    ORA-00942: 表或视图不存在
    
    
    SQL> select file_name from dba_data_files where tablespace_name = 'TEST1_TABLESPACE';
    
    FILE_NAME
    --------------------------------------------------------------------------------
    E:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\TEST1FILE.DBF
    E:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\TEST2_FILE.DBF
    
    SQL> alter tablespace tablespace_name drop datefile 'test2_file.dbf';
    alter tablespace tablespace_name drop datefile 'test2_file.dbf'
                                          *
    第 1 行出现错误:
    ORA-00905: 缺失关键字
    
    
    SQL> alter tablespace tablespace_name drop datafile 'test2_file.dbf';
    alter tablespace tablespace_name drop datafile 'test2_file.dbf'
    *
    第 1 行出现错误:
    ORA-00959: 表空间 'TABLESPACE_NAME' 不存在
    
    
    SQL> alter tablespace test1_tablespace drop datafile 'test2_file.dbf';
    
    表空间已更改。
    
    SQL> select file_name from dba_data_files where tablespace_name = 'TEST1_TABLESPACE';
    
    FILE_NAME
    --------------------------------------------------------------------------------
    E:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\TEST1FILE.DBF
    
    SQL> drop tablespace test1_tablespace including contents;
    
    表空间已删除。
    展开全文
  • IOS的高级控件表视图 第一步:同样是拖入控件,并对其数据源进行连线所以我就直接拿上一张的图片就不截图了。 如果有不明白的请点击连接 010 Xcode4.5上创建IOS6.0应用 (高级控件 表视图 基本表视图) ...

    IOS中的高级控件表视图


    第一步:同样是拖入控件,并对其数据源进行连线所以我就直接拿上一张的图片就不截图了。
    如果有不明白的请点击连接



    第二步:对H文件进行编辑实现表格控件的协议
    ViewController.h
    @interface ViewController : UIViewController
    <UITableViewDataSource,UITableViewDelegate>{
        NSDictionary *dictionary;
        NSArray *arr;
    }
    
    @property(nonatomic,retain)NSDictionary *dictionary;
    @property(nonatomic,retain)NSArray *arr;
    
    @end


    ViewController.m
    @implementation ViewController
    
    @synthesize dictionary;
    @synthesize arr;
    
    
    //实现表示图的方法
    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
        
        
        NSUInteger section = [indexPath section];
        NSUInteger row = [indexPath row];
        
        NSString *name = [arr objectAtIndex:section];
        NSArray *team = [dictionary objectForKey:name];
        NSString *selectedteam = [team objectAtIndex:row];
        
        NSString *message = [[NSString alloc] initWithFormat:@"你选择的号码是%@",selectedteam];
        
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"球队选择"
                                                        message:message delegate:self
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil, nil];
        
        
        [alert show];
        [alert release];
        [message release];
        //实现点击时,让点击的那个选中慢慢消失
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
        
    }
    
    //实现索引
    -(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
        return arr;
    }
    
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        //返回段里面有几行
        NSString *name = [arr objectAtIndex:section];
        NSArray *team = [dictionary objectForKey:name];
        
        return [team count];
    }
    //返回数量
    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
        return [arr count];
    }
    //返回每个段里面的名字
    -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
        NSString *name = [arr objectAtIndex:section];
        return name;
    }
    
    
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        }
        
        NSUInteger section = [indexPath section];
        NSUInteger row = [indexPath row];
        NSString *name = [arr objectAtIndex:section];
        NSArray*team = [dictionary objectForKey:name];
        
        //返回协议的标题
        cell.textLabel.text = [team objectAtIndex:row];
        
        return cell;
        
    }
    
    
    
    
    
    
    
    
    
    
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    	//下面为模式代码读取文件到代码中
        NSBundle *bundle = [NSBundle mainBundle];
        NSString *filePath = [bundle pathForResource:@"statedictionary" ofType:@"plist"];
        NSDictionary *dic = [[NSDictionary alloc] initWithContentsOfFile:filePath];
        self.dictionary = dic;
        [dic release];
        //根据ID查询字典里面的内容并进行排序
        self.arr = [[dictionary allKeys] sortedArrayUsingSelector:@selector(compare:)];
    }
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    - (void)dealloc
    {
        [dictionary release];
        [arr release];
        [super dealloc];
    }
    
    @end

    最后我门就实现了分段表视图


    实现分组表视图必须再分段表视图的基础上
    只需要修改一个属性



    大家都看到上面的视图上面都有一个索引实现起来也比较简单只要实现这段小小的代码
    -(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
        return arr;
    }




    展开全文
  • 表视图

    千次阅读 2013-12-15 14:55:32
    在表视图中,分节、分组和索引功能使我们展示的数据看起来更规整。 一、概述 1、表视图组成 在IOS,表视图是最重要的视图。与表视图相关的一些概念如下: (1)表头视图。表视图最上边的视图,用于展示表视图的...

    在IOS中,一般情况下,我们都会以表的形式来展示数据。在表视图中,分节、分组和索引功能使我们展示的数据看起来更规整。


    一、概述

    1、表视图组成

    在IOS中,表视图是最重要的视图。与表视图相关的一些概念如下:

    (1)表头视图。表视图最上边的视图,用于展示表视图的信息,如表视图刷新信息等。

    (2)表脚视图。表视图最下边的视图,用于展示表视图的信息,如表视图分页时显示“更多”等信息。

    (3)单元格(cell)。单元格是组成表视图每一行的单位视图。

    (4)节(section)。它由多个单元格组成,有节头和节脚。


    2、表视图相关类

    表视图继承自UIScrollView,UITableViewCell是单元格类,UITableViewController类是UITableView的控制器,UITableViewHeaderFooterView类用于节头和节脚提供视图(IOS6之后才有的新类)。下图是相关类的构成。



    3、表视图分类

    表视图主要分为普通视图(下左图)和分组视图(下右图)。

    (1)普通视图。主要用于动态表,而动态表一般在单元格数目未知的情况下使用。

    (2)分组视图。一般用于静态表,组将表分成很多部分(由一些类似的单元格组成)。静态表一般用于控件的界面布局,它是在IOS 5之后由storyboard提供的。

                             


    除此之外,在表视图中还可以带有索引、选择列和搜索栏等。


    4、单元格的组成和样式

    单元格由图标、标题和扩展视图等组成。


    单元格可以有很多样式,也可以自定义。图标、标题和副标题可以有选择地设置,扩展视图可以有内置或者自定义,其中内置的扩展视图是在枚举UITableViewCellAccessoryType中定义的。UITableViewCellAccessoryType中定义的常量有:

    (1)UITableViewCellAccessoryNone,没有扩展视图。

    (2)UITableViewCellAccessoryDisclosureIndicator,扩展指示器。触摸该图标将切换到下一级表视图。

    (3)UITableViewCellAccessoryDetailDisclosureButton,细节展示按钮。触摸该单元格的适合,表视图会以视图的方式显示当前单元格的更多详细信息。

    (4)UITableViewCellAccessoryCheckmark,选中标志。表示该行被选中。


    在实际的开发过程中,我们首先考虑apple提供的一些固有单元格样式。IOS API提供的单元格样式是在枚举UITableViewCellStyle中定义的。UITableViewCellStyle中定义的常量有:

    (1)UITableViewCellStyleDefault。默认样式,只有图标和主表土。

    (2)UITableViewCellStyleSubtitle。带有副标题的样式,有图标、主标题和副标题。

    (3)UITableViewCellStyleValue1。无图标带副标题样式1,有主标题和子标题。

    (4)UITableViewCellStyleValue2。无图标带副标题样式2,有主标题和子标题。


    如果以上单元格样式都不满足需求,我们可以考虑自定义。


    二、简单实现

    这里我们实现一个简单的表视图,其中单元格采用默认样式,有图标和主标题。


    有两个地方需要注意:

    1、Scene列表中选择TableView,打开表视图的属性检查器。可以看到Content下有两个选项(Dynamic Prototypes和Static Cells),这两个选项只有在storyboard中才有。Dynamic Prototype用于构建“动态表”,而Static Cells用于构建“静态表”。


    2、如果通过代码实现单元格的创建,则TableView的属性检查器中的Prototype Cells项要设为0;如果用视图文件创建单元格,则这里设为1。


    这里我们在代码中创建单元格,具体代码如下:


    //  ViewController.h
    
    #import <UIKit/UIKit.h>
    
    @interface ViewController : UITableViewController
    
    @property (strong,nonatomic) NSArray *data;
    @end
    


    //  ViewController.m
    
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        NSString *path=[[NSBundle mainBundle] pathForResource:@"team" ofType:@"plist"];
        self.data=[NSArray arrayWithContentsOfFile:path];
    }
    
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [self.data count];
    }
    
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {  
        static NSString *cellIdentifier=@"Cell";
        UITableViewCell *tableViewCell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if(!tableViewCell){
            tableViewCell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }
        
        //根据indexPath获取相应的数据
        NSUInteger row=[indexPath row];
        NSDictionary  *dict=[self.data objectAtIndex:row];
        
        //设置cell的显示数据
        tableViewCell.textLabel.text=[dict objectForKey:@"name"];
        NSString *imgPath=[dict objectForKey:@"image"];
        imgPath=[imgPath stringByAppendingString:@".png"];
        UIImage *image=[UIImage imageNamed:imgPath];
        tableViewCell.imageView.image=image;
        
        //设置cell的扩展视图的样式
        tableViewCell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
        
        return tableViewCell;
    }
    
    @end
    

    如果利用storyboard中创建单元格,打开Table View Cell的属性检查器。Style选项中有很多可用属性,这些都与表视图描述的单元格的样式一致,Identifier是指可重用单元格的标识符。这样做之后,我们就不需要在代码中实例化单元格了。我们可以直接通过Identifier取得单元格的实例。下面是获取单元格的代码:

        static NSString *cellIdentifier=@"Cell";
        UITableViewCell *tableViewCell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    //    if(!tableViewCell){
    //        tableViewCell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    //    }
        
    


    三、带搜索栏

    IOS提供了搜索栏控件,方便我们查询数据。这里我们在上面代码的基础上再实现搜索功能。


    1、IOS的搜索栏有很多样式:

    (1)基本搜索栏。

    (2)带清除按钮的搜索栏。

    (3)带查询结果按钮的搜索栏。


    显示最近搜索结果,事件响应由UISearchBarDelegate对象中的searchBarResultsListButtonClicked:方法管理。


    (4)带书签按钮的搜索栏。


    显示用户收藏的书签列表,事件响应由UISearchBarDelegate对象中的searchBarBookmarkButtonClicked:方法管理。


    (5)带取消按钮的搜索栏。


    事件响应由UISearchBarDelegate对象中的searchBarCancelButtonClicked:方法管理。


    (6)带Scope的搜索栏。


    事件响应由UISearchBarDelegate或UISearchDisplayDelegate对象管理。

    这里有一点需要注意,默认情况下,Scope Bar初始是显示的。这在iphone上用户体验比较差,我们需要让它初始隐藏,当SearchBar获取 焦点时再显示。为此,我们需要在初始化时调用SearchBar的两个方法:

    [searchBar setShowsScopeBar:NO];

    [searchBar sizeToFit];


    2、相对来说SearchBar是一个比较复杂的控件,它涉及到一些其它类:


    UISearchBarDelegate是UISearchBar的委托协议;UISearchDisplayController用于管理SearchBar并显示搜索结果视图,其事件处理由UISearchDisplayDelegate协议的委托对象来管理。


    3、我们用storyboard来设计我们的视图,这里有个小技巧:

    我们从对象库中拖拽的是Search Bar and Search Display Controller到界面,而不是Search Bar控件。前者的好处在于它可以把UISearchDisplayController也添加到搜索栏,并且将委托和数据源连线完毕。


    下面是我们的实现:

    //  ViewController.h
    
    #import <UIKit/UIKit.h>
    
    @interface ViewController : UITableViewController<UISearchBarDelegate,UISearchDisplayDelegate>
    @property (strong,nonatomic) NSArray *data;
    @property (strong,nonatomic) NSMutableArray *filterData;
    @property (weak, nonatomic) IBOutlet UISearchBar *searchBar;
    
    //根据text和选中的scope过滤数据
    -(void)filterDataWithText:(NSString*)text scope:(NSUInteger) scopeIndex;
    @end


    //  ViewController.m
    
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        //设置搜索栏的ScopeBar初始隐藏
    	[self.searchBar setShowsScopeBar:NO];
        [self.searchBar sizeToFit];
        
        NSString *path=[[NSBundle mainBundle] pathForResource:@"team" ofType:@"plist"];
        self.data=[NSArray arrayWithContentsOfFile:path];
        //加载所有数据
        [self filterDataWithText:@"" scope:-1];
    }
    
    -(void)filterDataWithText:(NSString *)text scope:(NSUInteger)scopeIndex
    {
        if([text length]==0){
            self.filterData=[NSMutableArray arrayWithArray:self.data];
            return;
        }
        NSPredicate *predicate;
        switch (scopeIndex) {
            case 0:
                //按中文查询
                predicate=[NSPredicate predicateWithFormat:@"SELF.name contains[c] %@",text];
                self.filterData=[NSMutableArray arrayWithArray:[self.data filteredArrayUsingPredicate:predicate]];
                break;
            case 1:
                //按英文查询
                predicate=[NSPredicate predicateWithFormat:@"SELF.image contains[c] %@",text];
                self.filterData=[NSMutableArray arrayWithArray:[self.data filteredArrayUsingPredicate:predicate]];
                break;
                
            default:
                //默认查询所有
                self.filterData=[NSMutableArray arrayWithArray:self.data];
                break;
        }
    }
    
    
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [self.filterData count];
    }
    
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *cellIdentifier=@"Cell";
        UITableViewCell *tableViewCell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if(!tableViewCell){
            tableViewCell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
        }
        
        //根据indexPath获取相应的数据
        NSUInteger row=[indexPath row];
        NSDictionary  *dict=[self.filterData objectAtIndex:row];
        
        //设置cell的显示数据
        tableViewCell.textLabel.text=[dict objectForKey:@"name"];
        NSString *imgPath=[dict objectForKey:@"image"];
        tableViewCell.detailTextLabel.text=imgPath;
        imgPath=[imgPath stringByAppendingString:@".png"];
        UIImage *image=[UIImage imageNamed:imgPath];
        tableViewCell.imageView.image=image;
        
        //设置cell的扩展视图的样式
        tableViewCell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
        return tableViewCell;
    }
    
    -(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
    {
        [self filterDataWithText:searchString scope:self.searchBar.selectedScopeButtonIndex];
        return YES;
    }
    
    -(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
    {
        [self filterDataWithText:self.searchBar.text scope:searchOption];
        return YES;
    }
    
    -(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
    {
        [self filterDataWithText:@"" scope:-1];
    }
    
    @end
    


    在搜索栏中输入查询条件,会触发UISearchBarDelegate委托对象的searchBar:textDidChange:方法和UISearchDisplayDelegate委托对象的searchDisplayController:shouldReloadTableForSearchString:方法,我们只要实现这两者之一即可。这里我们选择实现后者,因为后者的优势在于可以控制表视图数据源是否重新加载。如果实现searchBar:textDidChange:方法,则我们还需要自己调用[tableView reloadData]方法重新加载表视图数据。


    ScopeBar进行切换时,会触发UISearchBarDelegate委托对象的searchBar:selectedScopeButtonIndexDidChange:方法和UISearchDisplayDelegate委托对象的searchDisplayController:shouldReloadTableForSearchScope:方法,我们也只要实现两者之一即可。这里我们同样选择实现后者,因为后者能控制表视图数据源是否重新加载。


    四、分节和索引


    当表中的数据需要归类时,我们会用到节;当表中数据量比较大时,我们还可以建立索引。下面是一个简单的实现。


    1、数据组织



    这里我们在Dictionary中存放Array,每个Array为一个节。


    具体实现:

    //  ViewController.h
    
    #import <UIKit/UIKit.h>
    
    @interface ViewController : UITableViewController
    
    @property (nonatomic,strong) NSDictionary *data;
    @property (nonatomic,strong) NSArray *groupName;
    
    @end


    //  ViewController.m
    
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    	
        //获取所有数据
        self.data=[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"team_dictionary" ofType:@"plist"]];
        //获取组名
        NSArray *temp=[self.data allKeys];
        //从哈希表中获取的数据是无序的,所以需要排序
        self.groupName=[temp sortedArrayUsingSelector:@selector(compare:)];
       
    }
    
    //定义表中的节数
    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return [self.groupName count];
    }
    
    //定义节头显示字符串
    -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
    {
        return [self.groupName objectAtIndex:section];
    }
    
    //定义节索引
    -(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
    {
        NSMutableArray *sectionIndexArray=[[NSMutableArray alloc] initWithCapacity:[self.groupName count]];
        for(NSString *temp in self.groupName){
            NSString *indexTitle=[temp substringToIndex:1];
            [sectionIndexArray addObject:indexTitle];
        }
        return sectionIndexArray;
    }
    
    //定义节中的行数
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        NSString *group=[self.groupName objectAtIndex:section];
        NSArray *temp=[self.data objectForKey:group];
        return [temp count];
    }
    
    //定义单元格
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *cellIdentifier=@"cell";
        UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if(!cell){
            cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
        }
        
        //获取节
        NSUInteger section=[indexPath section];
        NSUInteger row=[indexPath row];
        //获取组名
        NSString *group=[self.groupName objectAtIndex:section];
        //获取组中的数据
        NSArray *temp=[self.data objectForKey:group];
        
        cell.textLabel.text=[temp objectAtIndex:row];
        
        return cell;
    }
    
    
    @end
    


    五、编辑表视图

    TableView的编辑包括:insert、delete和move。

    //  ViewController.m
    
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        self.tableView.delegate=self;
        self.tableView.dataSource=self;
        self.textField.delegate=self;
        //设置NavigationItem的右按钮以及title
    	self.navigationItem.rightBarButtonItem=self.editButtonItem;
        self.navigationItem.title=@"TableView Editing";
        //初始隐藏TextField
        self.textField.hidden=YES;
        
        self.data=[[NSMutableArray alloc] initWithObjects:@"Houston",@"New York",@"Los Angeles",@"Boston",@"Miami",@"Washington", nil];
    }
    
    /*
     Sets whether the view controller shows an editable view.
     Subclasses that use an edit-done button must override this method to change their view to an editable state if editing is YES and a non-editable state if it is NO. This method should invoke super’s implementation before updating its view.
     */
    -(void)setEditing:(BOOL)editing animated:(BOOL)animated
    {
        [super setEditing:editing animated:YES];
        
        [self.tableView setEditing:editing animated:YES];
        if(editing){
            self.textField.hidden=NO;
        }else{
            self.textField.hidden=YES;
        }
    }
    
    //Asks the delegate for the editing style of a row at a particular location in a table view.
    -(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(indexPath.row==[self.data count]){
            return UITableViewCellEditingStyleInsert;
        }else{
            return UITableViewCellEditingStyleDelete;
        }
    }
    
    //Asks the data source to commit the insertion or deletion of a specified row in the receiver.
    -(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(editingStyle==UITableViewCellEditingStyleDelete){//delete
            [self.data removeObjectAtIndex:indexPath.row];
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        }else if(editingStyle==UITableViewCellEditingStyleInsert){//insert
            [self.data insertObject:self.textField.text atIndex:[self.data count]];
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        }
        [tableView reloadData];
    }
    
    //Asks the data source whether a given row can be moved to another location in the table view.
    -(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(indexPath.row==[self.data count]){
            return NO;
        }
        return YES;
    }
    
    //Tells the data source to move a row at a specific location in the table view to another location.
    -(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
    {
        NSString *str=[self.data objectAtIndex:sourceIndexPath.row];
        [self.data removeObjectAtIndex:sourceIndexPath.row];
        [self.data insertObject:str atIndex:destinationIndexPath.row];
    }
    
    -(BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(indexPath.row==[self.data count]){
            return NO;
        }
        return YES;
    }
    
    //Asks the delegate if the text field should process the pressing of the return button.
    -(BOOL)textFieldShouldReturn:(UITextField *)textField
    {
        [textField resignFirstResponder];
        return YES;
    }
    
    //Tells the delegate that editing began for the specified text field.
    //设置tableview内容的offset,以免文本框被键盘挡住
    -(void)textFieldDidBeginEditing:(UITextField *)textField
    {
        UITableViewCell *cell=(UITableViewCell*)[[textField superview] superview];
        [self.tableView setContentOffset:CGPointMake(0.0, cell.frame.origin.y) animated:YES];
    }
    
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [self.data count]+1;
    }
    
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *cellIdentifier=@"cell";
        UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if(!cell){
            cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }
        if([indexPath row]==[self.data count]){
            self.textField.frame=cell.contentView.frame;
            self.textField.text=@"";
            [cell.contentView addSubview:self.textField];
        }else{
            cell.textLabel.text=[self.data objectAtIndex:[indexPath row]];
            cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
        }
           return cell;
    }
    
    @end
    


    setEditing:animated:方法是UIViewController生命周期方法,用于响应视图编辑状态的变化。在我们这里,当点击NavigationItem上的Edit(这个编辑按钮是视图控制器中预定义的按钮,点击后按钮会转换到Done)时便会触发setEditing:animated:方法。在这个方法里,我们触发TableView的编辑方法。 


    tableView:commitEditingStyle:forRowAtIndexPath:方法是TableView的编辑提交方法,我们编辑完成后,点击NavigationItem上的Done便会触发该方法。


    在处理键盘遮挡输入框时,有一点需要注意,


    这里textField的父亲的父亲才是UITableViewCelltextField的父亲是单元格内容视图,并不是UITableViewCell。


    tableView:canMoveRowAtIndexPath:控制cell是否可移动,我们这里除了最后一条(最后一条是添加item选项),都能移动。cell移动时,我们需要在tableView:moveRowAtIndexPath:toIndexPath:方法中做相应的处理。


    下面是运行截图:

                        


    六、自定义UITableViewCell

    iOS提供了几种cell的样式,实际应用中经常需要根据需求自定义cell。自定义的方式有多种,这里介绍两种方式。第一种,新建一个cell类(不带xib),并继承UITableViewCell,然后在类中用代码添加view,这种方式会稍微麻烦一点。第二种,新建一个cell类,附带xib(xib中的根view不是UIView,而是TableViewCell),指定cell的复用id,类继承UITableViewCell,然后在xib中添加view。


    上面提到两种自定义TableViewCell的方式,接下来还有一个复用的问题。第一种方式自定义的TableViewCell在使用的时候与使用系统的cell一样,先调用tableview的dequeueReusableCellWithIdentifier方法获取复用,如果为nil,直接调用alloc创建并初始化一个复用id;第二种方式自定义的TableViewCell在使用的时候稍微有点不一样,首先在viewDidLoad方法中注册Nib:

    UINib *nib = [UINib nibWithNibName:@"MusicPickerViewCell" bundle:nil];
        [self.tableView registerNib:nib forCellReuseIdentifier:cellIdentifier];

    注册之后,在

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    方法中直接获取复用cell即可(不需要判断nil):

    MusicPickerViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];








    展开全文
  • 窗体内公用的数据表使用视图和行过滤时的有趣现象1、开发环境,C#2005WINFORM2、现象,窗体公用了一个DataTable,原因1)有一个列表控件,使用原始的数据表,即不排序和过滤,也不用视图。2)有一个下拉框控件,...

    窗体内公用的数据表,在使用视图和行过滤时的有趣现象

    1、开发环境,C#2005WINFORM

    2、现象,窗体中公用了一个DataTable,原因

    1)有一个列表控件,使用原始的数据表,即不排序和过滤,也不用视图。

    2)有一个下拉框控件,使用原始数据表的视图,但要求排序和过滤

    3)两个控件的绑定事件均在load事件中调用,先列表,后下拉框,结果列表中的记录也被过滤掉了一部分,即与下拉框的内容相同了

    3、解决方法,不用相同的数据表,在下拉框的绑定时,必须新定义一个表,且不能设置为相等,要用新表等于旧表的复制才行。

    如,DataTable dtFieldInfotmp = dtFieldInfo.Copy();        //复制该 DataTable 的结构和数据

     

    展开全文
  • sql server视图排序

    2020-11-03 16:07:15
    视图可以可以理解为一个临时,是一个结果集合,大部分对表的操作语句都可以用,但是对于升序降序的语句略有不同 这里我们选择设计界面直接操作 第一步:列条件区域进行设置,类似于excel的傻瓜式操作 第二...
  • XAML的代码 后台代码
  • Oralce静态数据字典目录,为采集前获取上游Oralce系统结构做准备
  • SQL中数据查询及视图

    千次阅读 多人点赞 2020-04-07 17:14:03
    数据查询 语句格式 SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] … FROM <表名或视图名>[,<表名或视图名> ]…|(SELECT 语句) [AS]<别名> [ WHERE <条件表达式> ] ...
  • 问题:新建的视图维护数据,开发或测试都可以正常维护数据。但传到800后,sm30维护数据提示:客户800有"不可修改"的状态 解决:表格维护生成器,原因为:对话数据传输明细 默认标准记录例程 更改为:不,或用户,记录...
  • DataView 表示用于排序、筛选、搜索、编辑和导航的 ...使用 DataView,您可以使用不同排序顺序显示表中数据,并且可以按行状态或基于筛选器表达式来筛选数据。 DataView 提供基础 DataTable 数据的动态视图
  • 之所以要单表头的时候,自己写一个过滤器,是因为angularjs内置的orderBy单表头的时候默认给我升序排序了,而他的排序又只是在视图层面更新,不会更新我的scope域数据,可是我需要获取第一行的值,使那一行...
  • sql 视图 排序 实例

    千次阅读 2020-05-02 10:56:39
    创建一个视图studentScore,查询学生的学号、姓名以及该同学所选修的所有课程的课程名和相应成绩,按学号(升序)、成绩(降序)排序输出。写出相应的SQL语句 create view studentScore (studentNo,studentname,...
  • 视图中干嘛不能用Order by排序

    万次阅读 2011-09-06 16:15:06
    这个问题不高深,甚至有...既然都用到视图了,干嘛还要在视图中用排序呢?视图就存了sql语句了,那我们使用视图的时候只在视图后面指定ORDERY BY不就行了.   先来看看语句: SELECT * FROM TESTS ORDER BY AddTime D
  • HBase数据模型、概念视图和物理视图

    千次阅读 2015-02-13 00:26:40
    1:数据模型  HBase是一个类似Bigtable的... 用户表格存储数据,每一行都有一个可排序的主键和任意多的列。由于是稀疏存储,同一张里面的每一行数据可以有截然不同的列。  列名字的格式是":",都是由字符串
  • 12. 如何XPages实现搜索视图

    千次阅读 2012-12-17 14:05:50
    客户端搜索当前视图有好几种方式:全文...然后一个XPage添加一个视图数据源,该数据可以指定“Searchin view results”属性,即XML文档的search属性。设定一个固定的要搜索的词当然没什么用处。我们便
  • MySQL数据备份以及视图

    千次阅读 2019-01-10 12:26:02
    外键可以在创建的时候或者创建之后增加(但是要考虑数据的问题). 一张可以有多个外键. 创建的时候增加外键:在所有的表字段之后,使用foreign key(外键字段) references 外部(主键字段) -- 主 ...
  • SQL视图

    2020-12-14 23:06:01
    视图  视图是虚拟的。与包含的数据表不一样,视图只包含使用时动态检索的数据查询。作为视图,他不包含任何列或数据,包含的只是一个查询。...可以视图执行SELECT操作,过滤和排序数据,将视图联结到其他
  • (1)DataSet的使用方法1、创建DataSet对象DataSet ds = new DataSet();...2、用数据集填充DataSet最常用的是DataAdapter对象的Fill()方法给他填充数据(1)DataSet ds = new DataSet();SqlDataAdapter adapt = new ...
  • 模式:是数据库全体数据的逻辑结构和特征的描述,关系型数据库,模式的具体表现是一系列之间的联系。 基本:基本就是一个关系及属性的描述,如:学生(学好,姓名,性别,班级) 模式...
  • 随着语义网络中数据量的激增,RDF数据集中高效查询数据已成为一个亟待解决的问题。传统的基于物化视图的RDF模式匹配方法虽然能降低的自连接操作次数,加快查询模式重写过程,但在视图集中检索模式匹配的视图等价...
  • Asp.net,点击GridView表头实现数据排序

    万次阅读 热门讨论 2014-03-10 10:57:54
    //获取数据,通过自定义视图来实现排序,及重新排序。 public voidbind() { SqlConnection con= new SqlConnection("server=.;database=department;uid='sa';pwd='123456'"); con.Open(); string str= "select...
  • C#调用视图

    千次阅读 2015-12-21 18:44:18
     视图的调用方法与的调用是一样的,由于视图是虚,所以一般用查询。例如C#调用视图中的结果时通常会用到SqlDataAdapter类,然后将视图中的结果通过Fill方法去填充结果集(DataSet)。  首先创建一...
  • 如何前端界面操作数据表

    千次阅读 2018-10-24 21:39:42
    前端界面操作数据表来实现对数据库的操作,主要分4各部分,增删改查。通过Parameters.Add(@变量名,值)进行传值,思路上基本类似,主要区别就在于SQL命令语句的不同。下面主要就用DataGridView控件来实现数据表...
  • 联合 日期截取比较 排序 视图
  • Sql Server视图数据的增删改查

    万次阅读 多人点赞 2017-09-13 00:09:16
    因此数据库只存在视图的定义,而不存在视图中相对应的数据数据仍然存放原来的基本表中视图是一种逻辑对象。 二、 视图能做什么 导出数据导出数据时,常常需要多个联合查询,这个时候就...
  • eg:使用NorthWind示例数据库合并两个列: select CustomerID from Customers union select CategoryID from ...那位高手可以做到? 解决方法: SQL code select CustomerID from Customers union select cas...
  • 这里不仅仅记载排序动作,只要临时空间操作就会记录,而且排序发生内存,也不会更新该视图的。   Column Datatype Description TABLESPACE_NAME VARCHAR2(31) Name...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 159,885
精华内容 63,954
关键字:

在表的数据表视图中可以排序