口是心非
2013年1月11日金曜日
Android学习笔记之AndroidManifest.xml文件解析
一、关于AndroidManifest.xml
AndroidManifest.xml 是每个android程序中必须的文件。它位于整个项目的根目录,描述了package中暴露的组件(activities, services, 等等),他们各自的实现类,各种能被处理的数据和启动位置。 除了能声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,还能指定permissions和instrumentation(安全控制和测试)
二、AndroidManifest.xml结构
三、各个节点的详细介绍
上面就是整个am(androidManifest).xml的结构,下面以外向内开始阐述~~
1、第一层():(属性)
A、xmlns:android
定义android命名空间,一般为http://schemas.android.com/apk/res/android,这样使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。
B、package
指定本应用内java主程序包的包名,它也是一个应用进程的默认名称
C、sharedUserId
表明数据权限,因为默认情况下,Android给每个APK分配一个唯一的UserID,所以是默认禁止不同APK访问共享数据的。若要共享数据,第一可以采用Share Preference方法,第二种就可以采用sharedUserId了,将不同APK的sharedUserId都设为一样,则这些APK之间就可以互相共享数据了。详见:http://wallage.blog.163.com/blog/static/17389624201011010539408/
D、sharedUserLabel
一个共享的用户名,它只有在设置了sharedUserId属性的前提下才会有意义
E、versionCode
是给设备程序识别版本(升级)用的必须是一个interger值代表app更新过多少次,比如第一版一般为1,之后若要更新版本就设置为2,3等等。。。
F、versionName
这个名称是给用户看的,你可以将你的APP版本号设置为1.1版,后续更新版本设置为1.2、2.0版本等等。。。
G、installLocation
安装参数,是Android2.2中的一个新特性,installLocation有三个值可以选择:internalOnly、auto、preferExternal
选择preferExternal,系统会优先考虑将APK安装到SD卡上(当然最终用户可以选择为内部ROM存储上,如果SD存储已满,也会安装到内部存储上)
选择auto,系统将会根据存储空间自己去适应
选择internalOnly是指必须安装到内部才能运行
(注:需要进行后台类监控的APP最好安装在内部,而一些较大的游戏APP最好安装在SD卡上。现默认为安装在内部,如果把APP安装在SD卡上,首先得设置你的level为8,并且要配置android:installLocation这个参数的属性为preferExternal)
2、第二层():属性
一个AndroidManifest.xml中必须含有一个Application标签,这个标签声明了每一个应用程序的组件及其属性(如icon,label,permission等)
A、android:allowClearUserData('true' or 'false')
用户是否能选择自行清除数据,默认为true,程序管理器包含一个选择允许用户清除数据。当为true时,用户可自己清理用户数据,反之亦然
B、android:allowTaskReparenting('true' or 'false')
是否允许activity更换从属的任务,比如从短信息任务切换到浏览器任务
C、android:backupAgent
这也是Android2.2中的一个新特性,设置该APP的备份,属性值应该是一个完整的类名,如com.project.TestCase,此属性并没有默认值,并且类名必须得指定(就是个备份工具,将数据备份到云端的操作)
D、android:debuggable
这个从字面上就可以看出是什么作用的,当设置为true时,表明该APP在手机上可以被调试。默认为false,在false的情况下调试该APP,就会报以下错误:
Device XXX requires that applications explicitely declare themselves as debuggable in their manifest.
Application XXX does not have the attribute 'debuggable' set to TRUE in its manifest and cannot be debugged.
E、android:description/android:label
此两个属性都是为许可提供的,均为字符串资源,当用户去看许可列表(android:label)或者某个许可的详细信息(android:description)时,这些字符串资源就可以显示给用户。label应当尽量简短,之需要告知用户该许可是在保护什么功能就行。而description可以用于具体描述获取该许可的程序可以做哪些事情,实际上让用户可以知道如果他们同意程序获取该权限的话,该程序可以做什么。我们通常用两句话来描述许可,第一句描述该许可,第二句警告用户如果批准该权限会可能有什么不好的事情发生
F、android:enabled
Android系统是否能够实例化该应用程序的组件,如果为true,每个组件的enabled属性决定那个组件是否可以被 enabled。如果为false,它覆盖组件指定的值;所有组件都是disabled。
G、android:hasCode('true' or 'false')
表示此APP是否包含任何的代码,默认为true,若为false,则系统在运行组件时,不会去尝试加载任何的APP代码
一个应用程序自身不会含有任何的代码,除非内置组件类,比如Activity类,此类使用了AliasActivity类,当然这是个罕见的现象
(在Android2.3可以用标准C来开发应用程序,可在androidManifest.xml中将此属性设置为false,因为这个APP本身已经不含有任何的JAVA代码了)
H、android:icon
这个很简单,就是声明整个APP的图标,图片一般都放在drawable文件夹下
I、android:killAfterRestore
J、android:manageSpaceActivity
K、android:name
为应用程序所实现的Application子类的全名。当应用程序进程开始时,该类在所有应用程序组件之前被实例化。
若该类(比方androidMain类)是在声明的package下,则可以直接声明android:name="androidMain",但此类是在package下面的子包的话,就必须声明为全路径或android:name="package名称.子包名成.androidMain"
L、android:permission
设置许可名,这个属性若在上定义的话,是一个给应用程序的所有组件设置许可的便捷方式,当然它是被各组件设置的许可名所覆盖的
M、android:presistent
该应用程序是否应该在任何时候都保持运行状态,默认为false。因为应用程序通常不应该设置本标识,持续模式仅仅应该设置给某些系统应用程序才是有意义的。
N、android:process
应用程序运行的进程名,它的默认值为元素里设置的包名,当然每个组件都可以通过设置该属性来覆盖默认值。如果你想两个应用程序共用一个进程的话,你可以设置他们的android:process相同,但前提条件是他们共享一个用户ID及被赋予了相同证书的时候
O、android:restoreAnyVersion
同样也是android2.2的一个新特性,用来表明应用是否准备尝试恢复所有的备份,甚至该备份是比当前设备上更要新的版本,默认是false
P、android:taskAffinity
拥有相同的affinity的Activity理论上属于相同的Task,应用程序默认的affinity的名字是元素中设定的package名
Q、android:theme
是一个资源的风格,它定义了一个默认的主题风格给所有的activity,当然也可以在自己的theme里面去设置它,有点类似style。
3、第三层():属性
(注:有些在application中重复的就不多阐述了)
1、android:alwaysRetainTaskState
是否保留状态不变, 比如切换回home, 再从新打开,activity处于最后的状态。比如一个浏览器拥有很多状态(当打开了多个TAB的时候),用户并不希望丢失这些状态时,此时可将此属性设置为true
2、android:clearTaskOnLaunch
比如 P 是 activity, Q 是被P 触发的 activity, 然后返回Home, 重新启动 P,是否显示 Q
3、android:configChanges
当配置list发生修改时, 是否调用 onConfigurationChanged() 方法 比如 "locale|navigation|orientation".
这个我用过,主要用来看手机方向改变的. android手机在旋转后,layout会重新布局, 如何做到呢?
正常情况下. 如果手机旋转了.当前Activity后杀掉,然后根据方向重新加载这个Activity. 就会从onCreate开始重新加载.
如果你设置了 这个选项, 当手机旋转后,当前Activity之后调用onConfigurationChanged() 方法. 而不跑onCreate方法等.
4、android:excludeFromRecents
是否可被显示在最近打开的activity列表里,默认是false
5、android:finishOnTaskLaunch
当用户重新启动这个任务的时候,是否关闭已打开的activity,默认是false
如果这个属性和allowTaskReparenting都是true,这个属性就是王牌。Activity的亲和力将被忽略。该Activity已经被摧毁并非re-parented
6、android:launchMode(Activity加载模式)
在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。这需要为Activity配置特定的加载模式,而不是使用默认的加载模式
Activity有四种加载模式:
standard、singleTop、singleTask、singleInstance(其中前两个是一组、后两个是一组),默认为standard
standard:就是intent将发送给新的实例,所以每次跳转都会生成新的activity。
singleTop:也是发送新的实例,但不同standard的一点是,在请求的Activity正好位于栈顶时(配置成singleTop的Activity),不会构造新的实例
singleTask:和后面的singleInstance都只创建一个实例,当intent到来,需要创建设置为singleTask的Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。
singleInstance:
首先说明一下task这个概念,Task可以认为是一个栈,可放入多个Activity。比如启动一个应用,那么Android就创建了一个Task,然后启动这个应用的入口Activity,那在它的界面上调用其他的Activity也只是在这个task里面。那如果在多个task中共享一个Activity的话怎么办呢。举个例来说,如果开启一个导游服务类的应用程序,里面有个Activity是开启GOOGLE地图的,当按下home键退回到主菜单又启动GOOGLE地图的应用时,显示的就是刚才的地图,实际上是同一个Activity,实际上这就引入了singleInstance。singleInstance模式就是将该Activity单独放入一个栈中,这样这个栈中只有这一个Activity,不同应用的intent都由这个Activity接收和展示,这样就做到了共享。当然前提是这些应用都没有被销毁,所以刚才是按下的HOME键,如果按下了返回键,则无效
7、android:multiprocess
是否允许多进程,默认是false
具体可看该篇文章:http://www.bangchui.org/simple/?t3181.html
8、android:noHistory
当用户从Activity上离开并且它在屏幕上不再可见时,Activity是否从Activity stack中清除并结束。默认是false。Activity不会留下历史痕迹
9、android:screenOrientation
activity显示的模式
默认为unspecified:由系统自动判断显示方向
landscape横屏模式,宽度比高度大
portrait竖屏模式, 高度比宽度大
user模式,用户当前首选的方向
behind模式:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
sensor模式:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换
nosensor模式:忽略物理感应器,这样就不会随着用户旋转设备而更改了
10、android:stateNotNeeded
activity被销毁或者成功重启时是否保存状态
11、android:windowSoftInputMode
activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性。
这个属性能影响两件事情:
【A】当有焦点产生时,软键盘是隐藏还是显示
【B】是否减少活动主窗口大小以便腾出空间放软键盘
各值的含义:
【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible:软键盘通常是可见的
【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
4、第四层()
结构图:
intent-filter属性
android:priority(解释:有序广播主要是按照声明的优先级别,如A的级别高于B,那么,广播先传给A,再传给B。优先级别就是用设置priority属性来确定,范围是从-1000~1000,数越大优先级别越高)
Intent filter内会设定的资料包括action,data与category三种。也就是说filter只会与intent里的这三种资料作对比动作
action属性
action很简单,只有android:name这个属性。常见的android:name值为android.intent.action.MAIN,表明此activity是作为应用程序的入口。有关android:name具体有哪些值,可参照这个网址:http://hi.baidu.com/linghtway/blog/item/83713cc1c2d053170ff477a7.html
category属性
category也只有android:name属性。常见的android:name值为android.intent.category.LAUNCHER(决定应用程序是否显示在程序列表里)
有关android:name具体有哪些值,可参照这个网址:http://chroya.javaeye.com/blog/685871
data属性
【1】每个元素指定一个URI和数据类型(MIME类型)。它有四个属性scheme、host、port、path对应于URI的每个部分:
scheme://host:port/path
scheme的值一般为"http",host为包名,port为端口号,path为具体地址。如:http://com.test.project:200/folder/etc
其中host和port合起来构成URI的凭据(authority),如果host没有指定,则port也会被忽略
要让authority有意义,scheme也必须要指定。要让path有意义,scheme+authority也必须要指定
【2】mimeType(指定数据类型),若mimeType为'Image',则会从content Provider的指定地址中获取image类型的数据。还有'video'啥的,若设置为video/mp4,则表示在指定地址中获取mp4格式的video文件
【3】而pathPattern和PathPrefix主要是为了格式化path所使用的
5、第四层
这是该元素的基本结构.可以包含在 四个元素中。
android:name(解释:元数据项的名字,为了保证这个名字是唯一的,采用java风格的命名规范,如com.woody.project.fried)
android:resource(解释:资源的一个引用,指定给这个项的值是该资源的id。该id可以通过方法Bundle.getInt()来从meta-data中找到。)
android:value(解释:指定给这一项的值。可以作为值来指定的数据类型并且组件用来找回那些值的Bundle方法:[getString],[getInt],[getFloat],[getString],[getBoolean])
6、第三层属性
是为activity创建快捷方式的,如下实例:
其中android.targetActivity是指向对应快捷方式的activity,如上述的shortcut(此Activity名)
android:label是指快捷方式的名称,而快捷方式的图标默认是给定的application图标
7、第三层
【1】service与activity同级,与activity不同的是,它不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行。比如听音乐,网络下载数据等,都是由service运行的
【2】service生命周期:Service只继承了onCreate(),onStart(),onDestroy()三个方法,第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法
【3】service与activity间的通信
Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL),Activity与service间的通信主要用IBinder负责。具体可参照:http://zhangyan1158.blog.51cto.com/2487362/491358
【4】
service标签内的属性之前已有描述,在此不重复了~
8、第三层
receiver的属性与service一样,这里就不显示了
BroadcastReceiver:用于发送广播,broadcast是在应用程序之间传输信息的一种机制,而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件,具体参照http://kevin2562.javaeye.com/blog/686787
9、第三层属性
contentProvider(数据存储)
【1】android:authorities:
标识这个ContentProvider,调用者可以根据这个标识来找到它
【2】android:grantUriPermission:
对某个URI授予的权限
【3】android:initOrder
10、第三层
用户库,可自定义。所有android的包都可以引用
11、第一层
这是在android1.6以后的新特性,支持多屏幕机制
各属性含义:这四个属性,是否支持大屏,是否支持中屏,是否支持小屏,是否支持多种不同密度
12、第二层与性能都差不多
这两者都是在描述应用所需要的硬件和软件特性,以便防止应用在没有这些特性的设备上安装。
13、第二层
描述应用所需的api level,就是版本,目前是android 2.2 = 8,android2.1 = 7,android1.6 = 4,android1.5=3
在此属性中可以指定支持的最小版本,目标版本以及最大版本
14、第二层
定义一些用于探测和分析应用性能等等相关的类,可以监控程序。在各个应用程序的组件之前instrumentation类被实例化
android:functionalTest(解释:instrumentation类是否能运行一个功能测试,默认为false)
15、、、、区别~
最常用的当属,当我们需要获取某个权限的时候就必须在我们的manifest文件中声明,此与同级,具体权限列表请看此处
通常情况下我们不需要为自己的应用程序声明某个权限,除非你提供了供其他应用程序调用的代码或者数据。这个时候你才需要使用 这个标签。很显然这个标签可以让我们声明自己的权限。比如:
那么在activity中就可以声明该自定义权限了,如:
android:permission="com.teleca.project.MY_SECURITY">
当然自己声明的permission也不能随意的使用,还是需要使用来声明你需要该权限
就是声明一个标签,该标签代表了一组permissions,而是为一组permissions声明了一个namespace。
史上最残暴业务 可让老公工资自动归集到老婆账户
“在银行,看到一个让所有已婚男士潸然泪下的服务……太残暴了这个例子……”近日,一张上海网友拍的银行业务宣传页照片在微博上引发大吐槽。该宣传页上显示,某银行“保底归集”业务功能可以让老公的工资自动“归集”到老婆账户。该业务也被广大网友吐槽为“史上对男人最残暴的银行业务”。
“欣妍和文浩新婚燕尔,小两口决定由欣妍统一掌管财务,文浩每月发工资后只留1000元,剩余的钱全部转到欣妍的账户,但是每个月要进行这样的操作很麻烦。
其实只需使用保底归集这个功能,设置一个保底金额,如1000元,招行将每天查询文浩账户余额,只要大于1000元,将把超出部分自动转账至欣妍的账户上,并且该转账业务全免费。”
这是记者在这条被广大网友热转的微博上看到的招行业务宣传册内容。从1月8日网友贴出该条业务到昨日晚间,该微博被转发近17万次,评论2万余次。不少男性网友直呼:“这么残暴的功能,是谁想出来的?”、“不能让老婆看到这个业务。”
微博红人、创新工场创始人李开复站出来点评:“新婚男士会恨死这银行的!”面对广大网友的疯狂转发,著名经济学家巴曙松在微博上解释道:“其实许多银行都有这样的业务,并非招行专有。”
据招行相关工作人员透露,广大网友吐槽的这个“最残暴业务”其实是该行去年就推出但近期在推广的“跨行资金归集”业务:持卡人只需选择开通该业务的银行卡作为主账户,其他任意银行的多张银行卡作为关联账户,并通过主账户的网银系统把多个银行关联账户管理起来,并开通资金归集,各银行账户内闲置的零散资金就能通过这个系统被归集到一起。
“我们其实是面向广大商户推广这个业务,因为这些商户不同银行的货款要实现资金归集。”招行工作人员坦言,对于不少“管家婆”来说,使用这个“跨行资金归集”功能也确实可以达到实时“收缴”老公工资的目的。
-新手段老话题
男人婚后该不该上缴工资?
这条微博引发热议,背后其实还是“男人婚后该不该上缴工资”这个有关“男女家庭财权”的老话题。只不过这次借助资金归集这项金融业务又重新被提起,“上缴工资”变得太过容易,让不少男性直呼不爽。
市民金先生认为,如果老婆需要用这种银行的现代化手段强制执行管理老公的钱袋子,那夫妻间谈何信任,并且这个做法会让男人觉得没有尊严。
市民周女士则认为,合理利用“跨行资金归集”功能是家庭理财的一种方式,可以把夫妻间散落在不同银行的账户卡的资金归集到一张卡上,统一理财管理。
当然也可能真有网友借助这项业务趁机表白。网友“一生为白”就在微博上直呼“2013年度最浪漫表白出炉了:亲爱的,我愿意成为你的保底归集!嫁给我吧!”
刚刚新婚不久的沙小姐,老公就在银行工作,她认为:“家庭财权这个事情,是夫妻间彼此相互沟通商量的结果,每对夫妻都有自己的相处之道,有默契有共识,好服务和新科技能提供便利帮上忙其实也是两全其美。”据《温州晚报》
-新闻落地
我市多家银行
可跨行归集资金
记者了解到,事实上,资金归集并不是新鲜事,而是各个银行提供的“超级网银”服务。央行早在2009年就推出了这一产品,可以实现企业“一站式”网上跨银行或同一银行财务管理,第二代系统也已于2010年上线。之后,各家银行纷纷推出了这一功能。
据记者了解,目前包括工行银行、农业银行、中国银行、招商银行、民生银行、光大银行、中信银行等都有类似相关个人网银资金归集产品。大多数银行表示,由于在超级网银推广期,因此不向用户收取相关费用。
民生银行江东支行相关人士表示,事实上,该功能对一些商户、理财客户、个贷还款客户等最为方便。如做连锁水果店的马小姐,开了三家分店,开通“保底归集”功能后,三个分店的财务人员不需要转账,每天都可将大钱自动归集到马小姐的账上。
值得一提的,对于资金归集的方式,各家银行则有所不同。以招商银行资金归集系统为例,可以提供“全额归集”、“保底归集”和“智能归集”三种不同的归集金额:全额归集,就是说将关联账户中的资金全部归集到主账户中;保底归集,是对关联账户留存的资金进行设定,比如为1万元,超出保底金额的资金都归集到主账户中;智能归集是指为关联账户设置一个余额上限和下限,当关联账户余额大于上限时,自动把超出部分转账至主账户,当关联账户余额小于下限时,自动把差额部分从主账户转至关联账户。
此外,“跨行资金归集”操作起来也简单。招商银行明州支行相关人士向记者表示,客户只需登录相关银行网银进行关联账户签约授权,并填好相关设定,就可以自动实现资金归集。根据人行超级网银的规定,系统单笔支付限额为5万元,实时到账。
2013年1月10日木曜日
如何提高执行力
何谓执行力?执行力“就是按质按量地完成工作任务”的能力。个人执行力的强弱取决于两个要素——个人能力和工作态度,能力是基础,态度是关键。所以,我们要提升个人执行力,一方面是要通过加强学习和实践锻炼来增强自身素质,而更重要的是要端正工作态度。那么,如何树立积极正确的工作态度?我认为,关键是要在工作中实践好“严、实、快、新”四字要求。
一要着眼于“严”,积极进取,增强责任意识。责任心和进取心是做好一切工作的首要条件。责任心强弱,决定执行力度的大小;进取心强弱,决定执行效果的好坏。
因此,要提高执行力,就必须树立起强烈的责任意识和进取精神,坚决克服不思进取、得过且过的心态。把工作标准调整到最高,精神状态调整到最佳,自我要求调整到最严,认认真真、尽心尽力、不折不扣地履行自己的职责。决不消极应付、敷衍塞责、推卸责任。养成认真负责、追求卓越的良好习惯。
二要着眼于“实”,脚踏实地,树立实干作风。天下大事必作于细,古今事业必成于实。虽然每个人岗位可能平凡,分工各有不同,但只要埋头苦干、兢兢业业就能干出一番事业。好高骛远、作风漂浮,结果终究是一事无成。
因此,要提高执行力,就必须发扬严谨务实、勤勉刻苦的精神,坚决克服夸夸其谈、评头论足的毛病。真正静下心来,从小事做起,从点滴做起。一件一件抓落实,一项一项抓成效,干一件成一件,积小胜为大胜,养成脚踏实地、埋头苦干的良好习惯。
三要着眼于“快”,只争朝夕,提高办事效率。“明日复明日,明日何其多。我生待明日,万事成蹉跎。”因此,要提高执行力,就必须强化时间观念和效率意识,弘扬“立即行动、马上就办”的工作理念。坚决克服工作懒散、办事拖拉的恶习。
每项工作都要立足一个“早”字,落实一个“快”字,抓紧时机、加快节奏、提高效率。做任何事都要有效地进行时间管理,时刻把握工作进度,做到争分夺秒,赶前不赶后,养成雷厉风行、干净利落的良好习惯。
四要着眼于“新”,开拓创新,改进工作方法。只有改革,才有活力;只有创新,才有发展。面对竞争日益激烈、变化日趋迅猛的今天,创新和应变能力已成为推进发展的核心要素。
因此,要提高执行力,就必须具备较强的改革精神和创新能力,坚决克服无所用心、生搬硬套的问题,充分发挥主观能动性,创造性地开展工作、执行指令。
在日常工作中,我们要敢于突破思维定势和传统经验的束缚,不断寻求新的思路和方法,使执行的力度更大、速度更快、效果更好。养成勤于学习、善于思考的良好习惯。 总之,提升个人执行力虽不是一朝一夕之功,但只要你按“严、实、快、新”四字要求用心去做,就一定会成功!
2012年12月28日金曜日
SQLiteのメリッド
ちまたで多く使われているデータベースでは、MySQLやPostgreSQL(ポスグレ)なんでしょうけど、私は、SQLiteが好きだ。そして、私のように専用サーバを持たず、レンタルサーバのみの環境の方には、MySQL、PostgreSQLよりもSQLiteのほうが、絶対に幸せになれると思う。
データがファイルひとつなので、バックアップが超簡単!
SQLiteは、サーバー型でないため、データはたったひとつのファイルにまとめられている。バックアップするには、それをFTPでダウンロードするか、そのサーバー上でコピーするだけだ。MySQLでも、ツールを使えばバックアップはできるけど、ファイルのコピーだけで完結する簡潔さには、かなううまい。なお、ファイル名もなんでもよく拡張子もあってもなくてもいい。でも、バージョン2は.sqliteバージョン3は.sqlite3としている人が多いのかな。USBにデータファイルをコピーして、外出先のローカルサーバーで、すぐにSQLiteを使うなんて、当たり前にできる。MySQLでやろうとしたら気が遠くなる。-----DBのテーブル構成を変えたい?そう、なら、サーバーからダウンロードして、デスクトップのツールで変更して、ついでに入らなくなったデータ消去して、新たな更新データもいれておいて、アップロードすれば終わり。ローカルとリモートの同期が超簡単なのもDBがファイルだから。
多くのレンタルサーバMySQLよりも高速に作動する
レンタルサーバのMySQLの遅さに参っている人は多い。もっともこれはMySQLが悪いのでなく、レンタルサーバー業者が多くのアカウントをひとつのMySQLサーバーに押し込んでいるだけ。データベースサーバはサーバに大きな負担をかけるので、せっかくの早いと言われるMySQLが劇遅になってしまう例も見かけられる。それに対し、SQLiteはサーバー上の自分のスペースに置くだけなので、借りているWEBサーバさえまともならば、快適に使える。もちろん、WEBサーバも、共用であれば、MySQLのような副作用もあり得るわけであるが、SQLiteがサーバーに優しい動作であるので、多くの利点がある。なお、同じ環境では、MySQLと同じか、少し早いとのこと。WEBで検索すると書込が遅いという記事があるが、それはテスト方法を間違っているだけ(トランザクションを適切に使っていない)。
SQL機能的に問題ない
基本的なSQL文はすべて使える(SQL92準拠)。ここが(SQLite が認識できる SQL )詳しい。ビュー、トリガーもOK。check制約などが使えないが、それがないのがSQLiteなのだ。プロ中のプロが大規模サイトで使うには非力であっても、通常*1の使い方で問題となる面はでてこないであろう。
設定が容易。
パスワード設定がいらないので、MySQLを使ったことのある人ならば、「えっ、もう繋がるの?」とびっくりするだろう。
納入が容易。
私は関係ないが商売として、簡易的なデータベースシステムを使ってWEBシステムを構築しているのであれば、納入の容易さは、大きな利点となるだろう。なんせ、HTMLと同じコピペで納入できるのだから。ライセンスも心配ない。
PHP5では、SQLite3が標準で使える。PHP4でもSQLite2が標準で使える。
何もしなくても、いきなりプログラムを書けば自動的にデータベースファイルが作成される。標準バンドルはとてもありがたい。
データ型の概念が希薄であり、長さも柔軟、PHPと、とても相性がよい。
多くのデータベースサーバは、テキストの長さを決めなくてはいけなかったりする。(もちろんそうでない型もあるが、基本としてそうなっている。)SQLiteではchr(20)なんて必要ない。
無料であり、なんとコアソースコード著作権を主張していない。ライセンスの心配は一切いらない。
神様のような存在である。
容量が少なくて済む。コアは225Kbしかない。
rubyでもSQLiteが標準になった(そうだ)
rubyは使ったことないので、よく知らないけど。
(追記:ruby単体でなく、ruby on railsのデフォルトDBとして採用されたそうです。)
このように、多くの利点があるSQLite、使わない手はない。
私は特に 1 の利点は、ものすごく大きいと思う。外部サーバーから、FTPでダウンロードしてデータベースの中身をちょちょっと修正して、すぐにアップロードできる。なんて、MySQLでは絶対にできないでしょう。
一方で、こんなデメリットは知っておくべきだろう。
パスワード設定がない
ファイル形式であり、ユーザー管理の概念がないため、SQLite自身には、セキュリティ機能はない。自分で、ファイルへのアクセス権限をしっかりとコントロールする必要がある。サーバーのドキュメントルート以下に置く場合は、htaccessの設定が必須だろう。ドキュメントルートより上に置けば、外部の第三者からのセキュリティに問題があることはほとんどないだろう。
書込がダブると書込エラーになる
サーバー型でないので、複数の書込を順次処理することができない。最初の人が書込をしている間に、次の人が書込をしようとするとエラーになるので、そのケアーをする必要があるシステムもあるかもしれない。個人やSOHOのCMS(コンテンツマネジメントシステム)やブログ程度であれば、問題にあることはないだろう。読み出しはダブってもOK。頻繁に不特定多数がデータベースに書き込むような処理は苦手だろう。
バージョン2と3でデータベースの互換性がない。
2と3は別物と考えたほうがいい。PHPからのアクセスに限って言えば、SQLite2は、通常のsqlite_~関数を使ってアクセスするが、SQLite3は、PHP5.1以上で、かつ、PDOというデータベースドライバを通じてしか操作できないので、2->3のアップグレードは注意を要する。(そんなに難しくはないけど)。なお、PHP4,5でPDOを使わずにSQLite3を使う方法もあるようだが、PHP本体のリビルドが必要なようなことと、windouws環境が揃っていないことから、現時点(2008/1)ではお薦めできない。もちろんPDOを使えばアクセスできるので、皆さんPDOを使いましょう。
管理ツールでは、phpMyadminに劣るものしかない。
別記事で私の使っているツールをあげておきます。phpMyadminには及ばないが、しかし十分である。
日本語情報は、MySQLに比べて少ない。
皆さんで盛り上げていきましょう。ちなみに、SQLiteをやってみようは、よくまとまっておおられます。
SQLiteの基礎
コマンドラインツールでの入力方法
コマンドプロンプトから次のように実行するとSQLiteのコマンドラインツールが起動し、指定したデータベースに接続します。
sqlite3 データベース名
コマンドラインツール上では、SQL文を実行したり、コマンドラインツールに関する設定を行うようなSQLiteコマンドなどを実行することができます。
例えばSQLiteコマンドの「.show」を実行してみます。
今度はSQL文を実行してみます。
コマンドであればコマンドに加えて必要に応じて引数を入力してEntereキーを押すと実行されます。またSQL文であれば最後に「;」を入力されるまでが一つのSQL文として扱われますので、「;」まで入力を行ってからEnterキーを押す事で実行されます。
ただ特にSQL文では一つのSQL文が非常に長くなることがあります。全ての文を一度に入力しようとすると入力し難かったり、どこまで入力したか分かりにくい場合があります。
このような場合、コマンドラインツールでは分割して入力することができます。途中まで入力した時点でEnterキーを押して下さい。
SQL文は最後に「;」が現れるまでが一つの文のため、まだ入力の途中だと判断されると「...>」と表示されて続けて入力を行うことができるようになります。
では残りの部分を入力していきます。
この時、空白を一つあけて入力する必要はありません。コマンドの途中でEnterキーを押すと自動的に前と後の文は別の単語として扱われます。
SQL文の場合は「;」が含まれる文が入力されてEnterが押された時点で文の入力が完了したと判断されて実行されます。
まとめて入力しても分割して入力しても結果は同じなので場合に応じて使い分けて下さい。
SQLコマンドの場合
なお、SQLコマンドの場合は分割して入力することはできません。例えば「.mode」コマンドは引数を一つ指定しますが、引数を指定しない時点でEnterキーを押すとエラーとなります。
SQLコマンドの場合は分割して入力を行わずに最後まで入力を行ってから実行して下さい。
SQLiteでは多くのキーワードが定義されています。例えばTABLEやSELECTといった言葉はキーワードです。キーワードは予約語とも呼ぶ場合があります。
テーブル名やデータベース名は識別子と呼ばれます。識別子にはアルファベットや数字などを組み合わせて付けることができます。(例えば「booktable」や「name」など)。ただしキーワードはそのままでは識別子として使用することができません。
識別子とキーワード
キーワードを識別子と使用したい場合には、次の4つのいずれかの方法を使います。
'keyword'
"keyword"
[keyword]
`keyword`
シングルクオーテーション(')でキーワードを囲った場合、文字列の値として扱われます。識別子を記述すべきところにシングルクオーテーションで囲んだ文字列の値を記述すると識別子として扱われるためこの形式でも指定することができます。
ダブルクオーテーション(")、角括弧([])、グレイヴ・アクセント(`)でキーワードを囲った場合、識別子として扱われます。(なお文字列を記述すべきところにダブルクオーテーションで囲んだ識別子を記述すると文字列として扱われます)。
なお角括弧はAccessやSQL Serverで使われている方式でグレイブ・アクセントはMySQLで使われている方式です。この2つの方式はそれぞれのデータベースとの互換性を保つために用意されています。
以上のことからキーワードを識別子として使用するにはダブルクオーテーション(")で囲むようにしておけばいいかと思います。
キーワードの一覧
キーワードを識別子として使用するための方法を記載してきましたが、SQLiteでは多くのキーワードでクォートしなくても使用できるようになっています。
例えば「TEMP」はキーワードの一つですが、クォートしなくてもテーブル名として使用することができます。
ただクォートしないで使用すると分かりにくくなり不要な間違いを起こしかねません。またそれ以前の問題としてキーワードを識別子としてあまり使用しない方が望ましいと思います。
下記にキーワードの一覧を記載します。必ずクォートが必要なキーワードと、必要でないキーワードに分けて記載します。
クォートが必須のキーワード:
ADD
ALL
ALTER
AND
AS
AUTOINCREMENT
BETWEEN
CASE
CHECK
COLLATE
COMMIT
CONSTRAINT
CREATE
CROSS
DEFAULT
DEFERRABLE
DELETE
DISTINCT
DROP
ELSE
ESCAPE
EXCEPT
EXISTS
FOREIGN
FROM
FULL
GROUP
HAVING
IN
INDEX
INNER
INSERT
INTERSECT
INTO
IS
ISNULL
JOIN
LEFT
LIMIT
NATURAL
NOT
NOTNULL
NULL
ON
OR
ORDER
OUTER
PRIMARY
REFERENCES
RIGHT
ROLLBACK
SELECT
SET
TABLE
THEN
TO
TRANSACTION
UNION
UNIQUE
UPDATE
USING
VALUES
WHEN
WHERE
クォートが不要のキーワード:
ABORT
AFTER
ANALYZE
ASC
ATTACH
BEFORE
BEGIN
BY
CASCADE
CAST
COLUMN
CONFLICT
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
DATABASE
DEFERRED
DESC
DETACH
EACH
END
EXCLUSIVE
EXPLAIN
FAIL
FOR
GLOB
IF
IGNORE
IMMEDIATE
INDEXED
INITIALLY
INSTEAD
KEY
LIKE
MATCH
OF
OFFSET
PLAN
PRAGMA
QUERY
RAISE
REGEXP
REINDEX
RELEASE
RENAME
REPLACE
RESTRICT
ROW
SAVEPOINT
TEMP
TEMPORARY
TRIGGER
VACUUM
VIEW
VIRTUAL
システムで使っている識別子
下記の識別子はキーワードではありませんが、SQLiteシステムが使用している識別子です。他のテーブル名などに識別子として使うことも可能なようですが、使用しないほうがいいと思われます。
_ROWID_
MAIN
OID
ROWID
SQLITE_MASTER
SQLITE_SEQUENCE
SQLITE_TEMP_MASTER
TEMP
SQL文でのコメントの記述
SQLiteでSQL文にコメントを記述するには次のいずれかの方法を使用します。
-- コメント
/* コメント */
コメントは単なるメモであり、SQL文の実行時に無視されて何も影響を与えません。
「-- コメント」の形式でコメントを記述した場合、「--」から行末までに記述された文字列をコメントとします。
「/* コメント */」の形式でコメントを記述した場合、「/*」から「*/」までに記述された文字列をコメントとします。
なおコメントを付けてINSERT文を実行しても、「.dump」コマンドでダンプした内容にはコメントは残っていません。
その為、コマンドツール上でコマンドを記述してもあまり意味はありません。
単語
欺く あざむく
焦る あせる
褪せる あせる
促す うながす
敬う うやまう
うんざりする
煽てる おだてる
脅かす おびやかす
帯びる おぶる
嵩む かさむ 増加
合致する がっちする
かぶれる 皮膚が赤くはれてかゆくなる
鍛える きたえる
食い違う くいちがう 一致ではない
潜る くぐる
覆す くつがえす
マーケティング・コンサルティング
試みる こころみる
拗れる こじれる
誤魔化す ごまかす
凝らす こらす
懲りる こりる
遮る さえぎる
さえずる 鳥の音
冴える 冴える 冷え込む、光・音・色などが澄み切る、
妨げる さまたげる
障る さわる
試験をしくじる、会社をしくじる、得意先をしくじる
慕う したう
萎む しぼむ
廃れる すたれる
リファクタリング
焦る あせる
褪せる あせる
促す うながす
敬う うやまう
うんざりする
煽てる おだてる
脅かす おびやかす
帯びる おぶる
嵩む かさむ 増加
合致する がっちする
かぶれる 皮膚が赤くはれてかゆくなる
鍛える きたえる
食い違う くいちがう 一致ではない
潜る くぐる
覆す くつがえす
マーケティング・コンサルティング
試みる こころみる
拗れる こじれる
誤魔化す ごまかす
凝らす こらす
懲りる こりる
遮る さえぎる
さえずる 鳥の音
冴える 冴える 冷え込む、光・音・色などが澄み切る、
妨げる さまたげる
障る さわる
試験をしくじる、会社をしくじる、得意先をしくじる
慕う したう
萎む しぼむ
廃れる すたれる
リファクタリング
登録:
投稿 (Atom)