最近看了網上的關於Android SQLite數據庫的視頻教程,在這裏做個筆記記錄一下一些常用的操作,在文章最後會給出源碼。
孫子兵法有言:知己知彼方能百戰不殆,既然用sqlite,那我們首先先來了解一下什麼是sqlite?
首先嵌入式數據庫是不需要獨立運行有專門的數據庫引擎的,由程序直接調用相應的API實現對數據庫的存取操作,它是程序驅動式的,不同於SQLServer、DB2、MySQL、Oracle這些引擎響應式的。sqlite就是一款開源的輕量級的可嵌入的關係型數據庫,特點是系統開銷小(通常只需要幾百KB的內存就足夠了)、檢索效率高、應用範圍廣,sqlite不僅支持標準的SQL語法,還遵循了數據庫的ACID事務,保證了數據的完整性,同時也提高了運行的速度。下面先來看一些基礎知識:
1.sqlite數據庫的數據類型:Integer、varchar(10)、float、double、char(10)、text
2.日常開發中較爲常用的sql語句:
創建表:create table 表名(字段名稱 數據類型 約束條件,字段名稱 數據類型 約束條件......)
例如:create table person(_id Integer primary key,name varchar(10),age Integer not null)
刪除表:drop table 表名
例如:drop table person
插入數據:insert into 表名[字段,字段] values(值1,值2......)
例如:insert into person(_id,age) values(1,20) 表名後面指定了要插入的字段名稱,則values中根據字段名對應賦值即可
insert into person values(2,"archie",24) 表名後面沒有指定具體要插入的字段名,則values中要根據表結構一一給出相應的值
修改表:update 表名 set 字段=新值 where 修改的條件
例如:update person set name="jarchie",age=23 where _id=2
刪除數據:delete from 表名 where 刪除的條件
例如:delete from person where _id=2
查詢語句:select 字段 from 表名 where 查詢條件 group by 分組的字段 having 篩選條件 order by 排序字段
例如:查詢所有:select * from person
模糊查詢:select * from person where name like "%小%" select * from person where name like "_小%"
排序:select * from person where age>18 order by _id
好了,瞭解了以上的知識點之後,我們一起來看一下sqlite數據庫在android中具體該如何使用呢?
首先來看如何創建數據庫?
Android底層爲我們提供了一個SQLiteOpenHelper的幫助類,裏面封裝了創建和使用數據庫的各種方法,我們只需要定義自己的類去繼承SQLiteOpenHelper,實現裏面的方法即可。
public class MySqliteHelper extends SQLiteOpenHelper其中,onCreate()方法是在數據庫創建時回調的函數:
/** * 當數據庫創建時回調的函數 * @param db 數據庫對象 */ @Override public void onCreate(SQLiteDatabase db) { Log.e(TAG, "onCreate: " + "------onCreate-----" ); }
然後,我們在我們的活動頁中首先需要拿到我們的MySqliteHelper對象,然後通過調用helper.getWriteableDatabase()方法就可以創建數據庫了:
helper = DbManager.getInstance(this);
/** * getReadableDatabase()和getWritableDatabase()創建或者打開數據庫 * 如果數據庫不存在則創建數據庫,如果數據庫存在直接打開數據庫 * 默認情況下兩個函數都表示打開或者創建可讀可寫的數據庫對象,如果磁盤已滿或者數據庫 * 本身權限等情況下getReadableDatabase()打開的是隻讀數據庫 */ SQLiteDatabase db = helper.getWritableDatabase();接下來我們來看一下對數據庫的一些常用操作,在本篇中先來看一下sqlite的增刪改操作,對於這部分我們有兩種實現方式,一種是直接通過執行sql語句進行相關的操作,另一種是通過android中的api進行操作,下面先來看一下第一種實現方式:
首先定義一個數據庫的操作類,在該類中我們定義一個數據庫的公共的執行方法,便於調用:
/** * 根據sql語句在數據庫中執行語句 * @param db 數據庫對象 * @param sql sql語句 */ public static void execSql(SQLiteDatabase db,String sql){ if (db != null){ if (!TextUtils.isEmpty(sql)){ db.execSQL(sql); } } }
然後在我們的頁面中開始進行相關的操作,分別是插入數據,修改數據,刪除數據等操作:
插入操作:
db = helper.getWritableDatabase(); String sql = "insert into "+ Constant.TABLE_NAME+" values(1,'Archie',24)"; DbManager.execSql(db,sql); String sql1 = "insert into "+ Constant.TABLE_NAME+" values(2,'Jackson',25)"; DbManager.execSql(db,sql1); db.close();
修改數據:
db = helper.getWritableDatabase(); String sql2 = "update "+Constant.TABLE_NAME+" set "+Constant.NAME +"='angel' where "+Constant._ID+"=1"; DbManager.execSql(db,sql2); db.close();
刪除數據:
db = helper.getWritableDatabase(); String sql3 = "delete from "+Constant.TABLE_NAME+" where "+Constant._ID+"=2"; DbManager.execSql(db,sql3); db.close();通過這些操作我們就可以完成數據的增刪改功能,但是這種方式有個前提條件是我們得熟練的去運用sql語句。所以,下面我們來看看使用第二種方式該如何實現?
插入數據:
db = helper.getWritableDatabase(); /** * insert(String table, String nullColumnHack, ContentValues values) * table:表名 nullColumnHack:一般指定爲null values:鍵爲String的HashMap集合 * return long 表示插入數據的列數 */ ContentValues values = new ContentValues(); values.put(Constant._ID,3); //put(字段名,字段值) values.put(Constant.NAME,"安奇"); values.put(Constant.AGE,24); long result = db.insert(Constant.TABLE_NAME, null, values); if (result > 0){ DbManager.toastMessage(this,"插入數據成功!"); }else { DbManager.toastMessage(this,"插入數據失敗!"); } db.close();修改數據:
db = helper.getWritableDatabase(); /** * update(String table, ContentValues values, String whereClause, String[] whereArgs) * table:表名 values:鍵爲String的HashMap集合 * whereClause:表示當前修改的條件 whereArgs:修改條件的佔位符 * return int 修改的條數 */ ContentValues values1 = new ContentValues(); values1.put(Constant.NAME,"哈哈"); //put(需要修改的字段名,修改後的字段值) int count = db.update(Constant.TABLE_NAME, values1, Constant._ID + "=?", new String[]{"3"}); if (count > 0){ DbManager.toastMessage(this,"修改數據成功!"); }else { DbManager.toastMessage(this,"修改數據失敗!"); } db.close();
刪除數據:
db = helper.getWritableDatabase(); /** * delete(String table, String whereClause, String[] whereArgs) * table:刪除的表名 whereClause:刪除的條件 whereArgs:刪除條件的佔位符 * return int 刪除條數 */ int size = db.delete(Constant.TABLE_NAME, Constant._ID + "=?", new String[]{"1"}); if (size > 0){ DbManager.toastMessage(this,"刪除數據成功!"); }else { DbManager.toastMessage(this,"刪除數據失敗!"); } db.close();附項目源碼如下:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/create_db"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="創建數據庫"
android:textColor="#fff"
android:background="#f37400"
android:layout_marginTop="10dp"
android:layout_marginLeft="14dp"/>
<Button
android:id="@+id/insert_db"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="插入數據"
android:textColor="#fff"
android:background="#f37400"
android:layout_marginLeft="14dp"
android:layout_marginTop="10dp"/>
<Button
android:id="@+id/update_db"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="修改數據"
android:textColor="#fff"
android:background="#f37400"
android:layout_marginLeft="14dp"
android:layout_marginTop="10dp"/>
<Button
android:id="@+id/delete_db"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="刪除數據"
android:textColor="#fff"
android:background="#f37400"
android:layout_marginLeft="14dp"
android:layout_marginTop="10dp"/>
<Button
android:id="@+id/insertapi_db"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="api插入數據"
android:textColor="#fff"
android:background="#f37400"
android:layout_marginLeft="14dp"
android:layout_marginTop="10dp"/>
<Button
android:id="@+id/updateapi_db"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="api修改數據"
android:textColor="#fff"
android:background="#f37400"
android:layout_marginLeft="14dp"
android:layout_marginTop="10dp"/>
<Button
android:id="@+id/deleteapi_db"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="api刪除數據"
android:textColor="#fff"
android:background="#f37400"
android:layout_marginLeft="14dp"
android:layout_marginTop="10dp"/>
</LinearLayout>
Constant.java
package com.jarchie.sqliteproject.db;
/**
* Created by Jarchie on 17/1/7.
* 創建數據庫參數的常量類
*/
public class Constant {
public static final String DATABASE_NAME = "info.db"; //數據庫名稱
public static final int DATABASE_VERSION = 1; //數據庫的版本號
public static final String TABLE_NAME = "person"; //表名
public static final String _ID = "_id";
public static final String NAME = "name";
public static final String AGE = "age";
}
MySqliteHelper.java
package com.jarchie.sqliteproject.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* Created by Jarchie on 17/1/7.
* 本類提供了創建數據庫和更新數據庫的方法
* 提供了獲取數據庫對象的函數
*/
public class MySqliteHelper extends SQLiteOpenHelper{
private static final String TAG = "MySqliteHelper";
/**
* 構造函數
* @param context 上下文對象
* @param name 表示創建的數據庫的名稱
* @param factory 遊標工廠
* @param version 當前創建數據庫的版本,要求>=1
*/
public MySqliteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
public MySqliteHelper(Context context){
super(context,Constant.DATABASE_NAME,null,Constant.DATABASE_VERSION);
}
/**
* 當數據庫創建時回調的函數
* @param db 數據庫對象
*/
@Override
public void onCreate(SQLiteDatabase db) {
Log.e(TAG, "onCreate: " + "------onCreate-----" );
String sql = "create table "+Constant.TABLE_NAME+"("+
Constant._ID+" Integer primary key,"+Constant.NAME+
" varchar(10),"+Constant.AGE+" Integer)";
db.execSQL(sql); //執行sql語句
}
/**
* 當數據庫版本更新時回調的函數
* @param db 數據庫對象
* @param oldVersion 數據庫舊版本
* @param newVersion 數據庫新版本
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.e(TAG, "onUpgrade: " + "------onUpgrade-----" );
}
/**
* 當數據庫打開時回調的函數
* @param db 數據庫對象
*/
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
Log.e(TAG, "onOpen: " + "------onOpen-----" );
}
}
DbManager.java
package com.jarchie.sqliteproject.utils;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.text.TextUtils;
import android.widget.Toast;
import com.jarchie.sqliteproject.db.MySqliteHelper;
/**
* Created by Jarchie on 17/1/7.
* 對數據庫操作的工具類,降低代碼的耦合度
*/
public class DbManager {
/**
* 採用單例模式構建helper對象
*/
private static MySqliteHelper helper;
public static MySqliteHelper getInstance(Context context){
if (helper == null){
helper = new MySqliteHelper(context);
}
return helper;
}
/**
* 根據sql語句在數據庫中執行語句
* @param db 數據庫對象
* @param sql sql語句
*/
public static void execSql(SQLiteDatabase db,String sql){
if (db != null){
if (!TextUtils.isEmpty(sql)){
db.execSQL(sql);
}
}
}
/**
* 定義公共的吐司方法
* @param context 上下文對象
* @param message 吐司信息
*/
public static void toastMessage(Context context,String message){
Toast.makeText(context,message,Toast.LENGTH_SHORT).show();
}
}
MainActivity.java
package com.jarchie.sqliteproject;
import android.app.Activity;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.jarchie.sqliteproject.db.Constant;
import com.jarchie.sqliteproject.db.MySqliteHelper;
import com.jarchie.sqliteproject.utils.DbManager;
public class MainActivity extends Activity implements View.OnClickListener{
private Button createBtn,insertBtn,updateBtn,deleteBtn,apiinsertBtn,apiupdateBtn,apideleteBtn;
private MySqliteHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
helper = DbManager.getInstance(this);
initView();
initWidgetListener();
}
/**
* 初始化控件
*/
private void initView(){
createBtn = (Button) findViewById(R.id.create_db);
insertBtn = (Button) findViewById(R.id.insert_db);
updateBtn = (Button) findViewById(R.id.update_db);
deleteBtn = (Button) findViewById(R.id.delete_db);
apiinsertBtn = (Button) findViewById(R.id.insertapi_db);
apiupdateBtn = (Button) findViewById(R.id.updateapi_db);
apideleteBtn = (Button) findViewById(R.id.deleteapi_db);
}
/**
* 初始化監聽事件
*/
private void initWidgetListener(){
createBtn.setOnClickListener(this);
insertBtn.setOnClickListener(this);
updateBtn.setOnClickListener(this);
deleteBtn.setOnClickListener(this);
apiinsertBtn.setOnClickListener(this);
apiupdateBtn.setOnClickListener(this);
apideleteBtn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.create_db:
createDb();
break;
case R.id.insert_db:
insertData();
break;
case R.id.update_db:
updateData();
break;
case R.id.delete_db:
deleteData();
break;
case R.id.insertapi_db:
apiInsertData();
break;
case R.id.updateapi_db:
apiUpdateData();
break;
case R.id.deleteapi_db:
apiDeleteData();
break;
}
}
//創建數據庫
private void createDb(){
/**
* getReadableDatabase()和getWritableDatabase()創建或者打開數據庫
* 如果數據庫不存在則創建數據庫,如果數據庫存在直接打開數據庫
* 默認情況下兩個函數都表示打開或者創建可讀可寫的數據庫對象,如果磁盤已滿或者數據庫
* 本身權限等情況下getReadableDatabase()打開的是隻讀數據庫
*/
SQLiteDatabase db = helper.getWritableDatabase();
}
//sql語句插入數據
private void insertData(){
SQLiteDatabase db = helper.getWritableDatabase();
String sql = "insert into "+ Constant.TABLE_NAME+" values(1,'Archie',24)";
DbManager.execSql(db,sql);
String sql1 = "insert into "+ Constant.TABLE_NAME+" values(2,'Jackson',25)";
DbManager.execSql(db,sql1);
db.close();
}
//sql語句修改數據
private void updateData(){
SQLiteDatabase db = helper.getWritableDatabase();
String sql2 = "update "+Constant.TABLE_NAME+" set "+Constant.NAME
+"='angel' where "+Constant._ID+"=1";
DbManager.execSql(db,sql2);
db.close();
}
//sql語句刪除數據
private void deleteData(){
SQLiteDatabase db = helper.getWritableDatabase();
String sql3 = "delete from "+Constant.TABLE_NAME+" where "+Constant._ID+"=2";
DbManager.execSql(db,sql3);
db.close();
}
//api插入數據
private void apiInsertData(){
SQLiteDatabase db = helper.getWritableDatabase();
/**
* insert(String table, String nullColumnHack, ContentValues values)
* table:表名 nullColumnHack:一般指定爲null values:鍵爲String的HashMap集合
* return long 表示插入數據的列數
*/
ContentValues values = new ContentValues();
values.put(Constant._ID,3); //put(字段名,字段值)
values.put(Constant.NAME,"安奇");
values.put(Constant.AGE,24);
long result = db.insert(Constant.TABLE_NAME, null, values);
if (result > 0){
DbManager.toastMessage(this,"插入數據成功!");
}else {
DbManager.toastMessage(this,"插入數據失敗!");
}
db.close();
}
//api修改數據
private void apiUpdateData(){
SQLiteDatabase db = helper.getWritableDatabase();
/**
* update(String table, ContentValues values, String whereClause, String[] whereArgs)
* table:表名 values:鍵爲String的HashMap集合
* whereClause:表示當前修改的條件 whereArgs:修改條件的佔位符
* return int 修改的條數
*/
ContentValues values1 = new ContentValues();
values1.put(Constant.NAME,"哈哈"); //put(需要修改的字段名,修改後的字段值)
// int count = db.update(Constant.TABLE_NAME, values1,
// Constant._ID + "=3", null);
int count = db.update(Constant.TABLE_NAME, values1, Constant._ID + "=?",
new String[]{"3"});
if (count > 0){
DbManager.toastMessage(this,"修改數據成功!");
}else {
DbManager.toastMessage(this,"修改數據失敗!");
}
db.close();
}
//api刪除數據
private void apiDeleteData(){
SQLiteDatabase db = helper.getWritableDatabase();
/**
* delete(String table, String whereClause, String[] whereArgs)
* table:刪除的表名 whereClause:刪除的條件 whereArgs:刪除條件的佔位符
* return int 刪除條數
*/
int size = db.delete(Constant.TABLE_NAME, Constant._ID + "=?", new String[]{"1"});
if (size > 0){
DbManager.toastMessage(this,"刪除數據成功!");
}else {
DbManager.toastMessage(this,"刪除數據失敗!");
}
db.close();
}
}
好了,本篇就先寫到這裏,未完待續哦!