注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

无线时代辐射无穷

抓紧生宝宝,小心辐射

 
 
 

日志

 
 

Iphone数据库sqlite编程  

2011-07-20 16:30:38|  分类: apple |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在iPhone的开发过程中常常会用到数据库,而SQLite3是iPhone中支持的数据库。下面简单介绍一下iPhone中SQLite3数据库的用法:

SQLite3简介

SQLite3是一个轻量级的数据库,完全使用C语言编写,使用简单方便。它是一个嵌入到程序进程的数据库,和其他一些数据库(MySQL,MS SQL)不同,它没有独立的进程。

1、打开数据库

首先声明一个数据库变量

sqlite3 *db = NULL;

每一个SQLite3都是一个文件,打开一个数据库只需要调用一次sqlite3_open函数:

SQLITE_API int sqlite3_open(

const char *filename,   /* Database filename (UTF-8) */

sqlite3 **ppDb          /* OUT: SQLite db handle */

);

filename是数据库的路径,ppDb是指向返回的sqlite3数据库,返回SQLITE3_OK则表示正常。比如我们打开Document目录下的“Test.db”数据库:

int result = sqlite3_open([dbPath UTF8String], &db);

NSAssert(result==SQLITE_OK, @”Can’t open database %@”, dbPath);

注意:如果dbPath路径下的数据库不存在,那么打开这个数据库将会创建一个空的数据库。

2、执行SQL语句

SQLite3有3种执行SQL语句的方法:

  • 通过sqlite3_exec()函数,适用于执行(非查询)语句:如CREATE TABLE、INSERT,REPLACE,DELETE等。

SQLITE_API int sqlite3_exec(

sqlite3*,                                  /* An open database */

const char *sql,                           /* SQL to be evaluated */

int (*callback)(void*,int,char**,char**),  /* Callback function */

void *,                                    /* 1st argument to callback */

char **errmsg                              /* Error msg written here */

);

比如我们要创建一个表示个人(person)的表,就可以使用sqlite3_exec()函数。person表中包括名字(name)、性别(gender)、年龄(age)和生日(birthday)这几个字段。代码如下:

char *errmsg = NULL;

result = sqlite3_exec(db, “CREATE TABLE person (”

“name TEXT,”

“gender INTEGER,”

“age INTEGER,”

“birthday DATE)”, NULL, NULL, &errmsg);

NSAssert(result==SQLITE_OK, @”Can’t CREATE TABLE: %s”, errmsg);


  • 通过sqlite3_get_table()函数,适用于查询语句SELECT。由于此函数返回一个字符串数组,因此对于要求结果为二进制数据(如图像数据)的不能用此函数返回。

SQLITE_API int sqlite3_get_table(

sqlite3 *db,          /* An open database */

const char *zSql,     /* SQL to be evaluated */

char ***pazResult,    /* Results of the query */

int *pnRow,           /* Number of result rows written here */

int *pnColumn,        /* Number of result columns written here */

char **pzErrmsg       /* Error msg written here */

);

例如我们要查询person中的所有数据:

char **table = NULL;

int row,col;

result = sqlite3_get_table(db, “SELECT name,age,birthday from person”, &table, &row, &col, &errmsg);

NSAssert(result==SQLITE_OK, @”SQL ERROR: %s”, errmsg);

那么字符串数组table中就包含所有的表信息,本例中每行3个元素(name、age和birthday),table第一行元素是字段名字,如table[0]是”name”,table[1]是”age”,table[2]是”birthday”。table的第二行才是实际的数据,如table[3]是”张三”,table[4]是”24″,table[5]是”1981-10-21 12:00:01″。

  • 通过sqlite3_prepare()、sqlite3_step()、sqlite3_bind_xxx()以及sqlite3_finalize()等一系列函数,可以逐行获取数据,并可以获取二进制数据。

sqlite3_prepare()用于编译一个SQL语句,返回一个sqlite3_stmt结构指针。sqlite3_stmt结构指针用于sqlite3_step()、sqlite3_bind_xxx()以及sqlite3_finalize()等函数中。sqlite3_step()用于将当前记录指向下一个。sqlite3_bind_xxx()等一系列函数会获取当前记录中各个字段对应的值。最后调用一下sqlite3_finalize()用于释放一些资源。

3、其他高级应用

3.1 创建内存数据库

通常SQLite3数据库存储在磁盘文件中,所以对数据库的读写等操作就会精彩的对磁盘文件进行读写。SQLite3也可以将数据库建立在内存中,但是要注意建立内存的数据是易失的(程序退出时内存便会释放)。我们知道磁盘的读写比内存的读写要慢很多很多,有时候我们对读写速度要求很高,但是对数据是否时持久保存并不感兴趣,这时使用内存数据库最好不过了。

创建内存数据库很简单,只需要把打开数据库的文件名改为“:memory:”即可。

int result = sqlite3_open(“:memory:”, &db);

NSAssert(result==SQLITE_OK, @”Can’t open database %@”, dbPath);

3.2 创建自定义SQL语句函数

有时候我们想定义一个函数来判断一个人是否满足结婚条件(男性大于22岁,女性大于20岁),可惜SQL语句中并没有提供如此复杂的判断。这时创建一个自定义函数是非常方便的。

static void db_func_canmarry(sqlite3_context *context, int argc, sqlite3_value **argv){

int gender = sqlite3_value_int(argv[0]);

int age = sqlite3_value_int(argv[1]);

int canmarry = 0;

if (gender == 0 && age > 22) {

canmarry = 1;

}

else if (gender == 1 && age > 20){

canmarry = 0;

}

sqlite3_result_int(context, canmarry);

}

定义好函数,把这个函数加入到数据库SQL语句中。

sqlite3_create_function(db, “CANMARRY”, 2, SQLITE_UTF8, NULL, &db_func_canmarry, NULL, NULL);

以后我们执行SQL语句SELECT * FROM person WHERE CANMARRY(gender,age) 就可以获取到所有满足结婚条件的人。

3.3 分页查询

数据库查询时常常碰到需要分页显示结果的情况,这时候我们使用SQL语句LIMIT关键字就非常方便了。比如返回20行起的10行数据

SELECT * FROM person WHERE CANMARRY(gender,age) LIMIT 20, 10

  评论这张
 
阅读(1089/rgv[0]);

p陁ment to cal誣2px;tex="h(/6读(< Tkejingxuan_(  > ument to cale ass="ed4ightar" style="h4ightt:32px;text-align
p陁ment to cal誣

用易信  “扫一扫”

将文章分享到朋友圈。

 
ument to cal ) e cle.hediv> a iblock" href= :32ptp://wwwss=d.cor.co3102oft4t=ument span> inpu
c06den"_get_="nhirdId" P>int="63.co408&c=/#m=087095ks_0840&t=14084083087071086084084095092mages/microblog. inpu
c06den"_get_="LECT" P>int="20蠫POST/images/microblog. inpu
c06den"_get_="d="$_" P>int="s1"> c06den"_get_="

s>int=" <Per =11 nbw-blog ztag">

在iPhone的开发过程中常常会用到数据库,而SQLite3是iPhone中支持的数据库。下面简单介绍一下iPhone</Per = <Per =某3D用</Per = <Per =某3T编写,

SQLite3是一个轻量级的数据库,完全使用C语言编写,使用简单方便。它是一个嵌入到程序进程的数据库,和其他一些数据库(MySQL,MS SQL)</Per = <Per =<头乓恍er =进程。

<</头乓恍er =</Per = <Per =菘

</Per =</20行起的10er == <Per =;

每一个SQLite3都是一个文件,打开一个数据库只需要调</Per = <20行起的10er == <Per =<EMer =n(db, LOCKQUOTE>

==SQ(</EMer =</Per = <Per =<EMer =

([dbnbsp; char *filename,   /* Datab</EMer =</Per = <Per =<EMer == 0;

([dbnbsp; P>if nbsp; P>if nbsp; P>if nbsp; P>if nbsp; ;       /* O</EMer =</Per = <Per =<EMer =);</EMer =</Per =</20行起的10er == <Per =>

filename是数据库的路径,ppDb是指向返回的sqlite3数据库,返回SQLITE3_OK则表示正常。比如我们打开Document目录</Per = <20行起的10er == <Per =

int result = sqlite3_open([db([dbPath</Per = <Per = &errmsg);

NSAssertCresult==SQLITE_OK, @”Can’t open </Per =</20行起的10er == <Per =;

注意:如果dbPath路径下的数据库不存在,那么打开这个数据库</Per = <Per =<头乓恍er =据库。

SQLite3</Per = <ULer == <LIer =姆椒ǎ

  • 通过sqlite3_exec()函数,适用于执行(非查询)语句:如CREATE TABLE、INSER</LIer =</ULer == <20行起的10er == <Per =<EMer =n(db, LOCKQUOTE>

    > if nbsp; P>if nbsp; P>if nbsp; P>if nbsp; E([dbnbsp; P>if nbsp; P>if nbsp; P>if nbsp; P>if nbsp; E([dbnbsp; P>if nbsp; P>if nbsp; P>if nbsp; P>if nbsp; E([dbnbsp; P>if nbsp; ;      </EMer =</Per = <Per =<EMer = if nbsp; P>if nbsp; P>if nbsp; E([dbnbsp; P>if nbsp; P>if nbsp; P>if nbsp; P>if nbsp; E([dbnbsp; P>if nbsp; P>if nbsp; P>if nbsp; ; &膒;     /*</EMer =</Per = <Per =<EMer =

    /

    int (*callback)(voi([dbnbsp; ; &ar**,char**),  </EMer =</Per = <Per =<EMer =on */if nbsp; P>if nbsp; P>if nbsp; P>if nbsp; E([dbnbsp; P>if nbsp; P>if nbsp; P>if nbsp; E([dbnbsp; P>if nbsp; P>if nbsp; P>if nbsp; P>if nbsp; E([dbnbsp; P>if nbsp; P>if nbsp; ;       /* 1st </EMer =</Per = <Per =<EMer =ck */

    ([dbnbsp; E([dbnbsp; P>if nbsp; P>if nbsp; P>if nbsp; P>if nbsp; E([dbnbsp; P>if nbsp; P>if nbsp; P>if nbsp; E([dbnbsp; P>if nbsp; P>if nbsp; P>if nbsp; P>if nbsp; ;       /* Er</EMer =</Per = <Per =<EMer =);</EMer =</Per =</20行起的10er == <Per =>

    比如我们要创建一个表示个人(person)的表,就可以使用sqlite3_exec()函数。person表中包括名字(name)、性别(gender)、年龄(age)和生日(birthday</Per = <20行起的10er == <Per =

    </Per = <Per =P>int row,col;

    result = sqlite3_exec(db, “</Per = <Per =BLE person (”</Per = <Per =BLname TEXT,”

    </Per = <Per =BL(argTEGER,”

    “birthday DAT([dbmp;row, </Per = <Per = &errmsg);

    NSAssertCresult==SQLITE_OK, @”Can’t CREAT</Per = <Per =<EMer =<BRer =</EMer =</Per =</20行起的10er == <ULer == <LIer =姆椒<EMer == 0;

  • 通过</EMer =/BLOCKü齭ql分页()函数,适用于查询语句SELECT。由于此函数返回一个字符串数组,因此对于要求结果为二进制数据(如图像数据</LIer =</ULer == <20行起的10er == <Per =n(db, LOCKQUOTE>

    >

    resu</Per = <Per == 0;if nbsp; P>if nbsp; P>if nbsp; ;      </Per = <Per = ([dbnbsp; E([dbnbsp; ; &膒;     /*</Per = <Per = evaluated */

    ([dbnbsp; E([dbnbsp; ; &R e query *([dbnbsp; E([dbnbsp; e([dbnbsp; E([dbnbsp; P>if nbsp; ;       /* Number of resu</Per = <Per =

    e qhere */<([dbnbsp; E([dbnbsp; e([dbnbsp; E([dbnbsp; ;       /* Number of result </Per = <Per =ritten here */
  • 例如我们要</Per = <20行起的10er == <Per =

    </Per = <Per =

    e = NUL</Per = <Per =P>int row,col;

    result = sqlite3_get_table(db, “SELECT name,age,birthd([dbable[lite3_o([dbon”, &([db;table, &a([dbmp;row, </Per = <Per = &errmsg);

    NSAssert膒ult==SQLITE_OK, @”SQ</Per =</20行起的10er == <Per =;

    那么字符串数组table中就包含所有的表信息,本例中每行3个元素(name、age和birthday),table第一行元素是字段名字,如table[0]是”name”,table[1]是”age”,table[2]是”birthday”。table的第二行才是实际的数据,如table[3]是”张三”,table[4]是”24″,table[5]是”</Per = <ULer == <LIer =姆椒= 0;通过sqlite3_prepare()、sqlite3_step()、sqlite3_bind_xxx()以及sqlite3_finalize()等一系列函数,可以逐行获取数据,</LIer =</ULer == <Per == 0;

sqlite3_prepare()用于编译一个SQL语句,返回一个sqlite3_stmt结构指针。sqlite3_stmt结构指针用于sqlite3_step()、sqlite3_bind_xxx()以及sqlite3_finalize()等函数中。sqlite3_step()用于将当前记录指向下一个。sqlite3_bind_xxx()等一系列函数会获取当前记录中各个字段/P>

</头乓恍er =</Per = <Per =队τ

</Per = <Per =创建内存数据库

通常SQLite3数据库存储在磁盘文件中,所以对数据库的读写等操作就会精彩的对磁盘文件进行读写。SQLite3也可以将数据库建立在内存中,但是要注意建立内存的数据是易失的(程序退出时内存便会释放)。我们知道磁盘的读写比内存的读写要慢很多很多,有时候卧将试读写速度要求很高,但是对数据是否时持久保存并不感兴趣,这时使</Per = <Per =库最好不过了。

创建内存数据库很简单,只需要<EMer = result = sq</EMer =为</Per = <20行起的10er == <Per =

int result = sqlite3_o([dbpen(</Per = <Per = &errmsg);

NSAssertCresult==SQLITE_OK, @”Can’t open </Per =</20行起的10er == <Per =;

3.</Per = <Per =ㄒ錝QL语句函数

有时候我们想定义一个函数来判断一个人是否满足结婚条件(男性大于22岁,女性大于20岁),可惜SQL语句中并没有提供如此复杂的判断。这时创建一个</Per = <20行起的10er == <Per =

static void db_func_canmarry(sqlite3_context *context, int argc,</Per = <Per =

marry = ext *context, gender = sqli</Per = <Per =

(argv[0]);

int age = sqli</Per = <Per =

e3_resul); <([dbe([db([db(gende([dbr == 0 &a</Per = <Per =e3_resul);<1(</Per = <Per =}</Per = <Per == 1;

}

els([dbe([db([db(gende([dbr == 1 &</Per = <Per =e3_resul);<0(</Per = <Per =}</Per = <Per == 0;}

sqlite3_result_</Per = <Per =}</Per =</20行起的10er == <Per =}

定义好函数,把这个函数</Per = <20行起的10er == <Per == 0;

sqlite3_create_function(db, “CANMARRY”, 2, S([dbQLITE_UTF8, NULL, &db_func</Per =</20行起的10er == <Per =;

<EMer =

SELECT * FROM person WHER</EMer =MARRY(gender,age) 就可以获取</Per = <Per =结婚条件的人</Per = <Per =P>3.3 分页查询

数据库查询时常常碰到需要分页显示结果的情况,这时候我们使用SQL语句LIMIT关键字就非常方便了。</Per = <20行起的10er == <Per =<EMer =

SELECT * FROM person WHERE CANMARRY(g</EMer =</Per =</20行起的10er =/images/microblog. inpu

c06den"_get_="?id=12diP>int="ank" hidefocus/images/microblog. inpu
c06den"_get_="?id=12UrldiP>int=" target=mageGen.do?url=http://wolfgangkiefer.blog.163.com/blog/static//images/microblog. inpu
c06den"_get_="pan>iP>int="/images/microblog. div>
==Srava 10le.hediv> < class="adCoLikefer不段⒉ nt">1089< class="adCoRehttp <">dwb bdadCou < adCocle.hediv> |S字篟ehttp <"t;">
1089 span " id="$blogsep">|108910891089< class="adCoC常硈="n63.adCou span> 誣 div> div> div> div>
snlt=ument spaniv>
blogyoda_ondiv style
blog$_0 ">
r/javaass="span> /diinipanumen<:32perea_get_="j">

在iPhone的开发过程中常常会用到数据库,而SQLite3是iPhone中支持的数据库。下面简单介绍一下iPhone中S\库变羂> <常常挠梅热鏫库变羂> <常常员嘈矗

SQLite3是一个轻量级的数据库,完全使用C语言编写,使用简单方便。它是一个嵌入到程序进程的数据库,和其他一些数据库(MySQL,MS SQL)踩如\库变羂>释放一衆慕獭

菘

= 0; d鏫縜nmarry);;

每一个SQLite3都是一个文件,打开一个数据库只需要调 d鏫库变20行起的10\库变羂>

SQLITE_AP\n d鏫縜nmarry); Time:o311108&atic/,ument to cal =Srm;link:' _ikiefer.blog.163.com/blog/static/',ument to cal http _( Ids:[],ument to cal vote:{},ument to cal gr(us:'e:12',ument to cal f40"; //P>us:'unF40"; ',ument to cal de"Succ:'',ument to cal visitorProvince:'',ument to cal visitorC常y:'',ument to cal visitorNewU &a:fa= _,ument to cal d.coAdd03 p:{},ument to cal mse4:'in-',ument to cal m Visitor:fa= _,ument to cal isS字篩oda_Ad:tru_,ument to cal h.coIn_2o:'',ument to cal hm targetinpinl=http://wolfgangkiefer.bl263304040.co6log112520219/an tcmionl_on="v Time()" der="0" scrlayer fc06">tcmlf.nosdn !!x}umen

ubscrib fce f4claument to ER span nouldifer eones=""jxi oFTER" target="_ opad"> target _ik x.visitorN段==visitor.u &aN段脈ument to tcmialone${x.visitorNick侄蚊|escape}"ionmp;or="nhis.layedetail&t.f4clo6%B9" hiwdTopDaes"> ${fn1(x.visitorN段)}&r=${visitor.im(arUpITEeTime}"/nument to{= 1;}umen en ${fn1(x.visitorN段)}"/nument to{d荐}umen en<业恼掌&n
cwdTv侄蚊p; FTEanument to {/P>x.moveFECT=='wap'}umen en ER noul an>difer eones=""jxi o;"> al _ikhomean adCocd="$_sh来自r fc手机博客lo6%B9" hubscribwapI x.moveFECT=='i1"> noul an>difer eones=""jxin adCocd="$_sh来自菘狻客户端lo6%B9" hubscribi1">x.moveFECT=='="ibloc'}umen en ER noul an>difer eones=""jxin adCocd="$_sh来自A"ibloc客户端lo6%B9" hubscrib="iblocI x.moveFECT=='mob.ce'}umen en ER noul an>difer eones=""jxi opad"> target _ik al _ikhomean adCocd="$_sh来自r fc短信写o2" title="ubscribwapI span m2adiifer eones=""jxi oFTER" target="_ opad"> target _ik div> spa {d荐}umen {/lico}umen!!a}umen < an>dionmp;or="nhis.layedetail&t.f6clolayer${fn1(a.u &aN段)}"/n<业恼掌 target _ik gOCKQ260}${su
204s:none" div>
mbga 2pepanument toen<
mbgass=pzErrm div> ER span 2pep m2adiopad"> !!x}umen lio6%B9" h; FTEan${f.co()}${x.=Srm;link}/?javastB_ikct${fn(x.d="$_,26)|escape}<业 nument {lico a as x}umen {/P>!!x}umen en<
ubscrib fce f4claument toen span nouldifer eones=""jxi oFTER" target="_ opad"> target _ik ${fn1(x.rehttp <&aN段)}"/nument toen<业恼掌&nen<
cwdT; FTEanument to en span m2adifer eones=""jxi oFTER" target="_ opad"> target _ik !!b&&b. 0}umen

ulnument {lico b as y}umen en{/P>!!y}umen enen span m2adifer eones=""jxi o;"> /og.163.com/blog/static/ct${y.rehttp |&na> ul 6%B9" h canument {lico d as x}umen en1089 o _T; FTE

${x.;">erB_ikUrl}ct${x.;">erB_ikep ph|escape}<业 o r
${x.;">erHomeP(ar}ct${x.;">erU &aN段脇escape}<业!!x}umen lio6%B9" h; FTEan target _ik !!x}umen lio6%B9" h; FTEan target _ik alRehttB_ikcif="$_sh${x.f="$_|defaBLO:""|escape}ct${x.f="$_|defaBLO:""|escape}<业!!x}umen lio6%B9" h; FTEan阅秂 f="$_sh${x.b_ikT.ce|defaBLO:""|escape}ct${x.b_ikT.ce|defaBLO:""|escape}<业x gedex>4}{bOCKk}{d荐}ument to{/P>!!x}umen m2adifer eones=""jxi opad"> target _ik Time,'yyyy-MM-dd HH:mm:ss')xt,adCouument to !!x}umen lio6%B9" h; FTEan${f.co()}${x.=Srm;link}/ct${fn(x.f="$_,26)|escape}<业 ilig ubscribe">< e"><-logs=pzErrm dadCouument to <
targetank" hidefocusl=http://wolfg${b_ikDetail. irgg ubscribe">< e"><-l19s=pzErrm dadCouument to <
< T; FTEan targetank" hidefocusl=http://wolfg${b_ikDetail.n32pB_ikPerm;link}/an${b_ikDetail.n32pB_ikT="$_|escape}<业!!x}umen
hofIrip ubscrib fce f4claument to ER span nouldifer eones=""jxi oFTER" target="_ opad"> target _ik erU &a侄蚊}/anument to{/P>x.de"> erU &a侄蚊==visitor.u &aN段脈ument to tcmialone${x.de"> erNick侄蚊|escape}"ionmp;or="nhis.layedetail&t.f4clo6%B9" hiwdTopDaes"> ${fn1(x.de"> erU &a侄蚊)}&r=${visitor.im(arUpITEeTime}"/nument to{= 1;}umen en erNick侄蚊|escape}"ionmp;or="nhis.layedetail&t.f4clo6%B9" hiwdTopDaes"> ${fn1(x.de"> erU &a侄蚊)}"/nument to{d荐}umen en<业恼掌&n cwdTv侄蚊p; FTEanument to target _ik erU &a侄蚊}/anument to ${fn(x.de"> erNick侄蚊,8)|escape}ument toen<业恼掌&n div> x.f/se==1} js-likef/se{= 1;/P>x.f/se==2} js-reet/nf/se{= 1;/P>x.f/se==3} js- :/se{= 1;}{d荐}difer eones=""jxi oFTER" target="_ opad"> target _ik erU &a侄蚊}/anpzErrm ddefocus=< nument {/荐}umen {/lico}umen tt> 0 "spre ument 0}umen teeeeeeeteeeeeee{lico 0 "slico as x}umen enteeeeeeeteeeee{/P>x gedex>7}{bOCKk}{d荐}umlateeeeeee 1089 targeta ib163.htt/0 "sapp/an下载r fc新闻客户端 er =pan>um lteeeeeee< nument < numen ui3 p:none" div> teee spa an c lt>< oFTE:none" 被dwb 日志="c4ages/mi spa an c lt>< oFTE:none" 最新日志="c4ages/mi spa an c lt>< oFTE:none" 该作者的础<文章="c4ages/mi spa an c lt>< oFTE:none" 博主dwb ="c4ages/mi spa an c lt>< oFTE:none" 随机 ="c4ages/mi spa an c lt>< oFTE:none" 首页dwb ="c4ages/mi 库礶an ERfer eones=""jxi 6%B9" hspa3 m2adiopad"> targetb_ikb163.htt">更多er =&r =pan> de"> :none" div> teee< opDtes"s2es"> span< > < ument < casean , nument < an , nument , numen closeanument to nt">1089 < e"><-5 pzErrm dadCouument t , num < > targetb_ikb163.htt/${x.u &aN段脈/difer eones=""jxi 6%B9" hm2a span "${x.nickN段脇escape}<业膒zErrmpzErrm投票给ument to {v BLEeToOpvl&t==1}ument to teeeee{/P>fircoropvl&t==fa= _},{/荐}pzErrmpzErrm“${b[BLEeToOpvl&t gedex]}”pzErrmpzErrmument to teee{/荐}umen eeee{/lico}umeneeeeee{/P>(x.role!="-ct) },“我是${c[x.role]}”pzErrmpzErrm{/荐}umen eeeepzErrmpzErrmpzErrmpzErrmnt">1089x.u &aN段==''}{d荐}ument {/荐}umen {/lico}umen /og.163.com/blog/static//"; c/文章的永久链接,作为文章的唯一标识umv ixi= ript> b_ikb163.htt/ank" hidefocus/"; c/博客〉摈页地址,作为博客〉唯一标识umv me > .="tex.htt/32p/r/javascriptWe > .htman , num d nument < lR6% h655w pzErrm d nument < r cr h655w pzErrm d nument d nument < /dimb lcr bh adCceanument to< l _Tbhw pzErrm d nument < r br bhw pzErrm d nument < c bc bh lcrw pzErrm d nument d numen d num d nument < lRwl g lg h655w pzErrm d nument < lRwl t ltw pzErrm d nument < lRwl b lbanpzErrm d numeeeeee< /diere -smban wkg h adCcean % hanpzErrm d n r hanpzErrm d n c hanpzErrm d n d n d num /diere -foe umen wkg hanument

页 pth2>ument k"库北北 ERr/j="nof40"; lo6%B9" hm2a spa8difer eones=""jxi opad"> targetyxpb163.htt">我的照片书<业膗ment tont">1089 targetb_ikb163.htt/de"> c/thiua/an博客风格<业膗ment tont">1089 targetb_ikb163.htt/ &avices/wap _ik html">手机博客<业膗ment tont">1089 targeta iblock" href=apptp://wwwoker.co50.c9_0cla下载08_01" APP<业膗ment toument tonlinkRr/j="alo&a侄3s f/se="applicavl&t/rss+xmldif="$_shRSSi opad"> target=mageGen.do?url=http://wolfgrss/"/nument tont">10891089< e"><-919s=pzErrm dadCou订阅此博客<业膒aadCouument d num北北 d num d n d num北北 !--[/P>lo& IE 6]n , nlo& IE 6]n , n /dilaye blogb_ik-163-httilaye n , numen< /ditpl -inip class= blogb_ik-163-httirippjavadile.hediidefocus="tru"库<:32perea_on="e/i;tas="e/i侄蚊="jst class -jst-act=北 ERr/j="nof40"; lo6%B9" hp fer eones=""jxi opad"> targethelpb163.htt,adecial/007525FT/b_ik.html?b13azect=帮助<业膗men adCoc6%B9" hfr ubscribadCce e">1 e">1-4anpzErrm dadCouumen targetb_ikb163.htt/204lvavl&t.do?h.co=204lvavl&t&&u &a侄蚊=${u}ct${uxt,的um grpct${x.gxt, 膗ment toee{lico x.l as y}umen enen#i oFTER" target="_ 侄蚊="{/P>f/seof(y.v)==' r微g'}${y.v}{= 1;}${y gedex}{d荐}dt${y.nxt,的um北eeeeee{/lico}umeneeee{/lico}umdefr" d('wl')xument toee{lico wl as x}#i oFTER" target="_ 侄蚊="${x.v}ct${x.nxt,的{/lico}umenee{/荐}um Cce140.wpa';umendetail&t.epti= ' targetb. to.dOCKmb163.htt/b_ik/wr常矪_ikar**,cha.do';umenwgedow.CF= {ument ca:fa= _ument,m06:-3ument,cb:''ument,cc:fa= _ument,cd:fa= _ument,ce:'-3'ument,ck:0ument,ci:['apil=http://wolf'ument to ,' target1">to.163.htt/1">to/html/crossdomain.html?t=.co00.c5'ument to umenteeee ,'udl=http://wolf'ument to umenteeee umenteeee umenteeee ]ument,cj:[-3]ument,cl: 'ument,cm:["",gb_ik/",gal um/",gmusic/",g;tale04l&t/",gfri <

to163N段:'ank" hidefocus'umentee,1">to163H.coN段:'ank" hidefocus'umentee,TOKEN_HTMLMODULE:''umentee,isMBLOiU &aB_ik:fa= _umenee ,isWumiU &a:tru_umentee,sR"jx:-655umen};um , numeee
b1. b1. aindyticsb163.htt//Pes.jss f/se=":32p/java , numee f/se=":32p/java umente_/Pes_nacc= _ik';neteaseTr20ker();umenteumente0 " p://b().lay= ' targetb_ikb163.htt/0 "ttp:/im(ars/aindyse.wpags=p.bl'+0 " r * Time();umen , num 膗mwgedow.se4Timeout(fun04l&t(){umen(fun04l&t(i,s,o,g,r,a,m){i['GoogleAindyticsObje04']=r;i[r]=i[r]||fun04l&t(){umen(i[r].q=i[r].q||[]).desh(er uuan_s)},i[r].l=1*0 " r * Ediuan_sByogsN段(o)[0];a.async=1;a.layeg;m.perentNode.in &atBe) ee(a,m)umen})(wgedow,docuuan_,' ','//a ibgoogle-aindyticsbhtt/aindyticsbjs','ga');umumenga('LOCKQU', 'UA-69204963-1', 'auto');umenga('s <', 'ttp:view');um},300);umumum d n umum f/se=":32p/java umentewgedow.se4Timeout(fun04l&t(){umlalJ.l_onS p_(' targetmusic.ph r = docuuan_.LOCKQUEdiuan_(' ');umeee .async= 1;umeee .lay= ' targetb1. /0 "ttp:/