編輯:關於Android編程
一. 簡介
SQLite數據庫是一個輕量級的DBMS(數據庫管理系統)。SQLite使用單個文件存儲數據,Android標准庫包含SQLite庫以及配套使用的一些Java輔助類。主要特點:輕量級,單一文件,跨平台,開源。
二. Android中SQLite數據庫的使用
1、創建SQLite數據庫
SQLiteDatabase db= SQLiteDatabase.openOrCreateDatabase( "/data/data/" + getPackageName() + "/test.db", null);
執行完這條語句,可以在adb shell下進入/data/data/package-name/下看到剛才創建的數據庫文件
在Android中使用SQLiteDatabase的靜態方法
openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)打開或者創建一個數據庫。
它會自動去檢測是否存在這個數據庫,如果存在則打開,反之不存在就創建一個數據庫;創建成功則返回一個SQLiteDatabase對象,失敗拋出FileNotFoundException異常。
除了以上方法,Android還提供了SQLiteOpenHelper這個類來創建數據庫,首先繼承SQLiteOpenHelper,重寫onCreate和onUpgrade方法及構造方法
public class MySqliteHelper extends SQLiteOpenHelper{
public MySqliteHelper(Context context) {
super(context, "mysqlite.db", null, 1);
//傳入四個參數
//第一個參數context 上下文對象
//第二個參數mysqlite.db 數據庫名稱(文件名)
//第三個參數一般為null
//第四個參數數據庫版本號,這裡寫1
}
@Override
public void onCreate(SQLiteDatabase db) {
/* 數據庫創建的時候會回調此方法,可以用db對象執行SQL語
* 句,創建所需要的表
*/
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//當數據庫升級時調用此方法
}
}
接著在需要創建數據庫的時候調用
SQLiteOpenHelper dbHelper = new MySqliteHelper(this); SQLiteDatabase db = dbHelper.getWritableDatabase();
使用SQLiteOpenHelper創建的數據庫,保存在/data/data/package-name/databases/目錄下,通過adb shell可以看到創建的數據庫文件

2、創建數據庫中的數據表
數據庫創建完成後,要創建保存數據的表,表是存放在數據庫中的。示例代碼入下
private void createTable(SQLiteDatabase db){
//SQL語句
String sql =
"create table stutable(_id integer primary key autoincrement,name text,age integer)";
db.execSQL(sql);
}
這裡附上SQLite數據類型
NULL: 這個值可為空值
VARCHAR(n):長度不固定且其最大長度為 n 的字串,n不能超過 4000。
CHAR(n):長度固定為n的字串,n不能超過 254。
INTEGER: 值被標識為整數,依據值的大小可以依次被存儲為1,2,3,4,5,6,7,8….
REAL: 所有值都是浮動的數值,被存儲為8字節的IEEE浮動標記序號.
TEXT: 值為文本字符串,使用數據庫編碼存儲(TUTF-8, UTF-16BE or UTF-16-LE).
BLOB: 值是BLOB數據塊,以輸入的數據格式進行存儲。如何輸入就如何存儲,不改變格式。
DATA :包含了 年份、月份、日期
執行完上述語句,可以通過ADM將數據庫文件導出到電腦上
通過可視化工具打開數據庫文件可以看到之前創建的表,以及定義的表字段

除了執行定義創建表的方法外,還可以在繼承SQLiteOpenHelper類中的onCreate方法來初始化表結構,在後面的例子使用繼承SQLiteOpenHelper方式創建表。
3、對表進行操作(數據表的增刪改查)
增:在表中增加數據,可以使用SQLiteDatabase類中提供的execSQL(String sql)執行一條插入數據的SQL語句來插入數據,不過,AndroidSQLiteDatabase類提供了更為簡單的方法來執行插入數據操作
//SQLiteDatabase類中提供的方法
public long insert(
String table,//要操作表名
String nullColumnHack,//空列的默認值
ContentValues values
//ContentValues封裝了列名稱和列值的Map
);
private void insertToTable(SQLiteDatabase db){
ContentValues cv = new ContentValues();
cv.put("name","wxq");
cv.put("age",11);
db.insert("stutable",null,cv);
}
執行insertTable方法,再次導出數據庫可以看到stutable表中增加了一條數據

刪:好吧,剛插入一條數據。。。
同樣Android提供了delete方法
//SQLiteDatabase類中提供的方法
public int delete(
String table,//表名稱
String whereClause,//刪除條件
String[] whereArgs); //刪除條件值數組
private void deleteToTable(SQLiteDatabase db){
//刪除條件,這裡以name為條件,也可以是age = ?
String whereClasuse = "name = ?";
//刪除條件參數,
String[] whereArgs = new String[]{"wxq"};
//執行刪除
db.delete("stutable",whereClasuse,whereArgs);
}
執行上述語句,將會刪除stutable表中剛才插入的數據。
改:
//SQLiteDatabase類中提供的方法
public int update(
//表名稱
String table,
//和行列ContentValues鍵值對應的key-value
ContentValues values,
//更新條件
String whereClause,
//更新條件數組
String[] whereArgs
);
private void updateToTable(SQLiteDatabase db){
//實例化ContentValues
ContentValues cv= new ContentValues();
cv.put("age",23);
//更新條件
String whereClause = "name = ?";
//更新條件數組
String[] whereArgs = new String[]{"wxq"};
db.update("stutable",cv,whereClause,whereArgs);
}
執行完更新語句,導出數據庫文件,在可視化工具中查看

查:在Android中查詢數據是通過Cursor類來實現的,可以使用SQLiteDatabase.query()方法時,這裡使用別一個方法rawQuery
public Cursor rawQuery(
String sql,//查詢的SQL語句
String[] selectionArgs//當SQL語句中含有?,這裡代表值
);
public void queryToTable(SQLiteDatabase db){
String sql = "select * from stutable";//全查
Cursor c = db.rawQuery(sql,null);//這裡會返回一個Cursor(游標)對象
}

使用SQLite的一個Demo(英雄管理系統)
主要操作數據庫的代碼
public class HeroSqliteManager {
private SQLiteOpenHelper dbHelper;
private SQLiteDatabase db;
private static HeroSqliteManager instance;
private static final String TABLE_NAME = "hero";
private static final String NAME_FIELD = "name";
private static final String ICOID_FIELD = "icoId";
private static final String ATTACK_FIELD = "attack";
private static final String DEFENSE_FIELD = "defense";
public static HeroSqliteManager getInstance() {
if (instance == null) {
synchronized (HeroSqliteManager.class) {
if (instance == null) {
instance = new HeroSqliteManager();
}
}
}
return instance;
}
private HeroSqliteManager() {
dbHelper = new HeroSqliteHelper(HeroApplication.getContext());
db = dbHelper.getWritableDatabase();
}
/**
* 插入記錄
* @param hero
*/
public void insertData(Hero hero) {
ContentValues cv = new ContentValues();
cv.put(NAME_FIELD, hero.name);
cv.put(ICOID_FIELD, hero.icoId);
cv.put(ATTACK_FIELD, hero.attack);
cv.put(DEFENSE_FIELD, hero.defense);
db.insert(TABLE_NAME, null, cv);
}
/**
* 刪除記錄
* @param
*/
public void deleteData(int id) {
String whereClasuse = "_id = ?";
String[] whereArgs = new String[]{String.valueOf(id)};
db.delete(TABLE_NAME, whereClasuse, whereArgs);
}
/**
* 修改記錄
* @param hero
*/
public void updateData(Hero hero) {
ContentValues cv = new ContentValues();
cv.put(NAME_FIELD, hero.name);
cv.put(ICOID_FIELD, hero.icoId);
cv.put(ATTACK_FIELD, hero.attack);
cv.put(DEFENSE_FIELD, hero.defense);
String whereClasuse = "_id = ?";
String[] whereArgs = new String[]{String.valueOf(hero.id)};
db.update(TABLE_NAME, cv, whereClasuse, whereArgs);
}
/**
* 查詢所有的英雄
* @return
*/
public List<Hero> selectData() {
List<Hero> heroList = new ArrayList<>();
Cursor c = db.rawQuery("select * from " + TABLE_NAME, null);
while (c.moveToNext()) {
Hero hero = new Hero();
hero.id = c.getInt(c.getColumnIndex("_id"));
hero.name = c.getString(c.getColumnIndex(NAME_FIELD));
hero.icoId = c.getInt(c.getColumnIndex(ICOID_FIELD));
hero.attack = c.getInt(c.getColumnIndex(ATTACK_FIELD));
hero.defense = c.getInt(c.getColumnIndex(DEFENSE_FIELD));
heroList.add(hero);
}
c.close();
return heroList;
}
/**
* 按name查詢
* @param name
* @return
*/
public Hero selectForName(String name) {
Cursor c = db.rawQuery("select * from " + TABLE_NAME + " where name = ?", new String[]{name});
Hero hero = null;
if (c.moveToNext()) {
hero = new Hero();
hero.id = c.getInt(c.getColumnIndex("_id"));
hero.name = c.getString(c.getColumnIndex(NAME_FIELD));
hero.icoId = c.getInt(c.getColumnIndex(ICOID_FIELD));
hero.attack = c.getInt(c.getColumnIndex(ATTACK_FIELD));
hero.defense = c.getInt(c.getColumnIndex(DEFENSE_FIELD));
}
c.close();
return hero;
}
public void destroy() {
// if (db != null) {
// db.close();
// }
// db = null;
}
}
SQLiteDemo
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
Android應用中實現選擇本地文件與目錄的實例分享
文件選擇器今天給大家分享下文件選擇器的作用 , 具體就是獲取用戶在在SD卡選中的文件/文件夾路徑 ,類似於C#中OpenFileDialog控件(對C#的一站式開發還是念
Android7.0 PackageManagerService (3) APK安裝
在本篇博客中,我們分析一下Android中的APK是如何安裝的,以及PKMS在這個過程中進行了哪些工作。APK的安裝方式有很多,我們先來看看如何用adb命令進行安裝。我們
Android ViewPager 動畫效果
找到個不錯的開源項目:https://github.com/jfeinstein10/JazzyViewPager Android ViewPager 動畫效果
Android實現日夜間模式的深入理解
在本篇文章中給出了三種實現日間/夜間模式切換的方案,三種方案綜合起來可能導致文章的篇幅過長,請耐心閱讀。 1、使用 setTheme