每個應用程序都要使用數據,Android應用程序也不例外,Android使用開源的、與操作系統無關的SQL數據庫 --大名鼎鼎的SQLite。SQLite是一款輕量級數據庫,它的設計目的是嵌入式,而且它占用的資源非常少,在嵌入式設備中,可能只需要幾百KB,這也是 Android 系統采用 SQLite 數據庫的原因之一吧。
簡介
- 輕量級
使用 SQLite 只需要帶一個動態庫,就可以享受它的全部功能,而且那個動態庫的尺寸想當小。
- 獨立性
SQLite 數據庫的核心引擎不需要依賴第三方軟件,也不需要所謂的“安裝”。
- 隔離性
SQLite 數據庫中所有的信息(比如表、視圖、觸發器等)都包含在一個文件夾內,方便管理和維護。
- 跨平台
SQLite 目前支持大部分操作系統,不至電腦操作系統更在眾多的手機系統也是能夠運行,比如:Android。
- 多語言接口
SQLite 數據庫支持多語言編程接口。
- 安全性
SQLite 數據庫通過數據庫級上的獨占性和共享鎖來實現獨立事務處理。這意味著多個進程可以在同一時間從同一數據庫讀取數據,但只能有一個可以寫入數據。
SQLite使用介紹
首先先來看一下本篇例子繼承 SQLiteOpenHelper 類實現的 dbHelper 類。
package com.terry;
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 dbHelper extends SQLiteOpenHelper {
private final static String DATABASE_NAME="sec_db";
private final static int DATABASE_VERSION=1;
private final static String TABLE_NAME="sec_pwd";
public final static String FIELD_ID="_id";
public final static String FIELD_TITLE="sec_Title";
public dbHelper(Context context)
{
super(context, DATABASE_NAME,null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String sql="Create table " TABLE_NAME "(" FIELD_ID " integer primary key autoincrement,"
FIELD_TITLE " text );";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
String sql=" DROP TABLE IF EXISTS " TABLE_NAME;
db.execSQL(sql);
onCreate(db);
}
public Cursor select()
{
SQLiteDatabase db=this.getReadableDatabase();
Cursor cursor=db.query(TABLE_NAME, null, null, null, null, null, " _id desc");
return cursor;
}
public long insert(String Title)
{
SQLiteDatabase db=this.getWritableDatabase();
ContentValues cv=new ContentValues();
cv.put(FIELD_TITLE, Title);
long row=db.insert(TABLE_NAME, null, cv);
return row;
}
public void delete(int id)
{
SQLiteDatabase db=this.getWritableDatabase();
String where=FIELD_ID "=?";
String[] whereValue={Integer.toString(id)};
db.delete(TABLE_NAME, where, whereValue);
}
public void update(int id,String Title)
{
SQLiteDatabase db=this.getWritableDatabase();
String where=FIELD_ID "=?";
String[] whereValue={Integer.toString(id)};
ContentValues cv=new ContentValues();
cv.put(FIELD_TITLE, Title);
db.update(TABLE_NAME, cv, where, whereValue);
}
}
- 創建和打開數據庫
上篇通過構造函數來創建數據庫,看一下構造函數的方法
android.database.sqlite.SQLiteOpenHelper.SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version)
public SQLiteOpenHelper (Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
Since: API Level 1
Create a helper object to create, open, and/or manage a database. The database is not actually created or opened until one of getWritableDatabase() or getReadableDatabase() is called.
Parameters
context to use to open or create the database
name of the database file, or null for an in-memory database
factory to use for creating cursor objects, or null for the default
version number of the database (starting at 1); if the database is older, onUpgrade(SQLiteDatabase, int, int) will be used to upgrade the database
Public Methods
大體可以理成如下:如果進入此函數,不存在此數據庫則創建,如果存在此數據庫則打開連接,只要進入此方法就可以用打開的連接獲得getWritableDatabase()或getReadableDatabase()這兩個方法。
- 創建表--》Create Table
一個數據庫中可以包含多個表,每一條數據都存在指定的表中,要創建可以通過 execSQL 方法來執行一條 SQL 語句。上面的方法為
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String sql="Create table " TABLE_NAME "(" FIELD_ID " integer primary key autoincrement,"
FIELD_TITLE " text );";
db.execSQL(sql);
}
上面代碼創建了表名為“sec_pwd” 的數據表,表內存在一個 integer 類型的主鍵和一個 text 類型的字段,並執行創建該表。
-
添加數據--》Insert
上面的代碼封裝了一個使用SQLite 的 insert 方法,向表中添加數據,但是insert 方法要求把數據都打包到 ContentValues 中, ContentValue 其實可就是一個 HashTable,Key值是字段名稱,Value 值是字段的值。通過 ContentValues 的put 方法就可以把數據庫放到 ContentValue 對象中,然後插入到表中去。代碼為:
public long insert(String Title)
{
SQLiteDatabase db=this.getWritableDatabase();
ContentValues cv=new ContentValues();
cv.put(FIELD_TITLE, Title);
long row=db.insert(TABLE_NAME, null, cv);
return row;
}
-
刪除數據--》Delete
依此類推,添加數據用Insert,那麼刪除數據為Delete
public void delete(int id)
{
SQLiteDatabase db=this.getWritableDatabase();
String where=FIELD_ID "=?";
String[] whereValue={Integer.toString(id)};
db.delete(TABLE_NAME, where, whereValue);
}
- 修改數據--》Update
public void update(int id,String Title)
{
SQLiteDatabase db=this.getWritableDatabase();
String where=FIELD_ID "=?";
String[] whereValue={Integer.toString(id)};
ContentValues cv=new ContentValues();
cv.put(FIELD_TITLE, Title);
db.update(TABLE_NAME, cv, where, whereValue);
}
可根據自己需要修改字段自行加參數。
- 查詢數據--》Query
public Cursor select()
{
SQLiteDatabase db=this.getReadableDatabase();
Cursor cursor=db.query(TABLE_NAME, null, null, null, null, null, " _id desc");
return cursor;
}
在 Android 中查詢數據是通過 Cursor 類來實現的,當我們使用SQLiteDatabase.query()方法時,會得到一個Cursor對象,Cursor指向的就是每一條數據。它提供了很多有關查詢的方法,具體截圖如下:
現在dbHelper己經封裝完畢,接下來正式進入到我們實際例子中要操作的功能吧,項目運行效果圖:
這裡用到了Menu做功能按鈕,實例代碼如下:
package com.terry;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteCursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
public class testDbActivity extends Activity {
private dbHelper db;
private Cursor myCursor;
private ListView myListView;
private EditText myEditText;
private int _id;
protected final static int MENU_ADD=Menu.FIRST;
protected final static int MENU_EDIT=Menu.FIRST 1;
protected final static int MENU_DELETE=Menu.FIRST 2;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
super.onCreateOptionsMenu(menu);
menu.add(Menu.NONE, MENU_ADD, 0, R.string.ADD);
menu.add(Menu.NONE, MENU_EDIT, 0,R.string.EDIT);
menu.add(Menu.NONE, MENU_DELETE, 0,R.string.DELETE);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case MENU_ADD:
operation("add");
break;
case MENU_EDIT:
operation("edit");
break;
case MENU_DELETE:
operation("delete");
break;
default:
break;
}
return true;
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myEditText=(EditText)findViewById(R.id.EditText1);
myListView=(ListView)findViewById(R.id.ListView1);
db=new dbHelper(testDbActivity.this);
myCursor=db.select();
SimpleCursorAdapter adpater=new SimpleCursorAdapter(this
, R.layout.test, myCursor,
new String[]{dbHelper.FIELD_TITLE},
new int[]{R.id.topTextView});
myListView.setAdapter(adpater);
myListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
myCursor.moveToPosition(arg2);
_id=myCursor.getInt(0);
myEditText.setText(myCursor.getString(1));
}
});
myListView.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
SQLiteCursor sc=(SQLiteCursor)arg0.getSelectedItem();
_id=sc.getInt(0);
myEditText.setText(sc.getString(1));
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
}
private void operation(String cmd)
{
if(myEditText.getText().toString().equals(""))
return;
if(cmd=="add")
db.insert( myEditText.getText().toString());
if(cmd=="edit")
db.update(_id, myEditText.getText().toString());
if(cmd=="delete")
db.delete(_id);
myCursor.requery();
myListView.invalidateViews();
myEditText.setText("");
_id=0;
}
}
至此,功能己經基本完成。
源碼下載:/Files/TerryBlog/testDb.rar