2025-05-23

一、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");//刪除數據庫(註意:是刪除數據庫,而不是刪除數據庫中的數據)

摘自 素年錦時

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *