Gi*i Thi*u v* SQLite

advertisement
Giới Thiệu về SQLite
-Tìm hiểu chung về SQLite
-Tạo , kết nối , thao tác với Database (SQLite)
Tìm hiểu chung về SQLite
•
Mỗi ứng dụng đều sử dụng dữ liệu, dữ liệu có thể đơn giản hay đôi khi là cả
1 cấu trúc. Trong Android thì hệ cơ sở dữ liệu được sử dụng là SQLite
Database, đây là hệ thống mã nguồn mở được sử dụng rộng rãi trong các
ứng dụng ( Mozilla Firefox sử dụng SQLite để lưu trữ các dữ liệu về cấu
hình, iPhone cũng sử dụng cơ sở dữ liệu là SQLite).
Các Hệ QTCSDL
• Tại sao SQLite được sử dụng
Tìm hiểu chung về SQLite
•
•
SQLite có các ưu điểm sau:
SQLite được Richard Hipp viết dưới dạng thư viện bằng ngôn ngữ lập trình C.
•
Được thực hiện như 1 thư viện thay vì chạy trên 1 tiến trình riêng biệt
•
•
•
•
•
•
•
•
Tin cậy: các hoạt động transaction (chuyển giao) nội trong cơ sở dữ liệu được thưc hiện trọn vẹn,
không gây lỗi khi xảy ra sự cố phần cứng
Tuân theo chuẩn SQL92 (chỉ có một vài đặc điểm không hỗ trợ)
Không cần cài đặt cấu hình
Kích thước chương trình gọn nhẹ, với cấu hình đầy đủ chỉ không đầy 300 kB
Thực hiện các thao tác đơn giản nhanh hơn các hệ thống cơ sở dữ liệu khách/chủ khác[1]
Không cần phần mềm phụ trợ
Phần mềm tự do với mã nguồn mở, được chú thích rõ ràng
SQLite database requires little or no administration
•
•
•
•
•
Mỗi Sqlite Database sẽ được tích hợp với ứng dụng tạo ra nó
Do đó:
-giảm tải các phụ thuộc bên ngoài
-giảm thiểu tối đa độ trễ
-Đơn giản hơn trong giao dịch và đồng bộ hóa
Tìm hiểu chung về SQLite
• Datatype
• Sqlite cho phép bạn lưu bất cứ kiểu giá trị nào cho bất cứ ô nào dù
cột đó đã đc định nghĩa kiểu trước đó
• TABLE STUDENT_DEMO
• COLUMN : _ID : integer primarykey autoincrement;
• COLUM N : S_NAME : text not null ;
•
•
•
COLUMN : S_AGE
: integer ;
INSERT into STUDENT_DEMO (S_NAME,S_AGE) VALUES(‘tung’,’sjka’);
=>Tung ,0
Tìm hiểu chung về SQLite
•
•
•
•
•
•
Situations Where SQLite Works Well
Application File Format(SQLite Đã được sử dụng thành công như định dạng file trên đĩa
cho các ứng dụng desktop như các công cụ phân tích tài chính, CAD packages,Ctr
lưu trữ bản ghi,vv)
Embedded devices and applications(Because an SQLite database requires little or no
administration, SQLite is a good choice for devices or services that must work unattended
(không giám sát)and without human support. SQLite is a good fit for use in cellphones, PDAs,
set-top boxes, and/or appliances(đồ gia dụng))
Experimental SQL language, extensions(Chính vì sự đơn giản trong thiết kế các module
của SQLite mà nó được sử dụng để thử nghiệm tạo ra các mẫu mới ,các tính năng
và ý tưởng mới của ngôn ngữ Database)
Websites(Dùng cho các trang web có lưu lượng trung bình)
Internal or temporary databases(Cho các Ctr có nhiều dữ liệu cần lọc ,sắp xếp bằng
nhiều cách #,để đơn giản và nhanh chóng ng ta load dữ liệu vào bộ nhớ của SQLite
và sử dụng các QUERY để lấy các thông tin cần thiết , Sử dụng cách này cho phép
lập trình viên linh hoạt hơn khi các cột hay các chỉ số có thể được thêm vào mà
không phải mã hóa lại các câu lênh query.)
Tìm hiểu chung về SQLite
Adobe sử dụng SQLite như 1 ứng dụng định dạng file cho sản phẩm Photoshop Lightroom của họ, nó
cũng trở thành 1 phần chuẩn của AIR (Adobe Integrated Runtime ),bên cạnh đó Acrobat Reader
cũng sử dụng SQLite
It is known that Google uses SQLite in their Desktop for Mac, in Google Gears, in the Android cellphone operating system, and in the Chrome Web Browser. People are suspicious that Google
uses SQLite for lots of other things that we do not know about yet. Các kỹ sư tại Google đã có
những đóng góp lớn cho các hệ thống con tìm kiếm toàn văn bản trong SQLite
. Apple uses SQLite for many functions within Mac OS X, including Apple Mail, Safari, and in
Aperture. Apple uses SQLite in the iPhone and in the iPod touch and in iTunes software.
SQLite là định dạng lưu trữ siêu dữ liệu chính cho Firefox Web Browser, Thunderbird Email
Reader
The popular PHP programming language comes with both SQLite2 and SQLite3 built in.
•
•
•
•
•
•
Situations Where Another RDBMS May Work Better
Client/Server Applications(hiệu quả không cao,có thể dẫn đến việc 2 người dùng
khác nhau sửa đổi cùng 1 dữ liệu trong cùng 1 thời điểm)-nói chung ta tránh sử
dụng khi dữ liệu được chia sẻ và truy cập đồng thời bằng nhiều máy tính qua net
Các website lớn
Tập dữ liệu lớn :SQLite bị giới hạn tới 2 terabytes,thậm chí có thể sử lý lớn hơn,nó
lưu trữ database trên file đĩa,tuy nhiên 1 số hệ thống file giới hạn max size cho các
file của nó nhỏ hơn con số trên
Khối lượng truy cập cao:
-nếu có 1 tiến trình đang đọc 1 phần bất kì nào đó của CSDL,các tiến trình khác sẽ
không được phép ghi lên bất cứ thành phần náo khác của nó, tương tự…
Tạo và kết nối CSDL
• SQLiteOpenHelper
• Dùng để kết nối ứng dụng với database của nó
•
•
•
•
•
•
•
•
•
•
Tạo class StudentOpenHelper implements SQLiteOpenHelper
Hàm tạo
public StudentOpenHelper(Context context)
{
super(context,DATABASE_NAME, null, 1);
}
Implement các hàm của Interface SQLiteOpenHelper
-Oncreate(SQLiteDatabase db)
-onOpen(SQLiteDatabase db)
-onUpGrade(SQLiteDatabase db, int oldVersion, int newVersion)
Tạo và kết nối CSDL
•
package data;
•
•
•
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
public class StudentOpenHelper extends SQLiteOpenHelper
{
public Context context;
public static final String DATABASE_NAME = "mystudent.db1";
public StudentOpenHelper(Context context)
{
super(context,DATABASE_NAME, null, 1);
}
public void onOpen(final SQLiteDatabase db)
{
super.onOpen(db);
}
public void onCreate(SQLiteDatabase db)
{
StudentTable.onCreate(db);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
StudentTable.onUpgrade(db, oldVersion, newVersion);
}
}
•
•
•
•
public void onOpen(final SQLiteDatabase db)
{
super.onOpen(db);
//db.execSQL("alter table
"+ShopItemTable.DATABASE_TABLE+" add column unit text
not null");
• //db.execSQL(myItemTable.CREATE_TABLE);
• //db.execSQL("DROP TABLE "+ConfigTable.DATABASE_TABLE);
• //db.execSQL(ConfigTable.CREATE_TABLE);
Tạo và kết nối CSDL
•
package data;
•
import android.database.sqlite.SQLiteDatabase;
•
•
public class StudentTable
{
public static String DATABASE_TABLE = "student_demo";
public static String STUDENT_ID = "_id";
public static String STUDENT_NAME = "s_name";
public static String STUDENT_AGE = "s_age";
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
public static final String CREATE_TABLE = "create table "+StudentTable.DATABASE_TABLE+" ( "+
StudentTable.STUDENT_ID+" integer primary key autoincrement,"+
StudentTable.STUDENT_NAME+" text not null ,"+
StudentTable.STUDENT_AGE+" integer );";
public static void onCreate(SQLiteDatabase db)
{
db.execSQL(CREATE_TABLE);
}
public static void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("drop table if exists "+DATABASE_TABLE);
StudentTable.onCreate(db);
}
}
Cách thức truy vấn
• -rawQuery(String query , String[] array);
• -query(String table, String[] columns, String
selection, String[] selectionArgs, String groupBy,
String having, String orderBy, String limit)
• execSQL(String sql)
Execute a single SQL statement that is NOT a SELECT or
any other SQL statement that returns data.
Cách thức truy vấn
rawQuery()
Query()
•
• String[] cols = {“_id”,”s_name”};
• String[] params = {“1,”23”};
• Cursor c = db.query(“student_demo”,
cols,”_id = ? And age = ?”,params,null,
Null,5
• );
• -hơi phức tạp
• -linh hoạt hơn
• -tránh SQL Injection attacks
String query = “select * from
student_demo where _id = ? And age
> ? Order by s_name limit ?”;
• Cursor c = db.rawQuery(
query, new String[]{“1”,”23”,”5”}
• );
• -Ưu điểm : dễ sử dụng
• -Nhược điểm dùng để truy vấn trên
nhiều bảng hoặc nhiều cột dễ nhầm
lẫn
Cách thức truy vấn
•
•
•
•
•
execSQL(String sql)
-Dùng cho ALTER , UPDATE, DELETE
String query1 = “ALTER
TABLE
student_demo ADD COLUMN diemthi INTEGER NOT NULL”;
String query2=“CREATE TABLE diemthi (s_id integer, diemthi
interger)”;
• String query3 =“Delete from student_demo where s_id = 1”;
• Db.execSQL(query1);
• Db. execSQL(query2);
• Db. execSQL(query3);
Cách thức truy vấn
• Db.delete(“TABLE”, “WHERE” ,String[] args);
• Delete From Student_demo where ID = 1;
• Db.delete(“Student_demo”,”ID = ?”, new String[]{id});
• ContentValues values = new ContentValues();
•
values.put(“s_name”, name);
•
values.put(“s_age”, url);
•
db.update(“Student_demo”, “ _id = ? ",
•
new String[]{String.valueOf(id)});
ContentValues và Cursor
• ContentValues
• Dùng để INSERT hoặc UPDATE,mỗi ContentValues object giống như 1
hàng mà các cột của có có tên như các cột của bảng cần tác động
• ContentValues values = new ContentValues();
• Values.put(“s_name”,”Tung”);
• Values.putAge(“s_age”,23);
• Db.update( “student_demo”,values, “where userID = 1”,null );
• Db.insert(“student_demo”, getNullColumnHack() , values);
ContentValues và Cursor
Giả sử ta cho bảng FOO mà các cột của nó có thể nhận giá trị NULL
INSERT INTO foo;//ERR!
INSERT INTO foo (somecol) VALUES (NULL);//OK
Trong trường hợp bạn chưa set giá trị cho biến values
Bạn sẽ lấy tên 1 trong số các cột cho phép lưu trữ giá trị NULL;
Create table Student_demo (
_id integer not null autoincrement,
Name text,
Age integer,
)
ContentValues và Cursor
-getCount() – int – trả về số hàng có trong kết quả
-movetoFirst() , movetoNext() , isAfterlast();
-getColumnName();
-getColumnnames();
Cursor c = db.rawQuery(“select * from Student_demo”,null);
c.moveToFirst();
While(c.isAfterLast())
{
Toast.makeText(context, c.getString(1),200).show();
c.moveToNext();
}
CursorAdapter
•
•
•
•
•
class studentAdapter extends CursorAdapter
public studentAdapter(Context context, Cursor c)
public void bindView(View view, Context context, Cursor cursor)
public View newView(Context context, Cursor cursor, ViewGroup parent)
public void creatView(final View view,Cursor c)
Download