一、SQLite簡介
1.SQLite是一個輕量級的數據庫,是遵守ACID的關聯式數據庫管理系統,它的設計目標是嵌入式的,而且目前已經在很多嵌入式的產品中使用瞭它,這種數據庫占用該資源很低,在嵌入式設備中,可能隻要幾百K的內存就夠瞭,它能夠支持Windows、Linux、Unix等等主流的操作系統,同時能夠能夠跟許多程序語言相結合,比如PHP,Java、C++、.Net等,還有ODBC接口。比起MySql、PostgreSQL這兩款開源界著名的數據庫管理系統來講,它的處理速度比這兩者都要快。
2.SQLite的特點
A.輕量級:
SQLite和C/S模式的數據庫軟件不同,它是進程內的數據庫引擎,因此不存在數據庫的客戶端和服務端。使用SQLite隻要帶上它的一個動態庫,就可以使用它的全部功能。而且這個動態庫的尺寸也非常小,以版本3.6.11為例,Windows下為487K,Linux下為347K。
B.不需要安裝:
SQLite的核心引擎不需要以來第三方軟件,也不要安裝,這一點類似綠色軟件。
C.單一文件:
數據庫中的所有信息(如表、視圖等)都包含在一個文件內。這個文件可以自由復制或者移動到其他機器上。
D.跨平臺/可移植性
除瞭支持Windows、Linux等主流操作系統外,SQLite還支持一些其他的不常用的操作系統。
E.弱類型的字段
同一列中的數據可以是不同類型
F.開源
這個不做過多說明,相信大傢都懂的。
3.SQLite的數據類型
一般數據庫采用的是固定的靜態數據類型,而SQLite采用的是動態數據類型,即其會根據存入的值自動判斷值得類型。SQLite具有以下集中常用數據類型:
null:這個值為空值
varchar(n):長度不固定,最大為n的字符串,n<=4000
char(n):長度固定為n的字符串,n<=254
integer:整數類型,不用過多說明
real:所有值都是浮動的數值,被存儲為8字節的IEEE浮動標記序號
text 值為文本字符串,使用數據庫編碼存儲(TUTF-8,UTF-16BE or UTF-16LE)
blob:值為blob數據塊,以輸入的數據格式進行存儲,怎樣輸入就怎樣存儲,不改變輸入格式
Data:包含年份、月份和日期,格式為XX-XX-XX(即年-月-日)
Time:包含小時、分鐘和秒,格式為XX:XX:XX(即小時:分鐘:秒)
二、SQLiteDatabase的介紹
Android提供瞭創建和使用SQLite數據庫的API。SQLiteDatabase是一個數據庫對象,提供瞭操作數據庫的一些方法。在android的SDK目錄下有一個sqlite3工具,可以用它來創建數據庫、創建表和執行一些SQL語句。下面是SQLiteDatabase的常用方法。
SQLiteDatabase的常用方法:
方法名稱 | 方法描述 | 參數說明 |
openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory) | 打開或創建數據庫 | path:數據庫所在的路徑,factory:遊標所在的位置(即第幾行) |
insert(Sting table,String nullColumnHack,CntentValues values) | 添加一條記錄 | table:表的名稱,nullColumnHack傳空值,values:要修改的值(values.put(xx,xx),以鍵值對的形式) |
,delete(String table,String whereClause,String[] whereArgs) | 刪除一條記錄 | table:同上,whereClause:where字句:即SQL語句中的條件,如“id=?",表示按id刪除,whereArgs:刪除條件,如new String[]{"1"}表示刪除id=1的記錄(或new String.valueof(1),表示將1轉換成字符串) |
query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy) | 查詢一條記錄 | table:同上,columns:要查詢的列的名稱,需要註意的是最後的orderBy,即按什麼排序,是根據columns中的值來執行的,比如,要按MyTime(時間)排序,那麼MyTime著一列的名字必須在columns中。selection:相當於where字句。selectionArgs:執行的條件.groupBy:分組。having:決定哪些列要包含在遊標路徑中,即若包含在路徑中,則可以被遊標掃描到,反之則否。orderBy:查詢出的信息按什麼排序 |
update(String table,ContentValues values,String whereClause,String[] whereArgs) | 修改記錄 | table:同上。values:要更新的數據(以鍵值對的形式)。whereClause:WHERE字句。whereArgs:執行條件 |
excSQL(string sql) | 執行一條SQL語句 | sql:要執行的sql語句 |
close() | 關閉數據庫 | 無參 |
為瞭方便操作(如更新數據庫等),通常從SQLiteOpenHelper這個助手類派生出一個子類。
1.從SQLiteOpenHelper這個助手類派生出一個子類。(DateBaseHelper.java)
public class DateBaseHelper extends SQLiteOpenHelper{
/**
* 在SQLiteOpenHelper的子類當中,必須有這個構造函數
* @param context 當前的Activity
* @param name 表的名字(而不是數據庫的名字,這個類是用來操作數據庫的)
* @param factory 用來在查詢數據庫的時候返回Cursor的子類,傳空值
* @param version 當前的數據庫的版本,整數且為遞增的數
*/
public DateBaseHelper(Context context, String name, CursorFactory factory,int version)
{
super(context, name, factory, version);//繼承父類
// TODO Auto-generated constructor stub
}
/**
* 該函數是在第一次創建數據庫時執行,隻有當其調用getreadabledatebase()
* 或者getwrittleabledatebase()而且是第一創建數據庫是才會執行該函數
*/
@Override
public void onCreate(SQLiteDatabase db)
{
/**
* 創建一個名為StudentInfo的表
* id:主鍵,並且自動增加,編號
* name:學生姓名
* classId:班級
* studyId:學號
* sex:性別
* MyTime:入學時間
*/
// TODO Auto-generated method stub
String sql = "create table StudentInfo(id integer primary key autoincrement,name varchar(20),sex varchar(20),MyTime Time,MyDate Date)";
db.execSQL(sql);
}
/**
*數據庫更新函數,當數據庫更新時會執行此函數
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
// TODO Auto-generated method stub
System.out.println("數據庫已經更新");
/**
* 在此添加更新數據庫是要執行的操作
*/
}
}
2.實現各種功能(MySqliteActivity.java)
A.創建數據庫 www.aiwalls.com
Code:
//MySqliteActivity.this:設備上下文,“student”:數據庫的名字(註意和表的名字分清),1:數據庫的版本號
DateBaseHelper dbHelper = new DateBaseHelper(MySqliteActivity.this,"student",null,1);
dbHelper.getReadableDatabase();//得到一個可讀的數據庫,需要註意的是,隻有執行瞭這條語句後才能成功創建數據庫,也就是說,上面的得到瞭一個DateBaseHelper助手類的對象實際上並沒有創建數據庫。
B.更新數據庫
所謂更新數據庫,即將數據庫的版本號向上增加,在此需要註意的是,數據庫的版本號隻能是整數值,而且是遞增的,如1,2,3等等。
Code:
DateBaseHelper dbHelper = new DateBaseHelper(getApplicationContext(),"student",null,2);
dbHelper.getReadableDatebase();
C.插入數據(增加表記錄)
Code:
Time time = new Time("GMT+8")//設置時間為第八時區標準時間
time.setToNow();//設置為系統當前時間
int year = time.year;
int month = time.month;
int day = time.monthDay;
int hour = time.hour;
int minute = time.minute;
int second = time.second;
DateBaseHelper db = new DateBaseHelper(getApplicationContext(),"student",null,1);
SQLiteDateBase db = dbHelper.getWritableDatabase();//註意此處是獲取一個可寫的數據庫,因為是插入數據。
ContentValues values = new ContentValues();
values.put("name","zhangsan");
values.put("sex","male");
values.put("MyTime",year+"-"+month+"-"+day);
values.put("MyDate", hour+":"+minute+":"+sec);
db.insert("StudentInfo",null,values);
Toast.makeText(MySqliteActivity.this, "數據插入成功", Toast.LENGTH_SHORT).show();
D.修改數據
/**
*修改數據,就是根據一定的條件找到相應的記錄,並修改該記錄
*/
Code:
DateBaseHelper dbHelper = new DateBaseHelper(getApplicationContext(), "student",1);
SQLiteDatabase db = dbHelper.getReadableDatabase();
ContentValues values = new ContentValues();
values.put("name", "lisi");
values.put("sex","female");
values.put("MyTime", "2015-6-6");
values.put("MyDate", "21:21:12");
String whereClause = "id=?";
String[] whereArgs = {"8"};
db.update("StudentInfo",values,whereClause,whereArgs);
Toast.makeText(getApplicationContext,"第八行數據已更新",Toast.LENGTH_SHORT).show();
E.查詢數據
Code:
DateBaseHelper dbHelper = new DateBaseHelper(getApplicationContext(),"student",null,1);
SQLiteDatebase db = dbHelper.getReadableDatabase();//得到一個可讀的數據庫
Cursor cursor = db.query("StudentInfo",new String[]{"id","name","sex","MyDate"},"name=?",new String[]{"zhangsan"},null,null,"MyDate");//query返回值為一個遊標對象
while(cursor.moveToNext())//moveToNext:從第一行想下逐行掃描,到最後一行,如果沒到最後一行則返回真,否則返回假
{
String name = cursor.getString(cursor.getColumnIndex("MyDate"));//獲取的值為MyDate這列的值(即日期值)
Toast.makeText(getApplicationContext(),name,Toast.LENGTH_SHORT).show();
}
F.刪除數據(庫)
Code:
DateBaseHelper dbHelper = new DateBaseHelper(getApplicationContext(), "student", null, 2);
SQLiteDatabase db = dbHelper.getReadableDatabase();
String whereClause = "id=?"//?為占位符
String[] whereArgs = {"7"};//刪除id=7的那行數據
db.delete("StudentInfo",whereClause,whereArgs);
Toast.makeText(getApplicationContext(),"第七條數據已經刪除",Toast.LNEGTH_SHORT).show();
//deleteDatabase("student");//刪除數據庫(註意:是刪除數據庫,而不是刪除數據庫中的數據)
摘自 素年錦時