slqite3庫查詢數據處理方式_SQLite3命令操作大全

SQLite3命令操作大全

SQLite庫包含一個名字叫做sqlite3的命令行,它可以讓用戶手工輸入并執行面向SQLite數據庫的SQL命令。本文檔提供一個樣使用sqlite3的簡要說明.

一.qlite3一些常用Sql語句操作

創建表:??????????? create? table 表名(元素名 類型,…);

刪除表:??????????? drop? table 表名;

插入數據:?????? insert ?into 表名 values(, , ,) ;

創建索引:?????? create [unique] index 索引名on 表名(col….);

刪除索引:?? drop index 索引名(索引是不可更改的,想更改必須刪除重新建)

刪除數據:?????? delete from 表名;

更新數據:?????? update

表名 set 字段=’修改后的內容’ where 條件;

增加一個列:? Alter

table 表名 add

column 字段 數據類型;

選擇查詢:? ???? select 字段(以”,”隔開) from 表名 where 條件;

日期和時間:Select

datetime('now')

日期: ? selectdate('now');

時間:

selecttime('now');

總數:selectcount(*) from table1;求和:select

sum(field1) from table1;平均:select avg(field1)

from table1;最大:select

max(field1) from table1;最小:select min(field1)

from table1;

排序:select字段from table1order by字段(desc或asc);(降序或升序)

分組:select字段from table1group by字段,字段…;

限制輸出:select字段fromtable1limitxoffsety;

= select字段fromtable1limity , x;

(備注:跳過y行,取x行數據)

(操作仍待完善)…

SQLite支持哪些數據類型些?

NULL ????? 值為NULL

INTEGER 值為帶符號的整型,根據類別用1,2,3,4,6,8字節存儲

REAL ?????? 值為浮點型,8字節存儲

TEXT ?????? 值為text字符串,使用數據庫編碼(UTF-8,

UTF-16BE or UTF-16-LE)存儲

BLOB ????? 值為二進制數據,具體看實際輸入

但實際上,sqlite3也接受如下的數據類型:

smallint? 16 位元的整數

interger? ?????????????????? 32 位元的整數

decimal(p,s)? p 精確值和 s 大小的十進位整數,精確值p是指全部有幾個數(digits)大小值 ,s是指小數點後有幾位數。如果沒有特別指定,則系統會設為 p=5; s=0 。

float?? ?????????????? 32位元的實數。

double?? ?????????? 64位元的實數。

char(n)?? ????????? n 長度的字串,n不能超過 254。

varchar(n)? ???? 長度不固定且其最大長度為 n 的字串,n不能超過 4000。

graphic(n)? ????? 和 char(n) 一樣,不過其單位是兩個字元 double-bytes, n不能超過127。這個形態是為了支援兩個字元長度的字體,例如中文字。

vargraphic(n)? 可變長度且其最大長度為 n

的雙字元字串,n不能超過 2000。

date?? ?????????????? 包含了

年份、月份、日期。

time?? ?????????????? 包含了

小時、分鐘、秒。

timestamp? ??? 包含了

年、月、日、時、分、秒、千分之一秒。

如果將聲明表的一列設置為 INTEGER PRIMARY KEY,則具有:

1.每當你在該列上插入一NULL值時, NULL自動被轉換為一個比該列中最大值大1的一個整數;

2.如果表是空的, 將會是1;

算術函數

abs(X)返回給定數字表達式的絕對值。

max(X,Y[,...])返回表達式的最大值。

min(X,Y[,...])返回表達式的最小值。

random(*)返回隨機數。

round(X[,Y])返回數字表達式并四舍五入為指定的長度或精度。

字符處理函數

length(X)返回給定字符串表達式的字符個數。

lower(X)將大寫字符數據轉換為小寫字符數據后返回字符表達式。

upper(X)返回將小寫字符數據轉換為大寫的字符表達式。

substr(X,Y,Z)返回表達式的一部分。

randstr()

quote(A)

like(A,B)

確定給定的字符串是否與指定的模式匹配。

glob(A,B)

條件判斷函數

coalesce(X,Y[,...])

ifnull(X,Y)

nullif(X,Y)

集合函數

avg(X)返回組中值的平均值。

count(X)返回組中項目的數量。

max(X)返回組中值的最大值。

min(X)返回組中值的最小值。

sum(X)返回表達式中所有值的和。

其他函數

typeof(X)返回數據的類型。

last_insert_rowid()返回最后插入的數據的 ID

sqlite_version(*)返回 SQLite 的版本。

change_count()返回受上一語句影響的行數。

last_statement_change_count()

二.有關事務的操作

(成批操作的時候,啟動事務,比不啟動事務快n倍)

開始事物處理

BEGIN ?TRANSACTION;

…………..

進行對數據庫操作

…………..

事物提交

COMMIT;

具體事例如下:

假設有一個 t1 表,其中有 "a", "b", "c" 三列, 如果要刪除列 c ,以下過程描述如何做:

BEGIN TRANSACTION;

CREATE TEMPORARY TABLE t1_backup(a,b);

INSERT INTO t1_backup SELECT a,b FROM t1;

DROP TABLE t1;

CREATE TABLE t1(a,b);

INSERT INTO t1 SELECT a,b FROM t1_backup;

DROP TABLE t1_backup;

COMMIT;[h1]

三.啟動sqlite3程序

僅僅需要敲入帶有SQLite數據庫名字的"sqlite3"命令即可。如果文件不存在,則創建一個新的(數據庫)文件。然后 sqlite3程序將提示你輸入SQL。敲入SQL語句(以分號“;”結束),敲回車鍵之后,SQL語句就會執行。

例如,創建一個包含一個表"tb11"名字為"ex1"的SQLite數據庫,你可以這樣做:

數據庫、表的建立,記錄的添加、查詢、修改和刪除

F:\>sqlite3 database.db

sqlite> create table admin(username text,age integer);

sqlite> insert into admin values('kuang',25);

sqlite> select * from admin;

sqlite> update admin set username='kk',age=24 where username='kuang' and

age=25;

sqlite> delete from admin where username='kk';

注:每條sql語句后必須以";"號結尾!

$sqlite3 ex1

SQLite version 3.3.17

Enter ".help" for instructions

sqlite> create table tbl1(one varchar(10), two smallint);

sqlite> insert into tbl1 values('hello!', 10);

sqlite> insert into tbl1 values('goodbye', 20);

sqlite> select * from tbl1;

hello!|10

goodbye|20

sqlite>

你可以通過敲你所用系統的文件結束符(通常是Ctrl

+ D)或者中斷字符(通常是Ctrl + C)。來終止sqlite3程序。確定你在每個SQL語句結束敲入分號!sqlite3程序通過查找分號來決定一個SQL語句的結束。如果你省略分 號,sqlite3將給你一個連續的命令提示符并等你給當前的SQL命令添加更多的文字。這個特點讓你輸入多行的多個SQL語句,例如:

sqlite> create table tbl2(

...> f1 varchar(30) primary key,

...> f2 text,

...> f3 real

...> );

sqlite>

四.題外話:查詢SQLITE_MASTER表

SQLite數據庫的框架被保存在一個名叫"sqlite_master"的特殊的表中。你可以像查詢其它表一樣通過執行“SELECT”查詢這個特殊的表。例如:

$ sqlite3 ex1

SQlite vresion 3.3.10

Enter ".help" for instructions

sqlite> select * from sqlite_master;

type = table

name = tbl1

tbl_name = tbl1

rootpage = 3

sql = create table tbl1(one varchar(10), two smallint)

sqlite>

但你不能在sqlite_master表中執行諸如DROP TABLE, UPDATE, INSERT 或者DELETE命令。sqlite_master表在你創建、刪除和索引數據庫時自動更新這個表。你不能手工更改sqlite_master表。

TEMPORARY表的結構沒有存儲在"sqlite_master"表中,由于TEMPORARY表對應用是不可見的,而不是應用程序創建這個表。 TEMPORARY表結構被存儲在另外一個名叫"sqlite_temp_master"的特定的表中。"sqlite_temp_master"表是臨 時表自身。

五.sqlite3的特殊命令

大多數候,sqlite3讀入輸入行,并把它們傳遞到SQLite庫中去運行。但是如果輸入行以一個點(“.”)開始,那么這行將被sqlite3程序自

己截取并解釋。這些“點命令”通常被用來改變查詢輸出的格式,或者執行鞭個預封包(預定義prepackaged)的查詢語句。

你可以在任何時候輸入“.help”,列出可用的點命令。例如

sqlite> .help

.bail ON|OFF

Stop after hitting an error. ?Default

OFF(遇到錯誤時不再繼續, 默認為OFF)

.databases

List names and files of attached

databases(列出附加到數據庫的數據庫和文件)

.dump ?TABLE? ...

Dump the database in an SQL text format(保存表到SQL格式的文件中, 沒有指表名, 則保存所有. 如果要保存到磁盤上需要結合 .output 命令.)

.echo ON|OFF

Turn command echo on or off(打開/關閉 命令行回顯)

.exit

Exit this program(退出該命令行)

.explain ON|OFF

Turn output mode suitable for EXPLAIN on or

off.( 以合適的方式顯示表頭, 不帶參數則為開啟)

.header(s) ON|OFF

Turn display of headers on or off(是否顯示表頭, 和 .explain 差別不是很大)

.help

Show this message(顯示幫助信息)

.import FILE TABLE

Import data from FILE into TABLE(從文件中導入表)

.indices TABLE

Show names of all indices on TABLE(顯示索引)

.load FILE ?ENTRY?

Load an extension library(加載一個擴展庫)

.mode MODE ?TABLE?

Set output mode where MODE is one of:

(設置輸出模式, 模式可以是以下幾種):

csv ? ? ? Comma-separated values(?以逗號分隔的值)

column ? ?Left-aligned columns. ? (See .width)( 表頭左對齊(參見 .width))

html ? ? ?HTML

insert ? ?SQL insert statements for TABLE(?SQL插入語句)

line ? ? ?One value per line(?一行一個值)

list ? ? ?Values delimited by separator string(值用 string 分隔)

tabs ? ? ?Tab-separated values(以 tab 分隔的值)

tcl ? ? ? TCL list elements(TCL 列表元素)

.nullvalue STRING

Print STRING in place of NULL values(以 STRING 代替 NULL 值的輸出)

.output FILENAME

Send output to FILENAME(輸出到文件, 而不是顯示在屏幕上)

.output stdout

Send output to the screen(輸出到屏幕上)

.prompt MAIN CONTINUE

Replace the standard prompts(替換默認的命令提示信息, 默認就是 sqlite>)

.quit

Exit this program(退出命令行)

.read FILENAME

Execute SQL in FILENAME(執行 FILENAME 中的 SQL語句)

.schema ?TABLE?

Show the CREATE statements(顯示 CREATE 語句)

.separator STRING

Change separator used by output mode and

.import

.show

Show the current values for various

settings(顯示各種設置)

.tables ?PATTERN?

List names of tables matching a LIKE

pattern(查看數據庫的表列表)

.timeout MS

Try opening locked tables for MS

milliseconds(在 MS 時間內嘗試打開被鎖定的表)

.width NUM NUM ...

Set column widths for "column" mode(設置 column

模式中的列的寬度)

.timer ON|OFF

(顯示CPU時間)

.vfsname ?AUX?

(顯示 VFS 棧信息)

.restore ?DB? FILE

(從文件中還原數據到表,? 默認表為 main)

sqlite>

六.改變輸出格式(.mode)

sqlite3程序可以以八種不同的格式顯示一個查詢的結果:"csv", "列",

"html", "插入", "行", "制表"和"tcl"。你可以用".mode"點命令在這些輸出格式之間切換。

默認的輸出格式是“列表”。在列表模式下,每條查詢結果記錄被寫在一行中并且每列之間以一個字符串分割符隔開。默認的分隔符是一個管道符號(“|”)。列表符號在當你輸出查詢結果到另外一個符加處理的程序(如AWK)中去是尤為有用。

sqlite> .mode list

sqlite> select * from tbl1;

hello|10

goodbye|20

sqlite>

你可以用“.separator”點命令來改變分界符。例如,為了把分割符改為一個逗號和一個空格,你可以這樣做:

sqlite> .separator ", "

sqlite> select * from tbl1;

hello, 10

goodbye, 20

sqlite>

在“line"模式下,每一個位于條記錄中的列在它自己那行顯示。每行由列名、一個等號和列數據組成。下一條記錄以一個空行隔開。這是一個行模式輸出的例子:

sqlite> .mode line

sqlite> select * from tbl1;

one = hello

two = 10

one = goodbye

two = 20

sqlite>

在列模式下,每條記錄在一個單獨的行中以數據列對齊的方式顯示。列如:

sqlite> .mode column

sqlite> select * from tbl1;

one ? ? ? ? ?two

---------- ? ----------

hello ? ? ? ?10

goodbye ? ? ?20

sqlite>

在默認的情況下,每列至少10個字符寬。太寬(超過設定的寬度)的數據將被截取。你可以用“.width”命令來調整列寬。如下所示:

sqlite> .width 12 6??????????? (第一列12,第二列6)

sqlite> select * from tbl1;

one ? ? ? ? ? ?two

------------ ? ------

hello ? ? ? ? ?10

goodbye ? ? ? ?20

sqlite>

上面例子中".width"命令設置第一列寬為12第二列寬為6。其它的列寬不變。你可以指定與你查詢結果需要的列數一樣多的“.width”參數。

如果你指定一列寬為0,那么這個列寬將自動以下面三個數字中的最大值做為列寬:10、表頭寬度和最寬的數據列的寬度。這可以讓列自動調整寬度。每列的默認設置為自動調整的0值。

出現在輸出開頭兩行的列標示可以用".header"點命令關閉。在上面的例子中,列標示是打開的。可以用下面的方法關閉列標示:

sqlite> .header off

sqlite> select * from tbl1;

hello ? ? ? ? ?10

goodbye ? ? ? ?20

sqlite>

另外一個有用的輸出模式是"insert"。在插入模式下,被子格式化為看起來像SQL INSERT語句的樣式。你可以用插入模式來產生文件(便于)以后用于不同數據庫的輸入。

當指定插入模式時,你必須給定一個特定參數就是要插入的表名。例如:

sqlite> .mode insert new_table

sqlite> select * from tbl1;

INSERT INTO 'new_table' VALUES('hello',10);

INSERT INTO 'new_table' VALUES('goodbye',20);

sqlite>

最新的輸出格式是“html”。在這種模式下,sqlite3把查詢的結果寫做XHTML表。開始的

(標記)沒有寫出,但有、和等分界符。html輸出對 CGI來說是相當有用地。

把結果寫到文件中

七.查詢數據庫結構

sqlite3程序提供幾個有用的用于查詢數據庫結構的快捷命令。這些不是不可以用別的方式來實現。這些命令僅僅是一個快捷方式而已。

例如,為了查看數據庫的表列表,你可以敲入“.tables”。

sqlite> .tables

tbl1

tbl2

sqlite>

“.tables”命令相似于設置列表模式然后執行接下來的查詢:

SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE

'sqlite_%'UNION ALL SELECT name FROM sqlite_temp_master WHERE type IN

('table','view') ORDER BY 1sqlite> .schema

create table tbl1(one varchar(10), two smallint)

CREATE TABLE tbl2 (

f1 varchar(30) primary key,

f2 text,

f3 real

)

sqlite> .schema tbl2

CREATE TABLE tbl2 (

f1 varchar(30) primary key,

f2 text,

f3 real

)

sqlite>

八.事實上

你可以查看sqlite3的源代碼(可以在源文件樹的src/shell.c中),你可找到上面的具體的查詢。

“.indices” 命令作用類似的方式是列出特定表的所有的索引。“.indics”命令須一個參數即所要索引表的表名。最后,但不是至少,是“.schema”命令。不帶 任何參數,“.schema”命令顯示原始的用于創建當前數據庫的CREATE TABLE和CREATE INDEX語句。如果你給".schema"命令一個表名,它顯示原始的創建該表和它所有索引的CREATE語句。我們可以:

".schema"命令可以用設置列表然后執行以下查詢來實現:

SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM

sqlite_temp_master)WHERE type!='meta'ORDER BY tbl_name, type DESC, name

或者,如果你給".schema"命令一個參數,由于你只想得到一個表的結構,查詢可以是這樣:

SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM

sqlite_temp_master)WHERE type!='meta' AND sql NOT NULL AND name NOT LIKE

'sqlite_%'ORDER BY substr(type,2,1), name

你可以擔供一個參數給.schema命令。如果這橛,查詢可以是這樣的:

SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM

sqlite_temp_master)WHERE tbl_name LIKE '%s' AND type!='meta' AND sql NOT NULL

AND name NOT LIKE 'sqlite_%'ORDER BY substr(type,2,1), name

在查詢中“%S“為你的參數所取代。這使你可以詢數據庫結構的某個子集。

sqlite> .schema %abc%

與這些一起,“.table”命令也接受一個模式作為他的參數。如果你給“.table”一個參數,“%”將被前后擴展并且一個LIKE子句被附加到查詢上。這讓你可以列出只與特定模式相匹配的的表。

“.databases” 命令顯示所有當前連接打開的數據庫的一個列表。將允許一次到少兩個。第一個是“main”,最初打開的那個數據庫。第二個是"temp",用于臨時表的數 據庫。對于用ATTACH語句附加的數據也許有附加數據庫列表。輸出的第一列與之相聯的數據庫名,第二列是外部文件名。

sqlite> .databases

九.將整個數據庫轉換為ASCII文本文件

".dump"命令成一個單一的ASCII文本文件。這個文件可以被用作管道傳遞給sqlite3命令來轉換回數據庫。

一個最好的制作一個數據庫檔案拷貝的命令是:

$ echo '.dump' | sqlite3 ex1 | gzip -c >ex1.dump.gz

它產生一個一個名為ex1.dump.gz的文件,它包含了你以后或在其它機器上重構數據庫的所有的信息。要重構數據庫,只須敲入:

$ zcat ex1.dump.gz | sqlite3 ex2

這個文本格式是純粹的SQL語句所以你可以用.dump命令來導出一個SQLite數據庫到另一個常用的SQL數據庫引擎。比如:

$ createdb ex2

$ sqlite3 ex1 .dump | psql ex2

十.Sqlite3 表結構和數據的導出及導入

數據庫結構導出和導入:

“.output” 默認情況下,sqlte3把結送到標準輸出。你可以用“.output”命令改變它。只須把輸出文件名做為.output命令的輸出參數然后所有后續查詢結果將被寫到那個文件中。

用“.output stdout”再一次改為標準輸出。例如:

全部導出

$sqlite3 data.db

sqlite >.output dd

sqlite >.dump

sqlite > .exit

$cat dd ??????????????//以下是數據庫的結構

PRAGMA foreign_keys=OFF;

BEGIN TRANSACTION;

CREATE TABLE long(h,m);

INSERT INTO "long" VALUES('hhhhhh',2);

INSERT INTO "long" VALUES('hello',2);

INSERT INTO "long" VALUES('mall',5);

INSERT INTO "long" VALUES('suinvzi',8);

INSERT INTO "long" VALUES('meimei',5);

CREATE TABLE bak(m

varchar(10), n int);

INSERT INTO "bak" VALUES('hhhhhh',2);

INSERT INTO "bak" VALUES('hell',2);

INSERT INTO "bak" VALUES('mall',5);

INSERT INTO "bak" VALUES('suinvzi',8);

INSERT INTO "bak" VALUES('meimei',5);

COMMIT;

[h2]?導出表結構

sqlite >.output dd

sqlite >.schema

sqlite > .exit

$cat dd

//以下是表的結構

CREATE TABLE bak(m

varchar(10), n int);

CREATE TABLE long(h,m);

全部導入: (用.read命令,執行

FILENAME 中的 SQL語句)

sqlite3

mydb.db

sqlite >.read dd

sqlite >.tables

bak long ?????????//導入的是空表bak,long

數據的導出和導入:

導出:例如:

$sqlite3 data.db

sqlite> .mode list

sqlite> .separator |

sqlite> .output test_file_1

sqlite> select * from long;

sqlite> .exit

$ cat test_file_1

hhhhhh|2

hello|2

mall|5

suinvzi|8

meimei|5

$

備注:每次導出若為同一個文本,則正在導出的內容覆蓋上次導出的內容

導入: 例如:(用.import 導入的文本 被導入的表 命令, 把文件中的數據導入表中)

$sqlite3 mydb.db

sqlite> .show

echo: off

explain: off

headers: off

mode: list

nullvalue: ""

output: stdout

separator: "|"

stats: off

width:

sqlite> .import test_file_1 long

sqlite> select * from long;

hhhhhh|2

hello|2

mall|5

suinvzi|8

meimei|5

導入結束

備注:文本的內容所對應的數據分布與所要導入的表一致,元素間的分割符要與”.show”中separator: "|"的字符一致如果不一致可直接修改, 比如: sqlite>.separator "," 將分隔符轉為逗號,不然導入會出錯.

十一.其它的點命令

".explain"

命令可以被用來設置輸出格式為“column”

并設置列寬為EXPLAIN命令看起來比較合理的寬度。EXPLAIN命令是SQLite特有的SQL擴展,它是對調試有用。如果任何常規的SQL被 EXPLAIN執行,那么SQL命令被分解并分析但并不執行。取而代之的是,虛擬機指令序列將被用于執行SQL命令并返回一個類似的查詢結果。如:

sqlite> .explain

sqlite> explain delete from tbl1 where two<20;

addr ? opcode ? ? ? ? p1 ? ? ?p2

p3

---- ? ------------ ? ----- ? -----

-------------------------------------

0 ? ? ?ListOpen ? ? ? 0 ? ? ? 0

1 ? ? ?Open ? ? ? ? ? 0

1 ? ? ? tbl1

2 ? ? ?Next ? ? ? ? ? 0

9

3 ? ? ?Field ? ? ? ? ?0

1

4 ? ? ?Integer ? ? ? ?20

0

5 ? ? ?Ge ? ? ? ? ? ? 0

2

6 ? ? ?Key ? ? ? ? ? ?0

0

7 ? ? ?ListWrite ? ? ?0 ? ? ? 0

8 ? ? ?Goto ? ? ? ? ? 0

2

9 ? ? ?Noop ? ? ? ? ? 0

0

10 ? ? ListRewind ? ? 0 ? ? ? 0

11 ? ? ListRead ? ? ? 0 ? ? ? 14

12 ? ? Delete ? ? ? ? 0 ? ? ? 0

13 ? ? Goto ? ? ? ? ? 0

11

14 ? ? ListClose ? ? ?0 ? ? ? 0

“.timeout”命令設置sqlite3等待一個試圖存儲文件鎖定請除直到錯誤返回的總時間。默認的超時值是0因此如果任何需要的數據庫表或序列列被鎖定時它將立即返回一個錯誤。

最后,我們提到“.exit”命令它將導致sqlite3退出。

十二.在命令和腳本中使用sqlite3

個在腳本命令中使用sqlite3的方式是用“echo”或“cat”來產生一個命令序列在一個文件中,然后當從一個產生的命令行中重定向輸入時調用 sqlite3。它有用并且適應許多環境。但作為一附加的便利是,sqlite3允許一個單一的SQL語句在命令行中作為數據庫名后的第二個參數輸入。當 sqlite3程序帶著兩個參數啟動時,第二個參數被傳遞給SQLite庫處理,查詢以列表模式打印到標準輸出,然后程序退出。這個機制被設計用于讓

sqlite3容易于用于連接諸如"AWK"的程序。例如:

$ sqlite3 ex1 'select * from tbl1' |

> awk '{printf "

%s%s\n",$1,$2 }'hello10goodbye20

$

十三.結束命令行命令

SQLite 命令通常以一個分號結束。在一個命令行中你也可以用“GO”單詞(大小寫敏感)或者一個“/”斜線在它所在好行結束一個命令。這常被SQL Server和Oracle使用。這些將不在sqlite3_exec()中有用,因為命令行在傳遞它們到函數之前把這些翻譯為分號。

十四.參數化的SQL語句

sqlite可以在shell/dos command底下直接執行命令:

對數據庫進行SQL操作:

sqlite3數據庫 "SQL語句 或

.命令;"

輸出 HTML表格:

sqlite3 -html film.db "select * from

film;"

將數據庫「導出來」:sqlite3 film.db ".dump" > output.sql

利用輸出的資料,建立一個一模一樣的數據庫(加上以上指令,就是標準的SQL數據庫備份了):

將數據庫「導進去」:

sqlite3 film.db < output.sql

在大量插入資料時,你可能會需要先打這個指令:

begin;

插入完資料后要記得打這個指令,資料才會寫進數據庫中:

commit;

十五.SQLITE深入------常見問題

1.如何建立自動增長字段?

簡短回答:聲明為 INTEGER PRIMARY KEY 的列將會自動增長

(如果是最大可能的主鍵 9223372036854775807,那個,將鍵值將是隨機未使用的數。)如,有下列表:

CREATE TABLE t1(

a INTEGER PRIMARY KEY,

b INTEGER

);

在該表上,下列語句

INSERT INTO t1 VALUES(NULL,123);

在邏輯上等價于:

INSERT INTO t1 VALUES((SELECT max(a) FROM

t1)+1,123);

有一個新的API叫做

sqlite3_last_insert_rowid(), 它將返回最近插入的整數值。 注意該整數會比表中該列上的插入之前的最大值大1。

該鍵值在當前的表中是唯一的。但有可能與已從表中刪除的值重疊。要想建立在整個表的生命周期中唯一的鍵值,需要在 INTEGER PRIMARY KEY 上增加AUTOINCREMENT聲明。那么,新的鍵值將會比該表中曾能存在過的最大值大1。如果最大可能的整數值在數據表中曾經存在過,INSERT將會失敗,

并返回SQLITE_FULL錯誤代碼。

2.多個應用程序或一個應用程序的多個實例可以同時訪問同一個數據庫文件嗎?

多個進程可同時打開同一個數據庫。多個進程可以同時進行SELECT 操作,但在任一時刻,只能有一個進程對數據庫進行更改。

SQLite使用讀、寫鎖控制對數據庫的訪問。(在Win95/98/ME等不支持讀、寫鎖的系統下,使用一個概率性的模擬來代替。)但使用時要注意:如果數據庫文件存放于一個NFS文件系統上,這種鎖機制可能不能正常工作。

這是因為 fcntl() 文件鎖在很多NFS上沒有正確的實現。

在可能有多個進程同時訪問數據庫的時候,應該避免將數據庫文件放到NFS上。在Windows上,Microsoft的文檔中說:如果使用 FAT 文件系統而沒有運行 share.exe 守護進程,那么鎖可能是不能正常使用的。那些在Windows上有很多經驗的人告訴我:對于網絡文件,文件鎖的實現有好多Bug,是靠不住的。如果他們說的是對的,那么在兩臺或多臺Windows機器間共享數據庫可能會引起不期望的問題。

我們意識到,沒有其它嵌入式的 SQL 數據庫引擎能象 SQLite 這樣處理如此多的并發。SQLite允許多個進程同時打開一個數據庫,同時讀一個數據庫。當有任何進程想要寫時,它必須在更新過程中鎖住數據庫文件。但那通常只是幾毫秒的時間。其它進程只需等待寫進程干完活結束。典型地,其它嵌入式的SQL數據庫引擎同時只允許一個進程連接到數據庫。

但是,Client/Server數據庫引擎(如 PostgreSQL, MySQL, 或 Oracle)通常支持更高級別的并發,并且允許多個進程同時寫同一個數據庫。這種機制在Client/Server結構的數據庫上是可能的,因為總是有一個單一的服務器進程很好地控制、協調對數據庫的訪問。如果你的應用程序需要很多的并發,那么你應該考慮使用一個Client/Server 結構的數據庫。但經驗表明,很多應用程序需要的并發,往往比其設計者所想象的少得多。

當SQLite試圖訪問一個被其它進程鎖住的文件時,缺省的行為是返回 SQLITE_BUSY。

可以在C代碼中使用 sqlite3_busy_handler() 或

sqlite3_busy_timeout() API 函數調整這一行為。

3.在SQLite數據庫中如何列出所有的表和索引?

如果你運行 sqlite3 命令行來訪問你的數據庫,可以鍵入 “.tables”來獲得所有表的列表。或者,你可以輸入 “.schema” 來看整個數據庫模式,包括所有的表的索引。輸入這些命令,后面跟一個LIKE模式匹配可以限制顯示的表。

在一個 C/C++ 程序中(或者腳本語言使用 Tcl/Ruby/Perl/Python 等)

你可以在一個特殊的名叫 SQLITE_MASTER 上執行一個SELECT查詢以獲得所有

表的索引。每一個 SQLite 數據庫都有一個叫 SQLITE_MASTER 的表,

它定義數據庫的模式。 SQLITE_MASTER 表看起來如下:

CREATE TABLE sqlite_master (

type TEXT,

name TEXT,

tbl_name TEXT,

rootpage INTEGER,

sql TEXT

);

對于表來說,type 字段永遠是 'table',name 字段永遠是表的名字。所以,要獲得數據庫中所有表的列表,使用下列SELECT語句:

SELECT name FROM sqlite_master

WHERE type='table'

ORDER BY name;

對于索引,type 等于 'index', name 則是索引的名字,tbl_name 是該索引所屬的表的名字。不管是表還是索引,sql 字段是原先用 CREATE TABLE 或 CREATE INDEX 語句創建它們時的命令文本。對于自動創建的索引(用來實現 PRIMARY KEY 或 UNIQUE 約束),sql字段為NULL。

SQLITE_MASTER 表是只讀的。不能對它使用

UPDATE、INSERT 或 DELETE。

它會被 CREATE TABLE、CREATE INDEX、DROP TABLE 和 DROP INDEX 命令自動更新。

臨時表不會出現在 SQLITE_MASTER 表中。臨時表及其索引和觸發器存放在另外一個叫 SQLITE_TEMP_MASTER 的表中。SQLITE_TEMP_MASTER 跟 SQLITE_MASTER 差不多,但它只是對于創建那些臨時表的應用可見。如果要獲得所有表的列表,

不管是永久的還是臨時的,可以使用類似下面的命令:

SELECT name FROM

(SELECT * FROM sqlite_master UNION ALL

SELECT * FROM sqlite_temp_master)

WHERE type='table'

ORDER BY name

4.在SQLite中,VARCHAR字段最長是多少?

SQLite 不強制 VARCHAR 的長度。 你可以在 SQLITE 中聲明一個

VARCHAR(10),SQLite還是可以很高興地允許你放入500個字符。

并且這500個字符是原封不動的,它永遠不會被截斷。

5.SQLite支持二進制大對象嗎?

SQLite 3.0 及以后版本允許你在任何列中存儲 BLOB 數據。即使該列被聲明為其它類型也可以。

在SQLite中,如何在一個表上添加或刪除一列?

SQLite 有有限地 ALTER TABLE 支持。你可以使用它來在表的末尾增加一列,可更改表的名稱。如果需要對表結構做更復雜的改變,則必須重新建表。重建時可以先將已存在的數據放到一個臨時表中,刪除原表,

創建新表,然后將數據從臨時表中復制回來。

如,假設有一個 t1 表,其中有 "a", "b", "c" 三列, 如果要刪除列 c ,以下過程描述如何做:

BEGIN TRANSACTION;

CREATE TEMPORARY TABLE t1_backup(a,b);

INSERT INTO t1_backup SELECT a,b FROM t1;

DROP TABLE t1;

CREATE TABLE t1(a,b);

INSERT INTO t1 SELECT a,b FROM t1_backup;

DROP TABLE t1_backup;

COMMIT;[h3]

6.在數據庫中刪除了很多數據,但數據庫文件沒有變小,是Bug嗎?

不是。當你從SQLite數據庫中刪除數據時,

未用的磁盤空間將會加入一個內部的“自由列表”中。

當你下次插入數據時,這部分空間可以重用。磁盤空間不會丟失,但也不會返還給操作系統。

如果刪除了大量數據,而又想縮小數據庫文件占用的空間,執行 VACUUM 命令。 VACUUM 將會從頭重新組織數據庫。這將會使用數據庫有一個空的“自由鏈表”,

數據庫文件也會最小。但要注意的是,VACUUM 的執行會需要一些時間(在SQLite開發時,在Linux上,大約每M字節需要半秒種),并且,

執行過程中需要原數據庫文件至多兩倍的臨時磁盤空間。

對于 SQLite 3.1版本,一個 auto-vacumm 模式可以替代 VACUUM 命令。

可以使用 auto_vacuum pragma 打開。

7.SQLITE_SCHEMA error是什么錯誤?為什么會出現該錯誤?

當一個準備好的(prepared)SQL語句不再有效或者無法執行時,將返回一個 SQLITE_SCHEMA 錯誤。發生該錯誤時,SQL語句必須使用 sqlite3_prepare() API來重新編譯. 在 SQLite 3 中, 一個 SQLITE_SCHEMA 錯誤只會發生在用 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 執行 SQL 時。而不會發生在使用

sqlite3_exec()時。

在版本2中不是這樣。

準備好的語句失效的最通常原因是:在語句準備好后,

數據庫的模式又被修改了。另外的原因會發生在:

數據庫離線:DETACHed.

數據庫被 VACUUMed

一個用戶存儲過程定義被刪除或改變。

一個 collation 序列定義被刪除或改變。

認證函數被改變。

在所有情況下,解決方法是重新編譯并執行該SQL語句。

因為一個已準備好的語句可以由于其它進程改變數據庫模式而失效,所有使用 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 的代碼都應準備處理

SQLITE_SCHEMA 錯誤。下面給出一個例子:

int rc;

sqlite3_stmt *pStmt;

char zSql[] = "SELECT .....";

do {

/* Compile the statement from SQL. Assume

success. */

sqlite3_prepare(pDb, zSql, -1, &pStmt, 0);

while(

SQLITE_ROW==sqlite3_step(pStmt) ){

/* Do something with the row of

available data */

}

/* Finalize

the statement. If an SQLITE_SCHEMA error has

** occured, then the above call to

sqlite3_step() will have

** returned SQLITE_ERROR. sqlite3_finalize()

will return

** SQLITE_SCHEMA. In this case the loop will

execute again.

*/

rc = sqlite3_finalize(pStmt);

} while( rc==SQLITE_SCHEMA );

8.如何一次插入多個數據

Insert into SAMPLE(PRJNUM, PRJNAME, EMYNUM,

EMYNAME, SALCATEGORY, SALPACKAGE)

values(100001, 'TPMS', 200001, 'Johnson',

'A', 2000), (100001, 'TPMS', 200002,

'Christine', 'B', 3000), (100001, 'TPMS',

200003, 'Kevin', 'C', 4000), (100002,

'TCT', 200001, 'Johnson', 'A', 2000),

(100002, 'TCT', 200004, 'Apple', 'B',

3000);

9.如何備份數據庫

先打開數據庫test.db

sqlite>sqlite3

test.db

sqlite> .backup test.bak

10.如何恢復數據庫

先打開數據庫test.db

sqlite>sqlite3

test.db

sqlite>

.restore test.bak

11.先判斷表如果不存在,則再創建表

SQL可以如下寫,供參考:

create

table if not exists student(id integer primary

key autoincrement,/

age

smallint ,anchor smallint);

12.如何查詢SQLite3小工具的版本

執行 select sqlite_version();命令即可

十六.Sqlite數據庫中索引的使用、索引的優缺點

要使用索引對數據庫的數據操作進行優化,那必須明確幾個問題:

1.什么是索引

2.索引的原理

3.索引的優缺點

4.什么時候需要使用索引,如何使用

圍繞這幾個問題,來探究索引在數據庫操作中所起到的作用。

1.

數據庫索引簡介

回憶一下小時候查字典的步驟,索引和字典目錄的概念是一致的。字典目錄可以讓我們不用翻整本字典就找到我們需要的內容頁數,然后翻到那一頁就可以。索引也是一樣,索引是對記錄按照多個字段進行排序的一種展現。對表中的某個字段建立索引會創建另一種數據結構,其中保存著字段的值,每個值還包括指向與它相關記錄的指針。這樣,就不必要查詢整個數據庫,自然提升了查詢效率。同時,索引的數據結構是經過排序的,因而可以對其執行二分查找,那就更快了。

2. B-樹與索引

大多數的數據庫都是以B-樹或者B+樹作為存儲結構的,B樹索引也是最常見的索引。先簡單介紹下B-樹,可以增強對索引的理解。

B-樹是為磁盤設計的一種多叉平衡樹,B樹的真正最準確的定義為:一棵含有t(t>=2)個關鍵字的平衡多路查找樹。一棵M階的B樹滿足以下條件:

1)每個結點至多有M個孩子;

2)除根結點和葉結點外,其它每個結點至少有M/2個孩子;

3)根結點至少有兩個孩子(除非該樹僅包含一個結點);

4)所有葉結點在同一層,葉結點不包含任何關鍵字信息,可以看作一種外部節點;

5)有K個關鍵字的非葉結點恰好包含K+1個孩子;

B樹中的每個結點根據實際情況可以包含大量的關鍵字信息和分支(當然是不能超過磁盤塊的大小,根據磁盤驅動(disk drives)的不同,一般塊的大小在1k~4k左右);這樣樹的深度降低了,這就意味著查找一個元素只要很少結點從外存磁盤中讀入內存,很快訪問到要查找的數據。B-樹上操作的時間通常由存取磁盤的時間和CPU計算時間這兩部分構成。而相對于磁盤的io速度,cpu的計算時間可以忽略不計,所以B樹的意義就顯現出來了,樹的深度降低,而深度決定了io的讀寫次數。

B樹索引是一個典型的樹結構,其包含的組件主要是:

1)葉子節點(Leaf node):包含條目直接指向表里的數據行。

2)分支節點(Branch node):包含的條目指向索引里其他的分支節點或者是葉子節點。

3) ?根節點(Root node):一個B樹索引只有一個根節點,它實際就是位于樹的最頂端的分支節點。

如下圖所示:

每個索引都包含兩部分內容,一部分是索引本身的值,第二部分即指向數據頁或者另一個索引也的指針。每個節點即為一個索引頁,包含了多個索引。

當你為一個空表建立一個索引,數據庫會分配一個空的索引頁,這個索引頁即代表根節點,在你插入數據之前,這個索引頁都是空的。每當你插入數據,數據庫就會在根節點創建索引條目,。當根節點插滿的時候,再插入數據時,根節點就會分裂。舉個例子,根節點插入了如圖所示的數據。(超過4個就分裂),這時候插入H,就會分裂成2個節點,移動G到新的根節點,把H和N放在新的右孩子節點中。如圖所示:

根節點插滿4個節點

插入H,進行分裂。

大致的分裂步驟如下:

1)創建兩個兒子節點

2)將原節點中的數據近似分為兩半,寫入兩個新的孩子節點中。

3)在跟節點中放置指向頁節點的指針

當你不斷向表中插入數據,根節點中指向葉節點的指針也被插滿,當葉子還需要分裂的時候,根節點沒有空間再創建指向新的葉節點的指針。那么數據庫就會創建分支節點。隨著葉子節點的分裂,根節點中的指針都指向了這些分支節點。隨著數據的不斷插入,索引會增加更多的分支節點,使樹結構變成這樣的一個多級結構。

3. 索引的種類

1)聚集索引:表中行的物理順序與鍵值的邏輯(索引)順序相同。因為數據的物理順序只能有一種,所以一張表只能有一個聚集索引。如果一張表沒有聚集索引,那么這張表就沒有順序的概念,所有的新行都會插入到表的末尾。對于聚集索引,葉節點即存儲了數據行,不再有單獨的數據頁。就比如說我小時候查字典從來不看目錄,我覺得字典本身就是一個目錄,比如查裴字,只需要翻到p字母開頭的,再按順序找到e。通過這個方法我每次都能最快的查到老師說的那個字,得到老師的表揚。

2)非聚集索引:表中行的物理順序與索引順序無關。對于非聚集索引,葉節點存儲了索引字段值以及指向相應數據頁的指針。葉節點緊鄰在數據之上,對數據頁的每一行都有相應的索引行與之對應。有時候查字典,我并不知道這個字讀什么,那我就不得不通過字典目錄的“部首”來查找了。這時候我會發現,目錄中的排序和實際正文的排序是不一樣的,這對我來說很苦惱,因為我不能比別人快了,我需要先再目錄中找到這個字,再根據頁數去找到正文中的字。

4.索引與數據的查詢,插入與刪除

1)查詢。查詢操作就和查字典是一樣的。當我們去查找指定記錄時,數據庫會先查找根節點,將待查數據與根節點的數據進行比較,再通過根節點的指針查詢下一個記錄,直到找到這個記錄。這是一個簡單的平衡樹的二分搜索的過程,我就不贅述了。在聚集索引中,找到頁節點即找到了數據行,而在非聚集索引中,我們還需要再去讀取數據頁。

2)插入。聚集索引的插入操作比較復雜,最簡單的情況,插入操作會找到對于的數據頁,然后為新數據騰出空間,執行插入操作。如果該數據頁已經沒有空間,那就需要拆分數據頁,這是一個非常耗費資源的操作。對于僅有非聚集索引的表,插入只需在表的末尾插入即可。如果也包含了聚集索引,那么也會執行聚集索引需要的插入操作。

3)刪除。刪除行后下方的數據會向上移動以填補空缺。如果刪除的數據是該數據頁的最后一行,那么這個數據頁會被回收,它的前后一頁的指針會被改變,被回收的數據頁也會在特定的情況被重新使用。與此同時,對于聚集索引,如果索引頁只剩一條記錄,那么該記錄可能會移動到鄰近的索引表中,原來的索引頁也會被回收。而非聚集索引沒辦法做到這一點,這就會導致出現多個數據頁都只有少量數據的情況。

5. 索引的優缺點

其實通過前面的介紹,索引的優缺點已經一目了然。

先說優點:

1)大大加快數據的檢索速度,這也是創建索引的最主要的原因

2)加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。

3)在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。

再說缺點:

1)創建索引需要耗費一定的時間,但是問題不大,一般索引只要build一次

2)索引需要占用物理空間,特別是聚集索引,需要較大的空間

3)當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低了數據的維護速度,這個是比較大的問題。

6. 索引的使用

根據上文的分析,我們大致對什么時候使用索引有了自己的想法(如果你沒有,回頭再看一遍。。。)。一般我們需要在這些列上建立索引:

1)在經常需要搜索的列上,這是毋庸置疑的;

2)經常同時對多列進行查詢,且每列都含有重復值可以建立組合索引,組合索引盡量要使常用查詢形成索引覆蓋(查詢中包含的所需字段皆包含于一個索引中,我們只需要搜索索引頁即可完成查詢)。 同時,該組合索引的前導列一定要是使用最頻繁的列。對于前導列的問題,在后面sqlite的索引使用介紹中還會做討論。

3)在經常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度,連接條件要充分考慮帶有索引的表。;

4)在經常需要對范圍進行搜索的列上創建索引,因為索引已經排序,其指定的范圍是連續的,同樣,在經常需要排序的列上最好也創建索引。

6)在經常放到where子句中的列上面創建索引,加快條件的判斷速度。要注意的是where字句中對列的任何操作(如計算表達式,函數)都需要對表進行整表搜索,而沒有使用該列的索引。所以查詢時盡量把操作移到等號右邊。

對于以下的列我們不應該創建索引:

1)很少在查詢中使用的列

2)含有很少非重復數據值的列,比如只有0,1,這時候掃描整表通常會更有效

3)對于定義為TEXT,IMAGE的數據不應該創建索引。這些字段長度不固定,或許很長,或許為空。

當然,對于更新操作遠大于查詢操作時,不建立索引。也可以考慮在大規模的更新操作前drop索引,之后重新創建,不過這就需要把創建索引對資源的消耗考慮在內。總之,使用索引需要平衡投入與產出,找到一個產出最好的點。

7. 在sqlite中使用索引

1)Sqlite不支持聚集索引,android默認需要一個_id字段,這保證了你插入的數據會按“_id”的整數順序插入,這個integer類型的主鍵就會扮演和聚集索引一樣的角色。所以不要再在對于聲明為:INTEGER PRIMARY KEY的主鍵上創建索引。

2)很多對索引不熟悉的朋友在表中創建了索引,卻發現沒有生效,其實這大多數和我接下來講的有關。對于where子句中出現的列要想索引生效,會有一些限制,這就和前導列有關。所謂前導列,就是在創建復合索引語句的第一列或者連續的多列。比如通過:CREATE INDEX comp_ind ON table1(x, y, z)創建索引,那么x,xy,xyz都是前導列,而yz,y,z這樣的就不是。下面講的這些,對于其他數據庫或許會有一些小的差別,這里以sqlite為標準。在where子句中,前導列必須使用等于或者in操作,最右邊的列可以使用不等式,這樣索引才可以完全生效。同時,where子句中的列不需要全建立了索引,但是必須保證建立索引的列之間沒有間隙。舉幾個例子來看吧:

用如下語句創建索引:

CREATE INDEX idx_ex1 ON ex1(a,b,c,d,e,...,y,z);

這里是一個查詢語句:

...WHERE a=5 AND b IN (1,2,3) AND c IS NULL AND d='hello'

這顯然對于abcd四列都是有效的,因為只有等于和in操作,并且是前導列。

再看一個查詢語句:

... WHERE a=5 AND b IN (1,2,3) AND c>12 AND d='hello'

那這里只有a,b和c的索引會是有效的,d列的索引會失效,因為它在c列的右邊,而c列使用了不等式,根據使用不等式的限制,c列已經屬于最右邊。

最后再看一條:

... WHERE b IN (1,2,3) AND c NOT NULL AND d='hello'

索引將不會被使用,因為沒有使用前導列,這個查詢會是一個全表查詢。

3)對于between,or,like,都無法使用索引。

如 ...WHERE myfield BETWEEN 10 and 20;

這時就應該將其轉換成:

...WHERE myfield >= 10 AND myfield <= 20;

再如LIKE:...mytable WHERE myfield LIKE 'sql%';;

此時應該將它轉換成:

...WHERE myfield >= 'sql' AND myfield < 'sqm';

再如OR:...WHERE myfield = 'abc' OR myfield = 'xyz';

此時應該將它轉換成:

...WHERE myfield IN ('abc', 'xyz');

其實除了索引,對查詢性能的影響因素還有很多,比如表的連接,是否排序等。影響數據庫操作的整體性能就需要考慮更多因素,使用更對的技巧,不得不說這是一個很大的學問。

最后在android上使用sqlite寫一個簡單的例子,看下索引對數據庫操作的影響。

創建如下表和索引:

db.execSQL("create table if not exists t1(a,b)");

db.execSQL("create index if not exists ia on t1(a,b)");

插入10萬條數據,分別對表進行如下操作:

select * from t1 where a='90012'

插入:insert into t1(a,b) values('10008','name1.6982235534984673')

更新:update t1 set b='name1.999999' where a = '887'

刪除:delete from t1

where a = '1010'

數據如下(5次不同的操作取平均值):

操作 ??無索引 ? ?有索引

查詢 ??170ms ?5ms

插入 ??65ms ??75ms

更新 ??240ms ?52ms

刪除 ??234ms ?78ms

可以看到顯著提升了查詢的速度,稍稍減慢了插入速度,還稍稍提升了更新數據和刪除數據的速度。如果把更新和刪除中的where子句中的列換成b,速度就和沒有索引一樣了,因為索引失效。所以索引能大幅度提升查詢速度,對于刪除和更新操作,如果where子句中的列使用了索引,即使需要重新build索引,有可能速度還是比不使用索引要快的。對與插入操作,索引顯然是個負擔。同時,索引讓db的大小增加了2倍多。

還有個要吐槽的是,android中的rawQurey方法,執行完sql語句后返回一個cursor,其實并沒有完成一個查詢操作,我在rawquery之前和之后計算查詢時間,永遠是1ms...這讓我無比苦悶。看了下源碼,在對cursor調用moveToNext這些移動游標方法時,都會最終先調用getCount方法,而getCount方法才會調用native方法調用真正的查詢操作。這種設計顯然更加合理

[h2]這是一個事物操作的范例:

[h3]事物..

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397825.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397825.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397825.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android學習之查看網絡圖片

在這里小編學習了查看網絡圖片的小案例,: 初始界面: 點擊瀏覽后,效果如下: 需要注意的是 該案例需要獲取聯網權限,即: <uses-permission android:name"android.permission.INTERNET"/>具體步驟如下: 1.定義并初始化控件: private EditText etImageUrl;private …

AutoLayout 淺析動畫

1.AutoLayout相關的幾個易混淆的方法 setNeedsLayout layoutIfNeeded layoutSubViews setNeedsUpdateConstraints updateConstraitsIfNeed updateConstraints 子視圖在界面上的顯示大概經過了&#xff1a;更新約束-通過約束依賴關系得到具體的frame-展示到界面。上面幾個是和au…

vue 轉為靜態html,Vue CLI 3使用:HTML和靜態資源(五)

HTMLpublic/index.html 文件是一個會被 html-webpack-plugin 處理的模板。構建中&#xff0c;各種資源路徑會被注入解析。可以使用 lodash template 語法插入內容。用來做不轉義插值&#xff1b;用來做 HTML 轉義插值&#xff1b;用來描述 JavaScript 流程控制。除了被 html-we…

animate css3 應用的借鑒,一個同事寫的JS

$("#banner").height($(window).height()-125);$(window).resize(function(){ $("#banner").height($(window).height()-125);}); //首頁幻燈$(".indeximgs:first").show();var i0;$(".leftbut").click(function(){$(".indexim…

從html導出帶樣式的excel,Jquery導出帶樣式的Excel

工作中做導出的時候&#xff0c;需要導出自定義的表格或嫌棄導出的Excel格式太難看了。需要設置顏色、字號大小、加粗、合并單元格等等。特性&#xff1a;支持過濾 某個位置支持過濾 img 標簽支持過濾 a 標簽支持過濾 input 標簽支持包含 行內樣式。HTML頁面&#xff1a;HTML頁…

elementui from表單提交_elementui upload與form一起提交

學生基本信息管理操作中&#xff0c;有照片&#xff0c;可以上傳也可以不上傳&#xff0c;在表單界面可以修改照片&#xff0c;el-upload控件可以帶額外參數提交&#xff0c;jquery的post模擬不了成表單帶文件提交的方式&#xff0c;因此&#xff0c;判斷如果有上傳文件時&…

information_schema.character_sets 學習

information_schema.character_sets 表用于查看字符集的詳細信息 1、character_sets 常用列說明&#xff1a; 1、character_set_name&#xff1a;    字符集名 2、default_collate_name&#xff1a;    默認排序規則   3、description&#xff1a;         …

asp.net mvc 用Redis實現分布式集群共享Session。

1、這兩天研究Redis搞分布式session問題&#xff0c;網上找的資料都是用ServiceStack.Redis來實現的&#xff0c;但是在做性能測試的時候發現最新的v4版本有限制每小時候最多請求6000次&#xff0c;因為官網開始商業化要收費了&#xff0c;好坑爹的說&#xff0c;還好我前期弄了…

如何用計算機求和,求和計算器

求和計算器您可以使用此求和計算器快速計算預定范圍內某個表達式的序列之和。如何使用求和計算器輸入總和的表達式輸入上限和下限提供表達式中使用的變量的詳細信息單擊“計算”按鈕生成結果。求和Σ符號計算器k ∑n 0變量:nixyzabc 103740支持的運算符常量和函數算術運算符加“…

Zookeeper概述、特點、數據模型

Zookeeper1.Zookeeper概述Zookeeper是一個工具&#xff0c;可以實現集群中的分布式協調服務。所謂的分布式協調服務&#xff0c;就是在集群的節點中進行可靠的消息傳遞&#xff0c;來協調集群的工作。Zookeeper之所以能夠實現分布式協調服務&#xff0c;靠的就是它能夠保證分布…

云計算機創意名,有創意的道路名字推薦,分享一些好聽有內涵的路名

提到龍崗板塊&#xff0c;“風向”一直飄忽不定。原本地鐵4號線今年通車&#xff0c;但是因為五象火車站的規劃建設&#xff0c;暫時未開通;機場線已經敲定&#xff0c;然而沒有龍崗的份…… [本文來自&#xff1a;www.777y.com]雖然機場線暫時無緣(可以期待下)&#xff0c;但是…

250W電源帶i7+GTX1080?

電源的科學: Q1&#xff1a;電源的額定功率是什么&#xff1f;峰值功率又是什么&#xff1f;A1&#xff1a;電源的額定功率就是電源正常工作時的功率&#xff0c;它的值為用電器的額定電壓乘以額定電流。而峰值功率指的是電源短時間內能達到的最大功率&#xff0c; 一般情況下電…

uml里的extend和include_用例圖中包含(include)擴展(extend)和泛化(generalization)關系詳解...

標簽&#xff1a;uml用例圖是解決用戶需求的圖&#xff0c;畫好用例圖一定要理清用例之間的關系。用例之間有三種關系&#xff1a;包含(include)擴展(extend)和泛化(generalization)。下面介紹三者的相同點和不同點以便區分&#xff1a;相同點&#xff1a; 三者都是從現有的用例…

數據庫的數據類型及運算符

一、數據類型 1、整數類形&#xff1a; &#xff08;重點記憶&#xff0c;常用&#xff09;有符號整形&#xff1a;int--每個int類型的數據按4個字節存儲&#xff0c;其中1位表示整數值的正負號&#xff0c;其他31位表示整數值長度和大小&#xff1b; 大整形&#xff1a;bigint…

浙江大學計算機博士很難復試專業課,浙江大學計算機學院2020年博士研究生招生復試公告...

一、復試資格通過計算機學院博士生材料初審的考生獲得復試資格&#xff0c;名單見附件。二、復試內容和成績組成博士研究生的復試內容主要包括對考生思想政治素質和品德、學術水平考核。1&#xff0e; 思想政治素質和道德品質考核思想政治素質和品德考核是博士研究生招生復試的…

推薦幾款熱門的敏捷開發工具

不知道有多少企業在很好的應用敏捷模式&#xff1b; 在今天的文章中&#xff0c;我們將一同了解更多有趣、高效且面向敏捷的項目管理工具。 Atlassian Jira/ Jira Agile   Atlassian的Jira是一款熱門工具&#xff0c;用于追蹤產品開發、幫助團隊組織問題、分配工作并保證團隊…

語言語法糖_【c#】幾種常用語法糖

語法糖&#xff08;syntactic sugar&#xff09;是由英國計算機科學家Peter J. Landin發明的術語&#xff0c;指計算機語言中添加的某種語法。這種語法不影響語言的功能&#xff0c;但更方便使用。在開發中使用語法糖能夠讓程序變得更短&#xff0c;使看起來更美觀些~空檢查pub…

CodeForces 696B Puzzles

思維&#xff0c;簡單樹$dp$。 首先計算出每一個子樹包含多少個節點&#xff0c;記為$f[i]$。然后就可以從$root$開始推出所有節點的期望了。 現在已知$fa$節點的答案為$ans[fa]$&#xff0c;假設要計算$fa$的一個兒子$v$的期望&#xff0c;那么$ans[v]ans[fa]1.0(f[fa]-f[v]-1…

2018清華計算機類專業錄取分數線,清華大學2018年各省錄取分數線及各專業錄取分數線 - 高教網...

【一批錄取分數線】港澳臺聯招&#xff1a;630分安徽&#xff1a;理科689分&#xff1b;文科675分&#xff1b;理科定向683分北京&#xff1a;理科694分&#xff1b;文科677分福建&#xff1a;理科681分&#xff1b;文科650分甘肅&#xff1a;理科652分&#xff1b;文科637分廣…

ASP.NET 對類進行XML序列化和反序列化

1 序列化方法 public void SerializeObject<T>(string Xmlname,T t){XmlSerializer ser new XmlSerializer(typeof(T));TextWriter writer new StreamWriter(Xmlname);ser.Serialize(writer, t);//要序列化的對象writer.Close();} 2 序列化方法的使用 NodeConfigInfo n…