2014年3月6日星期四

SQLite之数据插入、更新和删除

本节内容如何向SQLite表中插入,更新和删除数据。实现这些操作的SQL语句分别为INSERT,UPDATEDELETE。这些语句是SQL数据操作语言(DML)中的一部分。

插入数据

INSERT语句用于向表中插入数据。我们这里有一个已经创建好的表Books,先看看创建这个表的SQL语句结构和表中的数据。
1
2
3
4
5
6
7
8
sqlite> .schema Books
CREATE TABLE Books(Id integer PRIMARY KEY,Title text,Author text,
Isbn text default 'not available');
sqlite> SELECT * FROM Books;
Id|Title|Author|Isbn
1|C Primer Plus|Stephen Prata|978-7-115-13022-8/TP
2|鸟哥的Linux私房菜|鸟哥|978-7-115-22626-6
3|OpenGL编程指南|Dave Shreiner|978-7-111-29450-4
表Books有四列,字段名分别为Id,Title,Autor和Isbn,其中Id定义为INTEGER PRIMARY kEY,这表示Id为主键,其值是唯一标示一行数据的,同时Id的值是自动增加的,这意味着SQLite库为增加一个新的Id。
1
2
3
4
5
6
7
8
sqlite> INSERT INTO Books(Id,Title,Author,Isbn)
   ...> VALUES(4,'Visual C++程序开发','明日科技','978-7-115-20107-2');     
sqlite> SELECT * FROM Books;
Id|Title|Author|Isbn
1|C Primer Plus|Stephen Prata|978-7-115-13022-8/TP
2|鸟哥的Linux私房菜|鸟哥|978-7-115-22626-6
3|OpenGL编程指南|Dave Shreiner|978-7-111-29450-4
4|Visual C++程序开发|明日科技|978-7-115-20107-2
上面我们向表Books插入一行新的数据。
1
2
3
4
5
6
7
8
9
sqlite> INSERT INTO Books(Title,Author,Isbn)
   ...> VALUES('21天学通Linux C编程','马玉军等','978-7-12110622-4');
sqlite> SELECT * FROM Books;
Id|Title|Author|Isbn
1|C Primer Plus|Stephen Prata|978-7-115-13022-8/TP
2|鸟哥的Linux私房菜|鸟哥|978-7-115-22626-6
3|OpenGL编程指南|Dave Shreiner|978-7-111-29450-4
4|Visual C++程序开发|明日科技|978-7-115-20107-2
5|21天学通Linux C编程|马玉军等|978-7-12110622-4
这里我们向表中插入一行新的数据,但我们没有指定Id的值,可以看到没指定Id的值时,Id的值是自动递增的。
1
2
3
4
5
6
7
8
9
sqlite> INSERT INTO Books VALUES(6,'PHP开发宝典','刘欣等','978-7-111-38093-1');
sqlite> SELECT * FROM Books;
Id|Title|Author|Isbn
1|C Primer Plus|Stephen Prata|978-7-115-13022-8/TP
2|鸟哥的Linux私房菜|鸟哥|978-7-115-22626-6
3|OpenGL编程指南|Dave Shreiner|978-7-111-29450-4
4|Visual C++程序开发|明日科技|978-7-115-20107-2
5|21天学通Linux C编程|马玉军等|978-7-12110622-4
6|PHP开发宝典|刘欣等|978-7-111-38093-1
上面的插入语句我们在表名后没有指定任何列名。在这种情况下我们需要指定所有的列值。
1
sqlite> .nullvalue NULL
.nullvalue NULL告诉SQLite以NULL代表空值。所以SQLite默认情况下以NULL代替空字符串。
1
2
3
4
5
6
7
8
9
10
11
sqlite> .nullvalue NULL
sqlite> INSERT INTO Books(Id,Title) VALUES(7,'红高粱');
sqlite> SELECT * FROM Books;
Id|Title|Author|Isbn
1|C Primer Plus|Stephen Prata|978-7-115-13022-8/TP
2|鸟哥的Linux私房菜|鸟哥|978-7-115-22626-6
3|OpenGL编程指南|Dave Shreiner|978-7-111-29450-4
4|Visual C++程序开发|明日科技|978-7-115-20107-2
5|21天学通Linux C编程|马玉军等|978-7-12110622-4
6|PHP开发宝典|刘欣等|978-7-111-38093-1
7|红高粱|NULL|not available
上面SQL插入语句省略了后两个列值。这些列会被默认值或NULL填充。Author列没有默认值,因此以NULL替代。我们在创建表时指定Isbn列的默认值为'not available',因此这里会用该值来替代。
1
2
3
4
5
6
7
8
9
10
11
12
13
sqlite>  INSERT INTO Books VALUES(4,'过得刚好','郭得纲','978-7-550-21422-4');
Error: PRIMARY KEY must be unique
sqlite> INSERT OR REPLACE INTO Books
   ...> VALUES(4,'过得刚好','郭得 纲','978-550-21422-4);
sqlite> SELECT * FROM Books;
Id|Title|Author|Isbn
1|C Primer Plus|Stephen Prata|978-7-115-13022-8/TP
2|鸟哥的Linux私房菜|鸟哥|978-7-115-22626-6
3|OpenGL编程指南|Dave Shreiner|978-7-111-29450-4
4|过得刚好|郭得纲|978-550-21422-4
5|21天学通Linux C编程|马玉军等|978-7-12110622-4
6|PHP开发宝典|刘欣等|978-7-111-38093-1
7|红高粱||not available
这里我们向已经存在的行插入新的数据,结果会提示错误。这是因为Id是主键,其值是唯一的,不能有重复。这种情况下我们想插入数据,可以使用INSERT OR REPLACE语句,这样可以将已经存在的行的数据进行替换,当然使用UPDATE语句也可以实现同样功能。
我们可以使用INSERT语句一次性向表中插入多行数据。下面我们创建一个表Ints,并向表中一次插入五行数据。
1
2
3
4
5
6
7
8
9
10
sqlite> CREATE TABLE Ints(Id INTEGER PRIMARY KEY,Val INTEGER);
sqlite> INSERT INTO Ints(Val) VALUES (1),(2),(3),(4),(5);
sqlite> SELECT * FROM Ints;
Id                    Val                
--------------------  --------------------
1                     1                  
2                     2                  
3                     3                  
4                     4                  
5                     5   
这是Ints表中的所有数据。
我们可以在一个SQL语句中将INSERT和SELECT语句结合起来一起使用。我们先创建一个和Books表结构一样的表Books2。
1
2
3
4
5
sqlite> .schema Books
CREATE TABLE Books(Id integer PRIMARY KEY,Title text,Author text,
Isbn text default 'not available');
sqlite> CREATE TABLE Books2(Id integer PRIMARY KEY,Title text,Author text,
Isbn text default 'not available'); 
1
2
3
4
5
6
7
8
9
10
sqlite> INSERT INTO Books2 SELECT * FROM Books;
sqlite> SELECT * FROM Books2;
Id|Title|Author|Isbn
1|C Primer Plus|Stephen Prata|978-7-115-13022-8/TP
2|鸟哥的Linux私房菜|鸟哥|978-7-115-22626-6
3|OpenGL编程指南|Dave Shreiner|978-7-111-29450-4
4|过得刚好|郭得纲|978-550-21422-4
5|21天学通Linux C编程|马玉军等|978-7-12110622-4
6|PHP开发宝典|刘欣等|978-7-111-38093-1
7|红高粱||not available
我们将Books中的所有数据插入到表Books2中。

删除数据

DELETE语句用于从表中删除数据。首先我们从表中删除一行数据。我们使用先前创建的表Books2。
1
2
3
4
5
6
7
8
9
sqlite> DELETE FROM Books2 WHERE Id = 2;
sqlite> SELECT * FROM Books2;
Id|Title|Author|Isbn
1|C Primer Plus|Stephen Prata|978-7-115-13022-8/TP
3|OpenGL编程指南|Dave Shreiner|978-7-111-29450-4
4|过得刚好|郭得纲|978-550-21422-4
5|21天学通Linux C编程|马玉军等|978-7-12110622-4
6|PHP开发宝典|刘欣等|978-7-111-38093-1
7|红高粱||not available
我们将Id为2的行删除。查看表中的所有数据,第二行数据已经被删除。
1
sqlite> DELETE FROM Books2;
该语句将表中的所有数据删除。

更新数据

UPDATE语句用于修改表中指定行的列值。如果我们想将Books表中的'郭德纲'改为'于谦',我们可以使用下面的语句来实现。
1
2
3
4
sqlite> UPDATE Books SET Author='于谦' WHERE Id = 4;
sqlite> SELECT * FROM Books WHERE Id = 4 ;
Id|Title|Author|Isbn
4|过得刚好|于谦|978-550-21422-4
可以看出Id为4的行中列Author的数据已经被成功修改。
这一节我们主要介绍如何向表中插入、删除和修改数据。

2014年2月18日星期二

AirPlayエミュレーター『Shairport』のインストール

ステップ4:AirPlayエミュレーター『Shairport』のインストール

130306raspberry_04.jpg

AirPlayを実際に動作させるために『Shairport』というソフトウエアが必要です。設定には少々時間が掛かりますが、難しいことはありません。しかし、たくさんの付随するソフトウエアをダウンロード、インストールするために30分は必要でしょう。
まず下準備として、いくつかソフトウエアをインストールします。ターミナルで、次のコマンドを実行します。
sudo apt-get install git libao-dev libssl-dev libcrypt-openssl-rsa-perl libio-socket-inet6-perl libwww-perl avahi-utils libmodule-build-perl
しばらくの間、待ちましょう。処理が終了したら、ShairportがiOS 6でも動作するように、iOS 6用モジュールのインストールを行います。
git clone https://github.com/njh/perl-net-sdp.git perl-net-sdp 
cd perl-net-sdp 
perl Build.PL 
sudo ./Build 
sudo ./Build test 
sudo ./Build install 
cd ..
モジュールのインストールが終わったら、いよいよShairportの番です。ホームディレクトリから、次のコマンドを実行します。
git clone https://github.com/hendrikw82/shairport.git 
cd shairport 
make
Shairportを起動します。
./shairport.pl -a AirPi
このコマンドにより、「AirPi」という名前のShairportプロセスがRaspberry Pi上で実行されます。ちなみに名前は変更可能です。
iOSデバイスの音楽アプリで、AirPlayボタンをタップしてみましょう。出力デバイスとして表示された「AirPi」ボタンをタップすると、2秒程度で、USBサウンドカードから音楽がストリーミングされ始めます。
でも、まだ終わりではありません。Raspberry Piの起動時にShairportは自動で読み込まれません。それにキーボードやモニターなしでAirPlayを動作もさせたいので、もう少し作業が必要です。ホームディレクトリから、次のコマンドを実行します。
cd shairport make install cp shairport.init.sample /etc/init.d/shairport cd /etc/init.d chmod a+x shairport update-rc.d shairport defaults
Shairportを起動項目に追加するために、次のコマンドを実行します。
sudo nano shairport
編集対象のShairportファイルが開くので、「DAEMON_ARGS」行を見つけて、次のように変更します。
DAEMON_ARGS="-w $PIDFILE -a AirPi"
「Ctrl+X」キーで変更を保存すれば、すべて完了です。これでShairportは、Raspberry Piを起動するたびに自動で立ち上がります。USBサウンドカードとWi-Fiアダプタが取り付けられてさえいれば、Raspberry Pi単体でAirplayのレシーバーとして機能するようになりました。
今後はRaspberry Piの電源を入れ、起動するのを待つだけです。OSが起動すると(通常30~40秒ほど掛かります)、Raspberry Piで音楽をストリーミングできます。
以下でRaspberryを使った他のプロジェクト記事をまとめてありますので、ぜひトライしてみてください。

Thorin Klosowski(原文/訳:風見隆、合原弘子/ガリレオ)