SQLite với PDO và PHP

trong danh mục Android, PHP, Web Programming

Tối nay nhân có chút thời gian vừa quay lại một vài dòng code xử lý trên database SQLite trên PHP bằng PDO nên tranh thủ viết vài dòng chia sẻ với các bạn một tí xíu kinh nghiệm làm việc với sqlite của mình.

Giới thiệu sơ cho những ai chưa biết SQLite là gì thì đó là 1 dạng cơ sở dữ liệu quan hệ (giống MSSQL, MySQL…), có cấu trúc table, cột, dòng, query để lấy thông tin như truy vấn SQL bình thường. Có một điểm khác biệt là SQLite chỉ nằm gọn trong 1 file duy nhất. Bạn có thể tìm hiểu thêm về SQLite tại http://www.sqlite.org.

Tôi và SQLite

Chính vì sự nhỏ gọn này mà nó được nhiều người sử dụng trong môi trường phát triển ứng dụng cho di động và muốn lưu trữ dữ liệu để truy vấn dạng SQL. Ngày nay, hầu hết các nền tảng lập trình đã hỗ trợ SQLite như Android, iOS…Tuy nhiên, chính sự nhỏ gọn trong 1 file .sqlite này cũng chính là giới hạn cho việc lưu trữ dữ liệu với sqlite.

karaoke vietnam android app icon

Từ điển Anh Việt vLook android app icon

Mình có kinh nghiệm làm việc với sqlite khi xây dựng các app Karaoke Vietnam và app Từ điển anh việt trên android, cả 2 app đều dùng sqlite để lưu trữ dữ liệu. Mặc dù vậy nhưng cách tiếp cận của 2 app khác nhau. Đối với app Karaoke Vietnam thì mình import file xml, rồi dùng chính cái app đọc file xml và import vào database sqlite của app trên máy, do đó, lần đầu tiên chạy sẽ bị chậm và chờ vì phải chờ INSERT dữ liệu.

Đối với app Từ điển anh việt thì mình tiếp cận khác, mình tạo file sqlite bên ngoài và import vào app luôn, do đó cảm giác lần đầu tiên chạy ứng dụng sẽ rất nhanh chỉ là thao tác cop file sqlite mà thôi. Còn nguyên nhân vì sao mình tiếp cận 2 hướng khác nhau cho 2 app thì nếu mọi người có dịp cafe chém gió sẽ chia sẻ.

SQLite và PDO/PHP

Mục đích của bài viết này nhằm chỉ cách mọi người tạo 1 file sqlite bằng PHP và sử dụng PDO để giúp việc tạo database sqlite nhanh chóng hơn.

PHP 5 đã hỗ trợ SQLite và PDO cũng vậy. Nếu bạn không chắc là PDO trong PHP của mình có hỗ trợ làm việc với SQLite hay không thì có thể dùng phpinfo() hoặc vào php.ini để kiểm tra phần xem có kích hoạt phần khai báo extension

extension=php_pdo_sqlite.dll
SQLite PDO phpinfo()

phpinfo() để check pdo sqlite

Thao tác với SQLite trên PDO rất đơn giản, cũng như các driver khác cho PDO, bạn khởi tạo và kết nối đến database cần làm việc mà thôi.

?Download download.txt
1
2
3
4
5
6
$sqliteFile = 'bloghoctap.android.tudienanhviet.sqlite';
 try {
  $dblite = new PDO('sqlite:' . $sqliteFile);
 } catch (Exception $e) {
  die($e);
 }

Bạn cần chỉ định file sqlite sẽ tạo và chứa dữ liệu, sau đó sử dụng PDO với driver có cú pháp như trên để tạo sqlite. Nếu bạn muốn tạo table cho sqlite thì cứ soạn query tạo table rồi gọi phương thức exec() của object pdo để tạo.

?Download download.txt
1
2
3
4
5
6
7
8
9
10
11
$query = 'CREATE TABLE bloghoctap_word
 
 (_id integer primary key,
 
 sword text not null,
 
 sphonetic text not null,
 
 smeanings text not null);';
 
 $dblite->exec($query);

Giả sử như bạn muốn tạo dữ liệu trong file sqlite là các từ có trong database MySQL của mình. Giống như trường hợp mình có danh sách từ trong database mysql trên localhost, muốn chuyển sang file sqlite để dùng cho mobile app thì mình cứ việc connect bình thường đến database mysql, select các dòng cần lấy, rồi viết thêm 1 query insert vào sqlite database.

?Download download.txt
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
//start insert word data
	mysql_connect('localhost', 'root', '123456');
	mysql_select_db('bloghoctap_dictionary');
	mysql_query('SET NAMES utf8');
 
	$sql = 'SELECT * FROM bloghoctap_tudienanhviet ORDER BY id';
	$result = mysql_query($sql);
	$dblite->beginTransaction();
	while($row = mysql_fetch_assoc($result))
	{
		//insert to sqlite
		$sql = 'INSERT INTO bloghoctap_word(_id, sword, sphonetic, smeanings)
				VALUES('.$row['id'].', 
					"'.htmlspecialchars($row['word']).'",
					"'.htmlspecialchars($row['phonetic']).'",
					"'.htmlspecialchars($row['meanings']).'"
					)';
		if(!$dblite->exec($sql))
		{
	  		die($error);
		}
		else
		{
			$insert++;
		}
 
	}
	$dblite->commit();

Lưu ý, thao tác ghi lên sqlite rất chậm, do đó, dùng kỹ thuật transaction trong sqlite để tăng tốc việc ghi dữ liệu lên file sqlite rất nhiều lần. Bạn có thể xóa phần transaction cho sqlite để kiểm chứng tốc độ.

Transaction của sqlite thể hiện ở 2 dòng là 

$dblite->beginTransaction();

và 

$dblite->commit();

Mở file SQLite

Sqlite file là một file mã hóa nên bạn không thể coi bằng text editor bình thường. Bạn có thể sử dụng phần mềm sqlitebrowser để mở file .sqlite và xem schema và data trong các table.

——-

Đôi dòng chia sẻ với các bạn nào muốn lấy dữ liệu sang sqlite để làm việc trên mobile app. Chúc các bạn có được nhiều app mobile thú vị và có nhiều trải nghiệm hơn với sqlite.

4 bình luận

  1. ichuot says:

    Cái sqlitebrowser hình như k hiện dc unicode thì phải. Mình thấy Navicat premium là tiện lợi để quản lý mysql, sqlite, postgresql, oracle và cả mssql nữa.

    [Reply]

  2. admin says:

    @ichuot, sqlitebrowser hiển thị unicode bình thường nhé. Đã test và thấy hiển thị ok.

    [Reply]

  3. [...] http://bloghoctap.com/web-programming/sqlite-voi-pdo-va-php.html#more-2509 Share this:TwitterFacebookLike this:LikeBe the first to like this post.   Leave a [...]

  4. Nguyễn Văn Nghĩa says:

    Chào anh. Xin anh cho em hỏi nếu em có 1 file .sqlite rồi, em muốn add nó vào Project android để sử dụng thì em phải làm sao ạ.
    Em xin cám ơn anh.

    [Reply]

Gởi bình luận