Android開發教程 --- 數據存儲(2) SQLite


Hi,大家好!

      今天我們主要來講講SQLite在Android中的使用。

      輕松下:

      寫字樓里寫字間,寫字間里程序員;
     程序人員寫程序,又拿程序換酒錢。
     酒醒只在網上坐,酒醉還來網下眠;
     酒醉酒醒日復日,網上網下年復年。
     但願老死電腦間,不願鞠躬老板前;
     奔馳寶馬貴者趣,公交自行程序員。
     別人笑我忒瘋癲,我笑自己命太賤;
     不見滿街漂亮妹,哪個歸得程序員。  :) 哎…

      SQLite簡介

      大部分應用程序都要操作數據,,Android應用程序也不例外,本地數據應該存儲在什么地方?Android使用開源的、與操作系統無關的SQL數據庫 --大名鼎鼎的SQLite。SQLite是一款輕量級數據庫,它的設計目的是嵌入式,而且它占用的資源非常少,在嵌入式設備中,只需要幾百KB,很多大型公司所開發的產品都有它的存在。

    輕量級
   使用 SQLite 只需要帶一個動態庫,就可以享受它的全部功能,而且那個動態庫的尺寸相當小。

   獨立性
   SQLite 數據庫的核心引擎不需要依賴第三方軟件,也不需要所謂的“安裝”。

   隔離性
   SQLite 數據庫中所有的信息(比如表、視圖、觸發器等)都包含在一個文件夾內,方便管理和維護。

   跨平台
   SQLite 目前支持大部分操作系統,不止電腦操作系統更在眾多的手機系統也是能夠運行,比如:Android。

   多語言接口
   SQLite 數據庫支持多語言編程接口。

   安全性
   SQLite 數據庫通過數據庫級上的獨占性和共享鎖來實現獨立事務處理。這意味着多個進程可以在同一時間從同一數據庫讀取數據,但只能有一個可以寫入數據。

   SQLite雖然很小巧,但是支持的SQL語句不會遜色於其他開源數據庫,它支持的SQL包括:

   1

Sqlite基本數據類型有:

VARCHAR 字符型

NVARCHAR(15)可變字符型,

TEXT 文本型,

INTEGER 整型,

FLOAT 浮點型,

BOOLEAN布爾型,

CLOB字符大對象,

BLOB二進制大對象,

TIMESTAMP日期型,

NUMERIC(10,5) 數值型

VARYING CHARACTER (24),

NATIONAL VARYING CHARACTER(16)

Sqlite也提供了JDBC驅動程序

Class.forName("org.sqlite.JDBC");

Connection conn = DriverManager.getConnection("jdbc:sqlite:filename");

//filename為你的SQLite數據名稱

使用SQLiteOpenHelper操作數據庫

getReadableDatabase()獲得可讀的SQLiteDatabase

getWritableDatabase() 獲得可寫的SQLiteDatabase

onCreate(SQLiteDatabase)

onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

操作數據庫

1. 封裝一個SQLite的操作類,並且在此使用繼承SQLiteOpenHelper的方式實現

SQLiteOpenHelper
SQliteOpenHelper是一個抽象類,來管理數據庫的創建和版本的管理。要使用它必須實現它的

onCreate(SQLiteDatabase),

onUpgrade(SQLiteDatabase, int, int)方法
onCreate:當數據庫第一次被建立的時候被執行,例如創建表,初始化數據等。
onUpgrade:當數據庫需要被更新的時候執行,例如刪除久表,創建新表。

2. 實現SQLiteOpenHelper類的構造函數及抽象方法.

package TSD.Jason.DB;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;

public class DBHelp extends SQLiteOpenHelper {

private final static String DATABASE_NAME="StudentDB"; //數據庫名稱
private final static int DATABASE_VERSION=1; //數據庫默認版本
private final static String TABLE_NAME="StudentInfo"; //數據表名稱
public final static String S_ID="sid"; // 列名
public final static String S_NAME="sName";
public final static String S_SEX="sSex";
public final static String S_AGE="sAge";
public final static String S_ADDRESS="sAddress";

/**SQLiteOpenHelper類的構造函數 (注意: 必須實現的構造函數)
*
* 此構造函數用來 創建庫和表 (第一次執行時,如果沒有庫、表,將創建庫、表,以后將不再創建)
*
@param context 上下文對象
*
@param name 數據庫名稱
*
@param factory 創建Cursor的工廠類。參數是為了可以自定義Cursor創建
*
@param version 數據庫版本號
*/
public DBHelp(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);

}

/**操作數據時,(增刪改查)
*
*
@param context 上下文對象
*
@param name 數據庫名稱
*
@param factory 創建Cursor的工廠類。參數是為了可以自定義Cursor創建
*
@param version 數據庫版本號
*/
public DBHelp(Context context) {
this(context, DATABASE_NAME, null, DATABASE_VERSION);
}

/**需要根據版本號來實現修改
*
*此構造函數用來 修改庫和表 (修改現有的庫、表)
*
@param context 上下文對象
*
@param name 數據庫名稱
*
@param factory 創建Cursor的工廠類。參數是為了可以自定義Cursor創建
*
@param version 數據庫版本號
*/
public DBHelp(Context context ,int version) {
this(context,DATABASE_NAME,null,version);
}

@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
System.out.println("當第一次運行或者修改數據庫時,將會自動執行");

String createTableSQL = "create table " + TABLE_NAME + "("
+S_ID + " integer primary key autoincrement,"
+S_NAME + " nvarchar(10),"
+S_SEX + " nvarchar(2),"
+S_AGE + " int,"
+S_ADDRESS + " nvarchar(50)"
+")";
db.execSQL(createTableSQL); // 執行SQL 需要使用execSQL()
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("-------------------------調用了一個修改庫函數");

}

@Override
public void onOpen(SQLiteDatabase db) {
// TODO Auto-generated method stub
super.onOpen(db);
System.out.println("當數據庫打開時,執行");
}



}

 

創建數據庫

DBHelp dbHelp = new DBHelp(SQLiteActivity.this);
//當獲得了SQLiteDatabase對象,會自動檢測是否第一次創建了庫,表,如果沒有將執行DBHelp類中的onCreate函數
SQLiteDatabase db = dbHelp.getReadableDatabase();
Toast.makeText(SQLiteActivity.this, "創建成功", Toast.LENGTH_SHORT).show();


getWritableDatabase() 如果需要操作(增刪改)數據庫時,使用

getReadableDatabase()查詢數據

刪除及重命名數據庫

2

 

 

在adb下查看數據庫

 3

1通過 ls 命令查詢目錄結構

2通過cd 文件夾名稱 進入對應的文件夾中

3需要進入2次data文件夾

4進入自己創建項目的包下

5進入databases

6通過 sqlite3 StudentDB 進入數據庫

在sqlite>提示符下輸入

.help 這個命令讓我們看到許多命令

.tables 查看所有表

通過.tables 命令,可以查詢此數據庫下所有表名

查詢語句和SQLServer中一樣,每一句Sql語句結束都需要分號;

添加數據

btn5.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {

DBHelp dbHelp = new DBHelp(SQLiteActivity.this);
SQLiteDatabase db = dbHelp.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("sName", txtName.getText().toString());
contentValues.put("sSex", "男");
if(dbHelp.InsertData(db, contentValues))
Toast.makeText(SQLiteActivity.this, "添加成功", Toast.LENGTH_SHORT).show();
else
Toast.makeText(SQLiteActivity.this, "添加失敗", Toast.LENGTH_SHORT).show();
}
});

修改數據

btn6.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {

DBHelp dbHelp = new DBHelp(SQLiteActivity.this);
SQLiteDatabase db = dbHelp.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("sName", txtsName.getText().toString());
String whereClause = "sid=?"; //要修改數據的條件 值用?占位符
String[] whereArgs = new String[]{txtsID.getText().toString()};
if(dbHelp.UpdateData(db, contentValues, whereClause, whereArgs))
Toast.makeText(SQLiteActivity.this, "修改成功", Toast.LENGTH_SHORT).show();
else
Toast.makeText(SQLiteActivity.this, "修改失敗", Toast.LENGTH_SHORT).show();
}
});

刪除數據

    btn7.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {

DBHelp dbHelp = new DBHelp(SQLiteActivity.this);
SQLiteDatabase db = dbHelp.getWritableDatabase();
String whereClause = "sid=?"; //要刪除數據的條件 值用?占位符
String[] whereArgs = new String[]{txtID.getText().toString()};
if(dbHelp.DeleteData(db, whereClause, whereArgs))
Toast.makeText(SQLiteActivity.this, "刪除成功", Toast.LENGTH_SHORT).show();
else
Toast.makeText(SQLiteActivity.this, "刪除失敗", Toast.LENGTH_SHORT).show();
}
});

查詢數據

rawQuery()

rawQuery() 是最簡單的解決方法。例如:

Cursor c=db.rawQuery(
“SELECT * FROM Student WHERE sid=1 AND sname=‘zhangsan'", null);

query()

都會返回一個 Cursor,這是 Android 的 SQLite 數據庫游標

操作游標

 

通過使用 getCount() 方法得到結果集中有多少記錄;
通過 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍歷所有記錄;
通過 getColumnNames() 得到字段名;
通過 getColumnIndex() 轉換成字段號;
通過 getString(),getInt() 等方法得到給定字段當前記錄的值;
通過 requery() 方法重新執行查詢得到游標;
通過 close() 方法釋放游標資源;
SimpleCursorAdapter
SimpleCursorAdapter
可使用此類來綁定ListView 

SimpleCursorAdapter simple = new SimpleCursorAdapter(SQLiteActivity.this, android.R.layout.simple_list_item_1, cur, new String[]{"sName","sSex"}, new int[]{android.R.id.text1,android.R.id.text2});

studentList.setAdapter(simple);

注意: 使用此類綁定數據,,必須注意sqlite的主鍵命名。由於simpleCursorAdapter的方法只識別_id,所以,當你用到sqlite的simpleCursorAdapter時,必須把數據表的主鍵命名為_id。否則就會出現 java.lang.IllegalArgumentException: column ‘_id’ does not exist 錯誤。

 查詢數據
public void BinderData(){
DBHelp dbHelp = new DBHelp(SQLiteActivity.this);
SQLiteDatabase db = dbHelp.getReadableDatabase();
/*參數
* table 表名
* columns 要查詢的列名數組,所有列用 null
* selection 要查詢的條件 沒有用null
* selectionArgs 要查詢的條件對應的值 沒有用null
* groupBy 分組 沒有用null
* having 分組后再次篩選 沒有用null
* orderBy 排序 沒有用null
*
*/
Cursor cur = db.query("StudentInfo", null, null, null, null, null, null);
//Cursor cur = db.rawQuery("select * from StudentInfo", null);

//由於本例中使用的主鍵名不是_id 所以不能直接使用SimpleCursorAdapter 原因在PPT中已經做了說明
//SimpleCursorAdapter simple = new SimpleCursorAdapter(SQLiteActivity.this, android.R.layout.simple_list_item_1, cur, new String[]{"sName","sSex"}, new int[]{android.R.id.text1,android.R.id.text2});
//studentList.setAdapter(simple);
ArrayList<HashMap<String, Object>> students = new ArrayList<HashMap<String,Object>>();
HashMap<String, Object> hs ;
for (cur.moveToFirst();!cur.isAfterLast();cur.moveToNext()) {
System.out.println(cur.getInt(cur.getColumnIndex("sid"))+"aaaaaaaaa");
hs = new HashMap<String, Object>();
hs.put("sID", cur.getInt(cur.getColumnIndex("sid")));
hs.put("sName", cur.getString(cur.getColumnIndex("sName")));
hs.put("sSex", cur.getString(cur.getColumnIndex("sSex")));
students.add(hs);
}
SimpleAdapter sim = new SimpleAdapter(SQLiteActivity.this, students, android.R.layout.simple_list_item_1, new String[]{"sName","sSex"}, new int[]{android.R.id.text1,android.R.id.text2});
studentList.setAdapter(sim);
}

 代碼已上傳北京天聖達網站,歡迎大家下載





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM