首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

IOS学习——UI基础UIWindow、UIView(五)

在PC中,应用程序多是使用视窗的形式显示内容,手机应用也不例外,手机应用中要在屏幕上显示内容首先要创建一个窗口承载内容,iOS应用中使用UIWindow、UIView来实现内容显示。 UIWindow: UIWindow对象是所有UIView的根视图,管理和协调的应用程序的显示、分发事件给View。UIWindow类是UIView的子类,可以看作是特殊的UIView。一般应用程序只有一个UIWindow对象,即使有多个UIWindow对象,也只有一个UIWindow可以接受到用户的触屏事件。UIWindow初始化在appDeleDgate里面的 didFinishLaunchingWithOptions方法。 self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible];//显示出UIWindow UIView: UIView类继承自UIResponder,负责在屏幕上 定义一个矩形区域,视图用于展示界面及响应用户界面交互。每个视图对象都要负责渲染视图区域的内容,并响应该区域中发生的操作事件。 除了显示内容和处理事件之外,视图可以嵌套并管理子视图。子视图是指嵌入到另一视图对象内部的视图对象,而被嵌入的视图对象是父视图。视图添加到window中就会显示出来,iOS中是怎么实现视图显示的,看下面的代码: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; CGRect rect=[UIScreen mainScreen].applicationFrame; NSLog(@"NSScreen application %@",NSStringFromCGRect(rect)); CGRect rect2=[UIScreen mainScreen].bounds; NSLog(@"NSString mainScreen %@",NSStringFromCGRect(rect2)); NSLog(@"iOS_didFinishLaunchingWithOptions"); UIView *view1=[[UIView alloc]initWithFrame:CGRectMake(60, 50, 200, 100)]; view1.backgroundColor=[UIColor greenColor]; [self.window addSubview:view1]; [view1 release]; UIView *view2=[[UIView alloc]initWithFrame:CGRectMake(60, 100, 200, 200) ]; view2.alpha=0.5; view2.backgroundColor=[UIColor cyanColor]; [self.window addSubview:view2]; UIView *view3=[[UIView alloc]initWithFrame:CGRectMake(100, 50, 60, 50)]; view3.backgroundColor=[UIColor colorWithRed:25/255.0 green:60/255.0 blue:150/255.0 alpha:1.0]; [view2 addSubview:view3]; [view3 release]; [view2 release]; [self.window makeKeyAndVisible]; return YES; } 上面添加了三个视图,view1、view2、view3,view3嵌套在view2中。 /** * @author 张兴业 * http://blog.csdn.net/xyz_lmn * iOS入门群: 83702688 * android开发进阶群: 241395671 * 我的新浪微博: @张兴业TBOW */ 本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/1230735,如需转载请自行联系原作者

优秀的个人博客,低调大师

学习OpenStack之 (2):Cinder LVM 配置

0。背景 OpenStack 中的实例是不能持久化的,cinder服务重启,实例消失。如果需要挂载 volume,需要在 volume 中实现持久化。Cinder提供持久的块存储,目前仅供给虚拟机挂载使用。它并没有实现对块设备的管理和实际服务,而是为后端不同的存储结构提供了统一的接口,不同的块设备服务厂商在 Cinder 中实现其驱动支持以与 OpenStack 进行整合。它通过整合后端多种存储,用API接口为外界提供存储服务。主要核心是对卷的管理,允许都卷、类型和快照进行处理。 Cinder存储分为本地块存储、分布式块存储和SAN存储等多种后端存储类型: 1. 本地存储: 默认通过LVM支持Linux 2. SAN存储: (1)通过NFS协议支持NAS存储,比如Netapp (2)通过添加不同厂商的制定driver来为了支持不同类型和型号的商业存储设备,比如EMC,IBM的存储。 在https://wiki.openstack.org/wiki/CinderSupportMatrix可以看到所支持的厂商存储列表。 3. 分布式系统:支持sheepdog,ceph,和IBM的GPFS等 对于本地存储,cinder-volume 默认使用 LVM 驱动,该驱动当前的实现需要在主机上事先用 LVM 命令创建一个的卷组 , 当该主机接受到创建卷请求的时候,cinder-volume 在该卷组 上创建一个逻辑卷, 并且用 openiscsi 将这个卷当作一个 iscsi tgt 给输出.还可以将若干主机的本地存储用 sheepdog 虚拟成一个共享存储,然后使用 sheepdog 驱动。 1. Cinder LVM配置 在cinder配置文件中,默认的backend lvmdriver是通过LVM来使用本地存储: [lvmdriver-1]volume_group = stack-volumes-lvmdriver-1volume_driver = cinder.volume.drivers.lvm.LVMISCSIDrivervolume_backend_name = lvmdriver-1 volume_group 指定Cinder使用的 volume group。在devstack默认安装时其名称是stack-volumes-lvmdriver-1;在实际部署cinder的时候其默认名称是cinder-volumes。 volume_driver 指定driver类型. Cinder目前支持两种传输协议,iSCSI and iSER。 iSCSI的话,将其值设为cinder.volume.drivers.lvm.LVMISCSIDriver; iSER的话,将其值设为cinder.volume.drivers.lvm.LVMISERDriver。 LVM是cinder.volume.drivers.lvm.LVMISCSIDriver volume_backend_name 是backend name,在创建volume的时候可选择。 如果名字为stack-volumes-lvmdriver-1的volume group不存在,创建volume后其状态将为error,在cinder c-vol日志中可看到如下错误: Exception during message handling: Unexpected error while running command.Command: NoneExit code: -Stdout: u'Unexpected error while running command.\nCommand: sudo cinder-rootwrap /etc/cinder/rootwrap.conf lvcreate -n volume-f3aef3b9-1a71-41d4-956e-a00044544b74 stack-volumes-lvmdriver-1 -L 1g\nExit code: 5\nStdout: u\'\'\nStderr: u\' Volume group "stack-volumes-lvmdriver-1" not found\\n\''Stderr: None 可参考我的博文http://www.cnblogs.com/sammyliu/p/4157491.html来配置LVM。 3. Cinder使用LVM 成功创建一个Cinder volume后,可以在VG中看到新创建的logical volume: root@dev:/home/s1# lvdisplay /dev/stack-volumes-lvmdriver-1/volume-02f986b0-418f-4f84-a5ec-7af61f5d5293--- Logical volume ---LV Name /dev/stack-volumes-lvmdriver-1/volume-02f986b0-418f-4f84-a5ec-7af61f5d5293VG Name stack-volumes-lvmdriver-1LV UUID 9oESr2-4V7f-qp22-F5te-hF2v-DWoy-EshtnNLV Write Access read/writeLV Status available# open 0LV Size 1.00 GiBCurrent LE 256Segments 1Allocation inheritRead ahead sectors auto- currently set to 256Block device 252:0 4. 使用多个backend/添加新的LVM backend (1)创建新的volume group vg3 (1)修改cinder.conf,添加下面行: enabled_backends=lvmdriver-1,lvmdriver-2 [lvmdriver-2]volume_group = vg3volume_driver = cinder.volume.drivers.lvm.LVMISCSIDrivervolume_backend_name = lvmdriver4vg3 注意: cinder-volume服务不监控该配置文件,除了在启动的时候读取该文件以外。因为在修改该文件后你需要重启该服务:`service cinder-volume restart`. (3)创建新的的volume type type-test s1@dev:~/devstack$ cinder type-create type-test+--------------------------------------+---------------+| ID | Name |+--------------------------------------+---------------+| 764480d1-7614-4a63-ba33-924d65765534 | type-test|+--------------------------------------+---------------+ (4) 设置volume type的backend name cinder type-key type-test set volume_backend_name=lvmdriver4vg3 注意: 只有一个backend的时候,除了配置volume group外,不需要添加别的配置信息,创建volume的时候也不需要选择volume type。 当有多个backend的时候,你需要使用volume-type来将volume创建到指定的backend中。一个volume-type可以有几个backend,这时候the capacity scheduler 会自动选择合适的backend来创建volume。 如果定义了volume type,但是cinder.conf中没有定义volume backend,那么cinder scheduler将找不到有效的host来创建volume了。 (5)可以在Horizen中选择新的type type-test来创建volume了 5. 遇到的问题: (1) 在选择一个volume type创建volume时失败, 症状:日志中有No valid host was found. No weighed hosts available 错误 分析:查看volume host: s1@dev:~/devstack$ cinder-manage service list STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION from (pid=4488) _check_effective_sql_mode /usr/local/lib/python2.7/dist-packages/oslo/db/sqlalchemy/session.py:509 Binary Host Zone Status State Updated At cinder-scheduler dev nova enabled :-) 2014-12-12 16:11:54 cinder-volume dev@lvmdriver-1 nova enabled :-) 2014-12-12 16:11:56 原因:cinder-volume的host少了一个对应第二个vg的一个。应该是添加第二个backend后配置没生效。 解决:按照先后顺序重启cinder-scheduler 和 cinder-volume 服务。创建volume错误消失。 (2) Volume一直处于creating状态。cinder-volume log中有如下错误: Returning exception create_volume() got an unexpected keyword argument 'source_replicaid' to caller 原因:controller上和storage node上cinder版本不一致。 解决:在两个node上首先卸载cinder,然后执行命令echo "debhttp://ubuntu-cloud.archive.canonical.com/ubuntu" "trusty-updates/juno main" > /etc/apt/sources.list.d/cloudarchive-juno.list,再安装cinder。确认cinder的版本一致。 1 apt-get install package=version 命令。 本文转自SammyLiu博客园博客,原文链接:http://www.cnblogs.com/sammyliu/p/4159147.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

iOS学习——ios搭建开发环境(一)

好久就想试水IOS开发了,由于开发环境限制,一直局限于理论和虚拟机,近来入手了MacBook Pro,也来尝尝鲜,笔者也是现学现总结,如果有不足,请指正。 IOS开发必备MAC OS X 另加一部iPhone手机,windows操作系统也可以开发,需要安装虚拟机,安装虚拟机请参考Windows 7下虚拟机安装MAC。笔者的开发硬件配置:MacBook Pro+iphone 3gs,手机有点落后了。 我们来看一下MAC下建立iOS开发环境: 首先进入官网https://developer.apple.com,这也是任何程序入门必走的一步,进入官网找到iOS Dev Center,下图 图一(iOS Dev Center) 点击进入。进入后,如果没有登录,会有Sign In的提示,使用注册的帐号登录即可,如果没有帐号,可自行注册。登录后会显示iOS开发的资源(图三)。 图二(提示登录) 在资源里面看到Downloads,点击会引导到下载Xcode,Xcode是开发iOS必备的开发工具,当前最新版本是4.6.2。 这个文件大约1.8G.下载需要一段时间。下载完成点击即可完成安装。 /** * @author 张兴业 * http://xyzlmn.blog.51cto.com/ * android开发进阶群: 241395671 * 我的新浪微博: @张兴业TBOW 本文转自xyz_lmn51CTO博客,原文链接: http://blog.51cto.com/xyzlmn/1229513 ,如需转载请自行联系原作者

优秀的个人博客,低调大师

android学习之-Style样式的定义

这个例子主要是写了配置文件,main.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/str_text_view1" style="@style/StyleText1" android:gravity="center_vertical|center_horizontal" /><!--水平垂直居中对齐--> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/str_text_view2" style="@style/StyleText2" android:gravity="center_vertical|center_horizontal" /> </LinearLayout> 定义要用到的样式style.xml <?xmlversion="1.0"encoding="UTF-8"?> <resources> <stylename="StyleText1"> <itemname="android:textSize">18sp</item> <itemname="android:textColor">#EC9237</item> </style> <stylename="StyleText2"> <itemname="android:textSize">14sp</item> <itemname="android:textColor">#FF7F7C</item> <itemname="android:fromAlpha">0.0</item> <itemname="android:toAlpha">0.0</item> </style> </resources> 有没有发现style.xml的定义方式与color.xml很相似呢,引一下color.xml的定义 <?xmlversion="1.0"encoding="UTF-8"?> <resources> <colorname="white">#ffffff</color> <colorname="black">#000000</color> <drawablename="red">#ff0000</drawable> <drawablename="blue">#0000ff</drawable> </resources> 对比一下可以更深的加强记忆,其它的代码还是见附件 本文转自sucre03 51CTO博客,原文链接:http://blog.51cto.com/sucre/742957,如需转载请自行联系原作者

优秀的个人博客,低调大师

机器学习之条件随机场(CRF)

什么是CRF CRF即条件随机场(Conditional Random Fields),是在给定一组输入随机变量条件下另外一组输出随机变量的条件概率分布模型,它是一种判别式的概率无向图模型,既然是判别式,那就是对条件概率分布建模。 CRF较多用在自然语言处理和图像处理领域,在NLP中,它是用于标注和划分序列数据的概率化模型,根据CRF的定义,相对序列就是给定观测序列X和输出序列Y,然后通过定义条件概率P(Y|X)来描述模型。 CRF的输出随机变量假设是一个无向图模型或者马尔科夫随机场,而输入随机变量作为条件不假设为马尔科夫随机场,CRF的图模型结构理论上可以任意给定,但我们常见的是定义在线性链上的特殊的条件随机场,称为线性链条件随机场。 概率无向图模型 前面说到CRF的输出随机变量是一个概率无向图模型,那么现在看看该模型。 概率无向图模型是由无向图表示的联合概率分布,假设联合概率分布P(Y)通过无向图来表示,则在图中节点表示随机变量,边表示随机变量之间的依赖关系,联合概率分布P(Y)满足马尔科夫性则称其为概率无向图模型,或者是马尔科夫随机场。 如下图,图是一个由节点和边组成的结构体,无向是指边没有方向,整个图记作G=(V,E),其中V为节点的集合,E为边的集合。 每个节点v对应一个随机变量Yv,于是Y=Yv|v∈V,在观察序列X的条件下,每个随机变量Yv都满足马尔科夫特性,即 P(Yv|X,Yw)=p(Yv|X,Yw,w∼v) ,其中w∼v表示w和v是图G中邻近的两个节点。 线性链条件随机场 无向图的结构理论上可以是任意的,但在NLP中对于标记处理问题,对其建模主要用最简单最普通的链式结构,即线性链条件随机场。如下图,可以看到节点为线性链结构,节点对应了序列Y的元素,而观察序列X不做任何独立性假设,但X序列的结构也可以是线性链结构。 综上所述,设有线性链结构的随机变量序列 X=(X1,X2,...,Xn),Y=(Y1,Y2,...,YN),在给定观察序列X的条件下,随机变量序列Y的条件概率分布为P(Y|X),若其满足马尔科夫特性,即 P(Yi|X,Y1,Y2...Yn)=P(Yi|X,Yi−1,Yi+1),这时P(Y|X)则为线性链条件随机场。 概率的定义 在线性链条件随机场中,在给定的观察序列X情况下,某个特定序列Y的概率为P(Y|X),根据定义有, P(Y|X)=exp(∑i,kλktk(Yi−1,Yi,X,i)+∑i,lμlsl(Yi,X,i)) 其中,tk(Yi−1,Yi,X,i)表示转移函数,表示在序列X下序列Y在位置i-1及i对应的值转移概率,而sl(Yi,X,i)表示状态函数,表示在序列X下序列Y在位置i对应的值概率。另外λk,μl分别为两个函数的权重。 转移函数和状态函数都称为特征函数,特征函数一般取值0或1,满足特征函数的则为1,否则为0。比如下面的转移函数,只有当Yi−1,Yi满足一定的条件时才为1,否则为0。 tk(Yi−1,Yi,X,i)={1,0,conditionsaboutYi−1,Yiotherwise 如果我们令sl(Yi,X,i)=sl(Yi−1,Yi,X,i),则转移函数和状态函数可以统一由特征函数表示,对特征在各个位置i求和,有 Fk(Y,X)=∑ni=1fk(Yi−1,Yi,X,i) 最后再加上归一化,最终条件随机场的条件概率为, P(Y|X)=1Z(X)exp(∑Kk=1λkFk(Y,X)) 其中, Z(X)=∑yexp(∑Kk=1λkFk(Y,X)) 如何训练CRF 训练CRF主要就是要训练特征函数的权重,对于训练集(x1,y1),(x2,y2),...,(xn,yn),采用极大似然估计法计算权重参数,条件概率的对数似然函数为: L(λ)=∑x,yp~(x,y)∑ni=1(∑Kk=1λkfk(yi−1,yi,x,i))−∑xp~(x)logZ(x) 其中p~(x,y)为训练样本集中xy的经验概率,它等于xy同时出现的次数除以样本空间容量;p~(x)为训练样本集中x的经验概率,它等于x出现的次数除以样本空间容量。 然后对λ求导,令其为0再求解出λ,即得到解。因为极大似然估计法不一定能得到一个近似解,所以需要利用一些迭代技术来确定参数,比如GIS或IIS算法,这里不再深入。 啥时考虑CRF 如果信息是与时间或空间的前后有关联时要考虑到CRF。 以下是广告 ========广告时间======== 鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。 为什么写《Tomcat内核设计剖析》 ========================= 欢迎关注:

优秀的个人博客,低调大师

初识 sqlite 与 content provider 学习笔记

1,SQLite 简单使用 1,SQLite支持的数据类型 NULL. The value is a NULL value. INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value. REAL. The value is a floating point value, stored as an 8-byte IEEE floating point number. TEXT. The value is a text string, stored using the database encoding (UTF-8, UTF-16BE or UTF-16LE). BLOB. The value is a blob of data, stored exactly as it was input. 2,相关数据库定义数据类型词与SQLite数据类型的关联表 Example Typenames From The CREATE TABLE Statement or CAST Expression Resulting Affinity Rule Used To Determine Affinity INT INTEGER TINYINT SMALLINT MEDIUMINT BIGINT UNSIGNED BIG INT INT2 INT8 INTEGER 1 CHARACTER(20) VARCHAR(255) VARYING CHARACTER(255) NCHAR(55) NATIVE CHARACTER(70) NVARCHAR(100) TEXT CLOB TEXT 2 BLOBno datatype specified NONE 3 REAL DOUBLE DOUBLE PRECISION FLOAT REAL 4 NUMERIC DECIMAL(10,5) BOOLEAN DATE DATETIME NUMERIC 5 把数据类型搞定了…我们就开始使用我们的android的sqlite了… 第一步:实现一个SQLiteOpenHelper类 //创建一个继承SQLiteOpenHelper类 publicclassMyOpenHelperextendsSQLiteOpenHelper{ //必须实现的一个构造方法publicMyOpenHelper(Contextcontext,Stringname,CursorFactoryfactory,intversion){super(context,name,factory,version); //TODOAuto-generatedconstructorstub} //设置数据库初始化版本号 privatestaticfinalintDATABASE_VERSION=1; //设置数据库创建的表名 privatestaticfinalStringTABLE_NAME="users"; //构建创建表的SQL的语句 privatestaticfinalStringTABLE_CREATE_SQL="CREATETABLE"+ TABLE_NAME+"(idINTEGERprimarykey,nameTEXT)"; //自定义构造方法传入content,与数据库名字 publicMyOpenHelper(Contextcontext,Stringname){this(context,name,null,DATABASE_VERSION);} //自定义构造方法传入用来升级数据库的版本号 publicMyOpenHelper(Contextcontext,Stringname,intversion){ this(context,name,null,version);}@OverridepublicvoidonCreate(SQLiteDatabasedb){ //TODOAuto-generatedmethodstub Log.d("sqlite","sql-->CreateTable"+TABLE_CREATE_SQL); db.execSQL(TABLE_CREATE_SQL);} @Override publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){ //TODOAuto-generatedmethodstub}} ok 第二步:使用MyOpenHelper //某 String dataBaseName = "employee"'; MyOpenHelper moh = new MyOpenHelper(Sqlite_contentproviderActivity.this,dataBaseName ); SQLiteDatabase sdb = moh.getReadableDatabase(); toastSQL = Toast.makeText(context, "创建数据库成功", Toast.LENGTH_LONG); toastSQL.show(); 1,我们到adb 中查看在设备中我们保存的数据库文件在 cd /data/data/<package_name>/databases 2,ls 命令看下 3,用sqlite3命令进入数据库 这样我们就看到我们刚才创建的表了… 这里给出插入操作的代码 StringdatabaseName="employee"; MyOpenHelpermoh=newMyOpenHelper(Sqlite_contentproviderActivity.this,databaseName); //获取一个可写操作 SQLiteDatabasesdb=moh.getWritableDatabase(); ContentValuescv=newContentValues(); String[]name={"tom","achai","nevin","week"}; for(inti=0;i<name.length;i++){ cv.put("name",name[i]); sdb.insert("users",null,cv); } 剩下的操作…请阅读官方文档SQLiteDatabase里面的方法 2,创建属于自己的content provider 1,建立一个属于自己的content provider你必须要做 设置一个存储数据的地方,可以使用android 提供的文件存储方法,或者使用SQLite databases,然而,你可以存储任何你想要的数据,android提供的SQLiteOpenHelper可以帮助你创建属于和管理你自己的数据库, 实现ContentProvider 提供用于访问数据的类 在AndroidManifest.xml,声明你的 content provider 2,编写一个数据工具类 publicclassContentProviderData{ publicstaticfinalStringAUTHORIY="kg.tom.FirstProvider"; publicclassContentProviderData{ //定义我们provider使用的认证uri publicstaticfinalStringAUTHORIY="kg.tom.FirstProvider"; //定义我们数据库的名字 publicstaticfinalStringDATABASE_NAME="kg_tom_pro_test"; //定义数据库的版本号 publicstaticfinalintDATABASE_VERSION=1; //定义创建表的名字 publicstaticfinalStringUSERS_TABLE_NAME="users"; //实现BaseColums,自带两列,_id,_count publicstaticfinalclassUserTableMetaDataimplementsBaseColumns{ //定义创建表的名字 publicstaticfinalStringTABLE_NAME="users"; //定义provider的uri publicstaticfinalUriCONTENT_URI=Uri.parse("content://"+AUTHORIY+"/users"); //定义一条数据的类型 publicstaticfinalStringCONTENT_TYPE="vnd.android.cursor.dir/vnd.firstprovider.user"; //定义一组数据的类型 publicstaticfinalStringCONTENT_TYPE_ITEM="vnd.android.cursor.item/vnd.firsstprovider.user"; //定义列名 publicstaticfinalStringUSER_NAME="name"; //定义排序规则 publicstaticfinalStringDEFULT_SORT_ORDER="_iddesc"; }} 2,继承content provider 类 继承这个类我们同时要实现以下几个方法: query()insert()update()delete()getType()onCreate() 还有必须添加一个UriMatcher对象 关于UriMatcher对象的使用文档有很好的解释 //定义URI标识符,数值定义请参考文档 publicstaticfinalintINCOMING_USER_COLLECTION=1; publicstaticfinalintINCOMING_USER_SINGLE=2; //定义UriMatcher对象 publicstaticfinalUriMatcheruMatcher; //把标识符加入到URI中,固定写法 static{ uMatcher=newUriMatcher(UriMatcher.NO_MATCH); //第一个参数为 contentproviderauthoriy uMatcher.addURI(AUTHORIY,"users",INCOMING_USER_COLLECTION); uMatcher.addURI(AUTHORIY,"users/#",INCOMING_USER_SINGLE);} 一个完整的content provider publicclassFirstProviderextendsContentProvider{ //定义URI标识符 publicstaticfinalintINCOMING_USER_COLLECTION=1; publicstaticfinalintINCOMING_USER_SINGLE=2; //定义UriMatcher对象 publicstaticfinalUriMatcheruMatcher; //把标识符加入到URI中,固定写法 static{ uMatcher=newUriMatcher(UriMatcher.NO_MATCH);uMatcher.addURI(ContentProviderData.AUTHORIY,"users",INCOMING_USER_COLLECTION); uMatcher.addURI(ContentProviderData.AUTHORIY,"users/#",INCOMING_USER_SINGLE);} //这里是定义查询用的列名的别名 publicstaticHashMap<String,String>userMap; privateDataBaseHelperdh; static{ userMap=newHashMap<String,String>(); userMap.put(UserTableMetaData._ID,"id"); userMap.put(UserTableMetaData.USER_NAME, UserTableMetaData.USER_NAME);} @Override publicintdelete(Uriuri,Stringselection,String[]selectionArgs){ //TODOAuto-generatedmethodstub return0;} //根据传入的URI @Override publicStringgetType(Uriuri){ //TODOAuto-generatedmethodstub Log.d("sqlite","getType-->"); switch(uMatcher.match(uri)){ caseINCOMING_USER_COLLECTION: returnUserTableMetaData.CONTENT_TYPE; caseINCOMING_USER_SINGLE: returnUserTableMetaData.CONTENT_TYPE_ITEM;default: thrownewIllegalArgumentException("unKnownuri"+uri);}} @Override publicUriinsert(Uriuri,ContentValuesvalues){ //TODOAuto-generatedmethodstub Log.d("insert","class"+getClass()); Log.d("insert","content"+getContext()); SQLiteDatabasedb=dh.getWritableDatabase(); longrowId=db.insert(UserTableMetaData.TABLE_NAME,null,values); if(rowId>0){ UriinsertUri=ContentUris.withAppendedId (UserTableMetaData.CONTENT_URI,rowId); getContext().getContentResolver().notifyChange(insertUri,null); returninsertUri;} returnnull;} @Override publicbooleanonCreate(){ //TODOAuto-generatedmethodstub Log.d("sqlite","createPro--->"); dh=newDataBaseHelper(getContext(),ContentProviderData.DATABASE_NAME); //SQLiteDatabasedb=dh.getReadableDatabase();returntrue;} @Override publicCursorquery(Uriuri,String[]projection,Stringselection, String[]selectionArgs,StringsortOrder){ //TODOAuto-generatedmethodstub SQLiteQueryBuilderqb=newSQLiteQueryBuilder(); switch(uMatcher.match(uri)){ caseINCOMING_USER_COLLECTION: qb.setTables(UserTableMetaData.TABLE_NAME); qb.setProjectionMap(userMap); break; caseINCOMING_USER_SINGLE: qb.setTables(UserTableMetaData.TABLE_NAME); qb.setProjectionMap(userMap); qb.appendWhere(UserTableMetaData._ID+"="+ uri.getPathSegments().get(1)); break;} StringorderBy; if(TextUtils.isEmpty(sortOrder)){ orderBy=UserTableMetaData.DEFULT_SORT_ORDER;}else{ orderBy=sortOrder;} SQLiteDatabasedb=dh.getWritableDatabase(); Cursorc=qb.query(db,projection,selection, selectionArgs,null,null,sortOrder); c.setNotificationUri(getContext().getContentResolver(),uri); Log.d("sqlite","first--->>");returnc;} @Override publicintupdate(Uriuri,ContentValuesvalues,Stringselection, String[]selectionArgs){ //TODOAuto-generatedmethodstub return0;}} 3,在activity中的方法中用上这几行代码就可以进行插入 //定义插入用数据的对象,本质是一个 mapContentValuesvalues=newContentValues(); //键,值对values.put("id",1); //定义表名 Stringname=ContentProviderData.USERS_TABLE_NAME; //键值对 values.put(ContentProviderData.UserTableMetaData.USER_NAME,"tom"); //进行contentprovider的插入操作 Uriuri=getContentResolver().insert( ContentProviderData.UserTableMetaData.CONTENT_URI,values); 至于剩下的 query() delete() 自己参照文档补全吧 本文转自 liam2199 博客,原文链接:http://blog.51cto.com/youxilua/773107 如需转载请自行联系原作者

优秀的个人博客,低调大师

特殊权限-SUID,SGID,Sticky 学习笔记

SUID : 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者 chmod u+s FILENAME (添加 SUID 权限) chmod u-s FILENAME (除去SUID 权限) 如果 FILE 本身原来就有执行权限,则 SUID 显示为 s ; 否则显示 S; passwd 命令默认具有 SUID 权限 SGID :运行某程序时,相应进程的属组是程序文件自身的属组,而不是启动者 (目录有SGID权限后,在该目录下创建文件目录时,创建后的属组为目录自身的属组,) chmod g+s FILENAME (添加 SGID 权限) chmod g-s FILENAME (除去 SGID 权限) Sticky : 在一个公共目录,每个用户都可以创建文件,删除自己的文件,但不能删除别人的文件 chmod o+t DIR (添加 Sticky 权限) chmod o-t DIR (删除 Sticky 权限) 权限表示 SUID : 4 SGID : 2 Sticky : 1 chmod 1755 /tmp/test #test具有 755 权限 ( 1 : 具有 Sticky 权限 ) chmod 3755 /tmp/test #test具有 755 权限 ( 2 : 具有 SGID 权限 + 1 : 具有 Sticky 权限 ) chmod 5755 /tmp/test #test具有 755 权限 ( 4 : 具有 SUID 权限 + 1 : 具有 Sticky 权限 ) SUID : 实例测试 让一个普通用户对指定文件具有原本没有的查看权限 (user1用户可以查看 /etc/shadow 文件) 1 2 3 4 5 6 7 8 9 10 11 12 13 [root@nono~] #useradduser1#添加用户user1 [root@nono~] #passwduser1 [root@nono~] #ls-l/etc/shadow#查看/etc/shadow文件,权限为000,所以除root用户都不能查看 ----------.1rootroot10537月309:54 /etc/shadow [root@nono~] #su-user1#切换到user1用户,应为/etc/ [user1@nono~]$ cat /etc/shadow #user1用户没有权限查看 cat : /etc/shadow :权限不够 [root@beiyong2~] #chmodu+s/bin/cat#将/bin/cat命令添加SUID命令,则cat命令的执行者为文件自身的属主,而不是启动者 [root@beiyong2~] #ls-l/bin/cat#SUID命令添加成功(若/bin/cat本身就有执行权限,添加SUID命令后,显示为s否则为S) -rwsr-xr-x.1rootroot4856810月152014 /bin/cat [user1@beiyong2~]$ cat /etc/shadow #user1可以查看 bin:*:15980:0:99999:7::: daemon:*:15980:0:99999:7::: SGID : 实例测试 三个用户可以在同一目录中,创建文件目录,并互相修改文件内容 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 [user1@beiyong2~]$ tail -5 /etc/passwd #当前系统中有三个用户 user1:x:500:500:: /home/user1 : /bin/bash hbase:x:501:501:: /home/hbase : /bin/bash hadoop:x:502:502:: /home/hadoop : /bin/bash [root@beiyong2tmp] #mkdirproject#在/tmp目录中创建新目录/project [root@beiyong2tmp] #groupadddevelopteam#添加developteam用户组 [root@beiyong2tmp] #chown-R:developteam/tmp/project#将/tmp/project目录的属组改为developteam [root@beiyong2tmp] #ls-ldproject drwxr-xr-x.2rootdevelopteam40967月902:15project [root@beiyong2tmp] #usermod-a-Gdevelopteamuser1#分别将三个用户的附加组改为developteam [root@beiyong2tmp] #usermod-a-Gdevelopteamhadoop [root@beiyong2tmp] #usermod-a-Gdevelopteamhbase [root@beiyong2project] #ls-ld#查看project目录的权限,属组没有写权限,则添加 drwxr-xr-x.2rootdevelopteam40967月902:15. [root@beiyong2project] #chmodg+w/tmp/project [root@beiyong2project] #ls-ld drwxrwxr-x.2rootdevelopteam40967月902:15. [root@beiyong2project] #ll#分别用三个账号在/tmp/project目录中创建文件(a.*),没有权限编辑其他人的文件 -rw-rw-r--.1hadoophadoop07月902:33a.hadoop -rw-rw-r--.1hbasehbase07月902:34a.hbase -rw-rw-r--.1user1user107月902:33a.user1 [root@beiyong2~] #chmodg+s/tmp/project#给/tmp/project目录添加SGID权限 [root@beiyong2~] #ls-ld/tmp/project drwxrwsr-x.2rootdevelopteam40967月902:34 /tmp/project [root@beiyong2project] #ll#添加SGID权限后,用三个用户分别在/tmp/project目录下创建文件(b.*) 总用量0 -rw-rw-r--.1hadoophadoop07月902:33a.hadoop -rw-rw-r--.1hbasehbase07月902:34a.hbase -rw-rw-r--.1user1user107月902:33a.user1 -rw-rw-r--.1hadoopdevelopteam07月902:37b.hadoop -rw-rw-r--.1hbasedevelopteam07月902:37b.hbase -rw-rw-r--.1user1developteam07月902:37b.user1 三个用户创建的文件,属组均为developteam,故可以互相编辑删除对方文件 Sticky : 实例测试 同一目录下用户可以创建文件并互相修改,但不能删除对方的文件 1 2 3 4 5 [root@beiyong2project] #chmodo+t/tmp/project#给/tmp/project添加Sticky权限,(原有执行权限t,否则T) [root@beiyong2project] #ls-ld drwxrwsr-t.2rootdevelopteam40967月902:42. [hadoop@beiyong2project]$ rm -rfa.hbase #用hadoop用户身份去删除hbase用户的文件,删除失败(只能删除自己的文件目录) rm :无法删除 "a.hbase" :不允许的操作 完毕~~~ 本文转自 mlwzby 51CTO博客,原文链接:http://blog.51cto.com/aby028/1814364

优秀的个人博客,低调大师

openstack学习笔记一 RDO模式安装

SaaS 软件即服务 PasS 平台 IaaS 基础设施 XaaS 一切皆服务 openstack版本 liberty版本 自由 mitaka版本 最新版 [日本] 三鹰 开源项目:RDO packstack工具来安装openstack alinone 所有的组件全部安装,而且不好定制,只适合于测试环境 注意:当我们使用alinone安装的时候,会从互联网上下载一个镜像cirros 应答文件 环境: [root@h1 ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 网络配置: 控制节点: 192.168.1.201 h1.hequan.com h1 结算节点: 192.168.1.202 h2.hequan.com h2 openstack RDO安装 1 2 3 4 [root@h1~] #systemctlis-activeNetworkManager active [root@h1~] #systemctlstopNetworkManager [root@h1~] #systemctldisableNetworkManager 软件 http://mirrors.163.com/centos/7.2.1511/cloud/x86_64/ 根据版本下载下来, 此次安装的是liberty版本 修改yum源 1 2 3 4 5 6 [openstack] name=openstack baseurl= ##把下载的软件放到此目录 enabled=1 gpgcheck=0 yumcleanall 1 2 3 4 5 6 7 8 9 10 11 12 13 [root@h1openstack] #yumlistopenstack-packstack 已加载插件:fastestmirror dvd|3.6kB00:00:00 openstack|2.9kB00:00:00 (1 /3 ):dvd /group_gz |155kB00:00:00 (2 /3 ):openstack /primary_db |656kB00:00:00 (3 /3 ):dvd /primary_db |2.8MB00:00:00 Determiningfastestmirrors 可安装的软件包 openstack-packstack.noarch1:7.0.0-0.10.dev1682.g42b3426.el7openstack yum install openstack-packstack alinonea安装方式 1 2 3 4 5 [root@h1openstack] #packstack--help|grepdemo Provisioningdemoconfig: --provision-demo=PROVISION_DEMO Specify 'y' toprovision for demousageandtesting. [root@h1openstack] #packstack--allinone--provision-demo=n##全部安装 应答文件安装 1 2 3 4 5 6 7 8 9 10 11 12 13 [root@h1~] #packstack--help|grepans --gen-answer- file =GEN_ANSWER_FILE Generateatemplateofananswer file . --answer- file =ANSWER_FILE [root@h1~] #packstack--gen-answer-file=he.txt 67CONFIG_NAGIOS_INSTALL=n 1116CONFIG_PROVISION_DEMO=n [root@h1~] #grep_PWhe.txt [root@h1~] #sed-i.bak-r's/(.+_PW)=.+/\1=hequan/'he.txt##替换密码 [root@h1~] #packstack--answer-file=he.txt##开始安装 1 2 3 4 5 6 7 8 9 ****Installationcompletedsuccessfully****** Additionalinformation: *Timesynchronizationinstallationwasskipped.Pleasenotethatunsynchronized time onserverinstancesmightbeproblem for someOpenStackcomponents. *File /root/keystonerc_admin hasbeencreatedonOpenStackclienthost192.168.1.201.Tousethe command linetoolsyouneedto source the file . *ToaccesstheOpenStackDashboardbrowsetohttp: //192 .168.1.201 /dashboard . Please, find yourlogincredentialsstored in thekeystonerc_admin in yourhomedirectory. *TouseNagios,browsetohttp: //192 .168.1.201 /nagios username:nagiosadmin,password:hequan *Theinstallationlog file isavailableat: /var/tmp/packstack/20160704-140637-VHTW2y/openstack-setup .log *Thegeneratedmanifestsareavailableat: /var/tmp/packstack/20160704-140637-VHTW2y/manifests 1 2 3 4 5 6 7 8 [root@h1~] #catkeystonerc_admin unset OS_SERVICE_TOKEN export OS_USERNAME=admin export OS_PASSWORD=hequan export OS_AUTH_URL=http: //192 .168.1.201:5000 /v2 .0 export PS1= '[\u@\h\W(keystone_admin)]\$' export OS_TENANT_NAME=admin export OS_REGION_NAME=RegionOne 登陆后,右上角点击admin 密码hequan 设置语言 时区 添加节点 结算节点: 192.168.1.202 h2.hequan.com h2 同上 配置yum 和openstack软件环境 1 2 [root@h1~] #ssh-keygen [root@h1~] #ssh-copy-id-i.ssh/id_rsa.pubh2 1 2 3 4 vimhe.txt 84 #ListtheserversonwhichtoinstalltheComputeservice. 85CONFIG_COMPUTE_HOSTS=192.168.1.201,192.168.1.202 ##只要在文件里面添加上节点,再次执行就可以了。 packstack--answer- file =he.txt ##再次执行,不会覆盖原来的 本文转自 295631788 51CTO博客,原文链接:http://blog.51cto.com/hequan/1795664,如需转载请自行联系原作者

优秀的个人博客,低调大师

新浪微博布局学习——活用RelativeLayout

正文 一、效果图 格子布局效果: (图一) 居中正在加载的效果: (图二) 二、实现代码 2.1 实现 图一 效果代码 < RelativeLayout android:id ="@id/rlDigest" android:background ="@drawable/panel_bg" android:layout_width ="fill_parent" android:layout_height ="100.0dip" android:layout_margin ="10.0dip" > < TextView android:textSize ="16.0sp" android:textColor ="#ff7d899d" android:gravity ="center_vertical" android:id ="@id/tvAddress" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:layout_marginLeft ="5.0dip" android:layout_marginTop ="10.0dip" android:text ="@string/userinfo_address" android:layout_alignParentLeft ="true" android:layout_alignParentTop ="true" /> < TextView android:textSize ="16.0sp" android:textColor ="#ff373737" android:id ="@id/tvAddress_content" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:layout_marginLeft ="10.0dip" android:layout_toRightOf ="@id/tvAddress" android:layout_alignTop ="@id/tvAddress" /> < View android:id ="@id/vHDivider" android:background ="@drawable/horizontal_separation_line_repeat" android:layout_width ="fill_parent" android:layout_height ="1.0dip" android:layout_centerVertical ="true" /> < TextView android:textSize ="16.0sp" android:textColor ="#ff7d899d" android:gravity ="center_vertical" android:id ="@id/tvAccount_info" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:text ="@string/account_info" android:layout_below ="@id/vHDivider" android:layout_alignLeft ="@id/tvAddress" android:layout_alignParentBottom ="true" /> < TextView android:textSize ="16.0sp" android:textColor ="#ff373737" android:gravity ="center_vertical" android:id ="@id/tvAccount_info_content" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:layout_marginLeft ="10.0dip" android:layout_marginBottom ="12.0dip" android:singleLine ="true" android:layout_toRightOf ="@id/tvAccount_info" android:layout_alignBottom ="@id/tvAccount_info" /> </ RelativeLayout > < RelativeLayout android:background ="@drawable/panel_bg" android:layout_width ="fill_parent" android:layout_height ="130.0dip" android:layout_margin ="10.0dip" > < View android:id ="@id/vVDivider1" android:background ="@drawable/vertical_separation_line_repeat" android:layout_width ="1.0dip" android:layout_height ="fill_parent" android:layout_centerHorizontal ="true" /> < View android:id ="@id/vHDivider2" android:background ="@drawable/horizontal_separation_line_repeat" android:layout_width ="fill_parent" android:layout_height ="1.0dip" android:layout_centerVertical ="true" /> < RelativeLayout android:id ="@id/llAttention" android:background ="@drawable/bg_panel_above_left" android:clickable ="true" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:layout_toLeftOf ="@id/vVDivider1" android:layout_above ="@id/vHDivider2" android:layout_alignParentLeft ="true" android:layout_alignParentTop ="true" > < TextView android:gravity ="center" android:id ="@id/tvAttention_count" android:layout_width ="fill_parent" android:layout_height ="wrap_content" android:layout_marginTop ="10.0dip" android:text ="0" android:layout_centerHorizontal ="true" style ="@style/userinfo_panel_textview_count" /> < TextView android:gravity ="center" android:id ="@id/tvAttention" android:layout_width ="fill_parent" android:layout_height ="wrap_content" android:text ="@string/attention" android:layout_below ="@id/tvAttention_count" android:layout_centerHorizontal ="true" style ="@style/userinfo_panel_textview_title" /> </ RelativeLayout > < LinearLayout android:orientation ="vertical" android:id ="@id/rlWeibo" android:background ="@drawable/bg_panel_above_right" android:clickable ="true" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:layout_toRightOf ="@id/vVDivider1" android:layout_above ="@id/vHDivider2" android:layout_alignParentTop ="true" android:layout_alignParentRight ="true" > < TextView android:gravity ="center" android:layout_gravity ="center_horizontal" android:id ="@id/tvWeibo_count" android:layout_width ="fill_parent" android:layout_height ="wrap_content" android:layout_marginTop ="10.0dip" android:text ="0" style ="@style/userinfo_panel_textview_count" /> < TextView android:gravity ="center" android:layout_gravity ="center_horizontal" android:id ="@id/tvTopic" android:layout_width ="fill_parent" android:layout_height ="wrap_content" android:text ="@string/radio_button_topic" style ="@style/userinfo_panel_textview_title" /> </ LinearLayout > < LinearLayout android:orientation ="vertical" android:id ="@id/llFans" android:background ="@drawable/bg_panel_below_left" android:clickable ="true" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:layout_toLeftOf ="@id/vVDivider1" android:layout_below ="@id/vHDivider2" android:layout_alignParentLeft ="true" android:layout_alignParentBottom ="true" > < TextView android:gravity ="center" android:layout_gravity ="center_horizontal" android:id ="@id/tvFans_count" android:layout_width ="fill_parent" android:layout_height ="wrap_content" android:layout_marginTop ="10.0dip" android:text ="0" style ="@style/userinfo_panel_textview_count" /> < TextView android:gravity ="center" android:layout_gravity ="center_horizontal" android:id ="@id/tvFans" android:layout_width ="fill_parent" android:layout_height ="wrap_content" android:text ="@string/fans" style ="@style/userinfo_panel_textview_title" /> </ LinearLayout > < LinearLayout android:orientation ="vertical" android:id ="@id/llTopic" android:background ="@drawable/bg_panel_below_right" android:clickable ="true" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:layout_toRightOf ="@id/vVDivider1" android:layout_below ="@id/vHDivider2" android:layout_alignParentRight ="true" android:layout_alignParentBottom ="true" > < TextView android:gravity ="center" android:layout_gravity ="center_horizontal" android:id ="@id/tvTopic_count" android:layout_width ="fill_parent" android:layout_height ="wrap_content" android:layout_marginTop ="10.0dip" android:text ="0" style ="@style/userinfo_panel_textview_count" /> < TextView android:gravity ="center" android:layout_gravity ="center_horizontal" android:id ="@id/tvTopic" android:layout_width ="fill_parent" android:layout_height ="wrap_content" android:text ="@string/his_topics" style ="@style/userinfo_panel_textview_title" /> </ LinearLayout > </ RelativeLayout > 代码说明: 2.1.1 第一个RelativeLayout为图一上的实现代码。注意使用了一个View,也就是一条横线,令其居中布局;"地址:"的TextView通过layout_alignParentLeft和layout_alignParentTop令其在整个RelativeLayout顶左顶上;"账号信息:"的TextView通过layout_below令其位于横线下方,layout_alignLeft令其与"地址:"的TextView左边对齐,然后用layout_alignParentBottom让其居于容器底部。 2.1.2 第二个RelativeLayout为图一下的实现代码。关键是vVDivider1和vVDivider2,与3.1.1类似,画出了一个十字架的布局,然后分别用居左、居上、居下、居右等方式实现了该布局效果。 2.2 实现 图二 效果代码 < RelativeLayout android:id ="@+id/rlpb" android:layout_width ="fill_parent" android:background ="#ffeff0f4" android:visibility ="gone" android:layout_height ="fill_parent" android:layout_weight ="1.0" > < LinearLayout android:layout_centerInParent ="true" android:layout_width ="wrap_content" android:layout_height ="wrap_content" > < ProgressBar android:id ="@+id/prb" style ="?android:attr/progressBarStyleSmallTitle" android:layout_width ="wrap_content" android:layout_height ="wrap_content" /> < TextView android:text ="@string/loadinfo" android:layout_width ="wrap_content" android:layout_height ="wrap_content" /> </ LinearLayout > </ RelativeLayout > 代码说明: 主要是layout_centerInParent属性的应用,令其居于RelativeLayout的中间。使用的时候领ListView先隐藏,然后让这个布局显示并填充,用完在设置Visible为GONE即可。 三、总结 熟练掌握以下重要属性,并灵活运用: android:layout_centerInParent 居中布局 android:layout_centerVertical 水平居中布局 android:layout_centerHorizontal 垂直居中布局 android:layout_alignParentTop 居于容器内顶部 android:layout_alignParentBottom 居于容器内底部 android:layout_alignParentLeft 居于容器内左边 android:layout_alignParentRight 居于容器内右边 android:layout_above 居于指定View的上方 android:layout_below 居于指定View的下方 android:layout_toRightOf 在指定View的右边 android:layout_toLeftOf 在指定View的左边 android:layout_alignTop 与指定View的Top一致 本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/582146,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android学习笔记--SQLite使用方法

SQLite介绍 http://www.sqlite.org 官方网站 小型关系数据库 SQLiteOpenHelper使用方法 getReadableDatabase() getWritableDatabase() onCreate(SQLiteDatabasedb) onOpen(SQLiteDatabasedb) onUpgrade(SQLiteDatabsedb,intoldVersion,intnewVersion) Close(); //DatabaseHelper所为一个访问SQLite的助手类,提供两个方面的功能 //第一,getReadableDatabase()和getWritableDatabasr()可以获得SQLiteDatabase对象 //第二,提供onCreate和onUpgrade两个回调函数,允许我们在创建和升级数据库时,进行操作 例:publicclassDatabaseHelperextendsSQLiteOpenHelper{ //数据库版本号 PrivatestaticfinalintVERSION=1; //必须的构造函数 PublicDatabaseHelper(Contextcontext,Stringname,CursorFactoryfactory,intversion){ Super(context,name,factory,version); } PublicDatabaseHelper(Contextcontext,Stringname,intversion){ Super(context,name,null,version); } PublicDatabaseHelper(Contextcontext,Stringname){ Super(context,name,null,VERSION); } PublicvoidonCreate(SQLiteDatabasedb){ System.out.println("createadatabase"); Db.execSQL("createtableuser(idint,namevarchar(20))"); } PublicvoidonUpgrade(SQLiteDatabasedb){ System.out.println("updateadatabase"); } } 对SQLite的增删查改 Activity操作数据库例: 1.声明控件对象(略) 2.获得控件对象(略) 3.绑定事件(略) 4.创建监听器对象(调用DatabaseHelper) //创建一个数据库 PublicvoidonClick(Viewv){ //当前的activity,还有数据名 DatabaseHelperdbHelper=newDatabaseHelper(SQLiteActivity.this,"test_db"); SQLiteDatabasedb=dbHelper.getReadableDatabase();//此时才会创建一个数据库 } //修改一个数据库 PublicvoidonClick(Viewv){ //当前的activity,还有数据名 DatabaseHelperdbHelper=newDatabaseHelper(SQLiteActivity.this,"test_db",2);//版本号变了 SQLiteDatabasedb=dbHelper.getReadableDatabase(); } //插入操作 PublicvoidonClick(Viewv){ //生成ContentValues对象 ContentValuesvalues=newContentValues(); //key是列名,value是值,值必须对应数据库列数据类型 Values.put("id",1); Values.put("name","zhangsan"); //当前的activity,还有数据名 DatabaseHelperdbHelper=newDatabaseHelper(SQLiteActivity.this,"test_db"); //得到可写数据库 SQLiteDatabasedb=dbHelper.getWritableDatabase(); //1.表名2,不允许空列3,值 Db.insert("user",null,values); } //更新操作 PublicvoidonClick(Viewv){ //当前的activity,还有数据名 DatabaseHelperdbHelper=newDatabaseHelper(SQLiteActivity.this,"test_db"); //得到可写数据库 SQLiteDatabasedb=dbHelper.getWritableDatabase(); //1.表名2,不允许空列3,值 //生成ContentValues对象 ContentValuesvalues=newContentValues(); //key是列名,value是值,值必须对应数据库列数据类型 Values.put("name","zhangsanfeng"); //1.表名2.值,3,where子句(不包括where)4,为占位符赋值 Db.update("user",values,"id=?",newString[]{"1"}); } //查询数据库 PublicvoidonClick(Viewv){ //当前的activity,还有数据名 DatabaseHelperdbHelper=newDatabaseHelper(SQLiteActivity.this,"test_db");//版本号变了 SQLiteDatabasedb=dbHelper.getReadableDatabase(); //1,表名2所要查询的列名3,筛选器4,筛选器值5.groupby6.having //7orderby创建游标对象读取数据 Cursorcursor=db.query("user","newString[]{"id","name"}","id=?") While(cursor.moveToNext()){ Stringname=cursor.getString(cursor.getColumnIndex("name")); System.out.println("query--->"+name); } } //删除操作 PublicvoidonClick(Viewv){ //当前的activity,还有数据名 DatabaseHelperdbHelper=newDatabaseHelper(SQLiteActivity.this,"test_db"); //得到可写数据库 SQLiteDatabasedb=dbHelper.getWritableDatabase(); //1.表名2.值,3,where子句(不包括where)4,为占位符赋值 Db.delete("user",values,"id=?",newString[]{"1"}); } 使用adb访问SQLite(linux命令行调试)abdshell=>ls-i=>cddata=>创建了数据库之后=>报名.数据库名=>即可进入该SQLite SQLite语句.schema//查看所有表 Linux知识补习:cd目录(进入目录)ls(查看当前目录) 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360571,如需转载请自行联系原作者

优秀的个人博客,低调大师

PHPUnit学习02---如何管理TestCase

本文目的 本文介绍了phpunit通用函数用法,整体架构,和如何使用TestSuite来管理项目的所有的测试用例。 批量运行 当配置好phpunit后,可以使用“phpunit someTestCase”命令执行单个用例,使得用例的执行很方便。但是如果testcase分散到多个文件中,一个一个的执行phpunit就变得很麻烦了。好在,phpunit命令提供了一些可选参数,可以使得批量处理Test Case变得容易,可以直接执行phpunit查看这些可选参数,如下所示: 上图中,红圈标注的地方就是用于批量运行测试用例的参数,同时,phpunit也可以默认的执行指定目录下*Test.php文件中的测试用例,并且是迭代的遍历所有子目录,如下面的例子: 在test/UnitTestDemo目录下面四个文件,只有两个文件是以*Test.php格式结尾,所以运行“phpunit test”命令可以批量的运行这些符合要求的用例。如果你希望更细粒度的控制执行特定用例,可以使用“--filter”参数,该参数通过过滤用例文件名称来执行特定文件中的测试用例。 命名约定 PHPUnit中默认的命令规则,可以使得运行测试用例变得十分方便。列举如下: 自动执行每个TestCase类中test***形式的方法 自动执行目录下*Test.php形式命名中的用例 一旦遵守了这些命名约定,编写单元测试将会更加便捷。 setUp和tearDown setUp和tearDown可以帮助我们搭建和清理测试环境,TestCase和TestSuite两个类均有这对函数,可以共用户重载。但是,需要注意这两对函数调用的时机不一样,在TestCase中,每一次test***方法调用前均会调用setUp方法,调用后均会调用tearDown方法。但是,在TestSuite中,只会在第一个testCase调用之前调用setup,最后一个testCase调用后,调用tearDown。可以通过下面的例子,了解整个调用过程。 代码如下: MySuite.php 1 2 3 4 5 6 7 <?php require_once 'MyTest.php' ; class MySuite extends PHPUnit_Framework_TestSuite { public static function suite() { 1 2 3 4 5 6 7 8 9 10 11 12 13 return new MySuite( 'MyTest' ); } protected function setUp() { print "\nMySuite::setUp()" ; } protected function tearDown() { print "\nMySuite::tearDown()" ; } } ?> MyTest.php 1 2 3 4 5 6 7 <?php class MyTest extends PHPUnit_Framework_TestCase { protected function setUp() { print "\nMyTest::setUp()" ; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 protected function tearDown() { print "\nMyTest::tearDown()" ; } public function testOne() { print "\nMyTest::testOne()" ; } public function testTwo() { print "\nMyTest::testTwo()" ; } } ?> PHPUnit系统架构 上图展示的PHPUnit库的架构,看起来是不是似曾相识?如果你了解设计模式,应该不难发现PHPUnit的整体架构采用的“组合设计模式”,定义如下: (组合设计模式将对象以树形结构组织起来,以达成“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性.组合设计模式比较容易理解,它就是一个树形结构图。组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时,组合设计模式将遍历整个树形结构,寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形容。组合设计模式好处:1.使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关心自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。) 注意:为了简洁,描述上图对象时,均省略掉“PHPUnit2_Framework_”前缀。所以,使用Test作为统一的接口, TestCase是测试用用例,继承于Assert,这样可以方便的调用Assert中的各种断言函数。TestSuite,是一个Test的集合,他可以包含任意的TestCase或TestSuite。这样设计的好处不言而喻——方便的组织测试用例和测试套件,客户代码不必关执行的是单个测试用例还是一整套测试套件或是更为复杂的测试用例树。 使用testsuite管理所有测试用例 有了上面的知识,现在就可以使用TestSuite对象管理和组织你的测试用例了。我们有如下四个测试用例需要组织: 希望将Stack相关的测试一起运行,其他用例一起运行,并且在需要时,所有的用例可以全部运行,那么就创建如下三个测试套件对象。 上面的测试套件只添加Stack相关的测试,运行结果如下: 上面的测试套件只添加其他测试用例,运行结果如下: 如果希望运行所有的套件,可以使用上面的测试套件进行组织,运行结果如下: 通过上面代码中画圈的部分,可以发现一些共性: 1) 测试套件类集成与PHPUnit_Framework_TestSuite类; 2) 测试套件类必须实现public static function suite(){/*必须返回测试套件对象*/}接口; 3) 通过addTestSuite(‘Test Case Class Name’),将具体的测试用例添加到测试套件中。 如果在真实的项目中,可以以模块为单位组织测试套件。如过模块过大,可以在模块内部继续划分测试套件,这样,形成一个树装结构,需要运行那部分测试用例,只需要敲入一行命令“phpunit XXXXTestSuite.php”,就可以轻松执行(上面的代码见附件)。合理的使用测试套件,可以简洁有效的组织所有测试用例。 参考文献 PHPUnit官方手册http://www.phpunit.de/manual/3.4/en/organizing-tests.html 组合设计模式http://www.jdon.com/designpatterns/composite.htm 声明:如有转载本博文章,请注明出处。您的支持是我的动力!文章部分内容来自互联网,本人不负任何法律责任。 本文转自bourneli博客园博客,原文链接:http://www.cnblogs.com/bourneli/archive/2012/04/27/2474005.html ,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册