Android Sqlite簡單使用

1. 介紹

SQLite,是一款輕型的數據庫,它能夠支持Windows/Linux/Unix等等主流的操作系統,同樣比起Mysql、PostgreSQL這兩款開源的世界著名數據庫管理系統來講,它的處理速度比他們都快。Android系統支持SqliLite數據庫。


2. 創建

建立Sqlite 數據庫初始化文件 MyDBHelper.java ,其繼承 SQLiteOpenHelper,實現構造函數,在其中創建名稱為創建名稱為 ”test.db“的,版本號為1的數據庫,具體代碼如下:

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * 作者:周洲 on 2016/11/23 19:42
 * <p>
 * 郵箱:double0zhou@126.com
 */

public class MyDBHelper extends SQLiteOpenHelper {

    public MyDBHelper(Context context){
        super(context,"test.db",null,1);//創建名稱為 ”test.db“的,版本號為1的數據庫
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

在數據中創建自己所需的數據表,例如創建名稱為testTable的數據表,其sql語言如下:

CREATE TABLE testTable (id INTEGER PRIMARY KEY AUTOINCREMENT,name text,sex text) //創建表 testTable ,其中id 為數字類型主鍵,并且自增長,name 為文本類型,sex為文本類型

在MyDBHelper的onCreate中創建上述表,代碼如下:

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String sql ="CREATE TABLE testTable (id integer primary key autoincrement,name text,sex text)";
        sqLiteDatabase.execSQL(sql);
    }

此時,MyDBHelper 基礎版完成。


3.使用

在數據表testTable 中插入一條數據:

INSERT INTO testTable (name,sex) VALUES('張三','男')

在Activity代碼中使用如下:

                String sqlInsert="INSERT INTO testTable (name,sex) VALUES('張三','男')";//向數據表testTable中華插入一條數據
                MyDBHelper myDBHelper = new MyDBHelper(MainActivity.this);
                SQLiteDatabase sqLiteDatabase = myDBHelper.getWritableDatabase();
                sqLiteDatabase.execSQL(sqlInsert);
                sqLiteDatabase.close();
                myDBHelper.close();

在testTable 中查詢數據

SELECT * FROM testTable //查詢testTable 中所有數據

MainActivity中查詢的代碼:

                String sqlStr = "SELECT * FROM testTable";
                MyDBHelper myDBHelper1 = new MyDBHelper(MainActivity.this);
                SQLiteDatabase sqLiteDatabase1 = myDBHelper1.getReadableDatabase();
                Cursor cursor = sqLiteDatabase1.rawQuery(sqlStr, null);
                for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
                    int id = cursor.getInt(0);
                    String name = cursor.getString(1);
                    String sex = cursor.getString(2);
                    HashMap<String,String>  map = new HashMap<>();
                    map.put("name",name);
                    map.put("sex",sex);
                    list.add(map);
                }
                if (cursor != null) {
                    cursor.close();
                }
                sLiteDatabase1.close();
                myDBHelper1.close();

上述方法包含了兩種數據庫操作,分別為無返回的數據庫操作和有返回的數據庫操作,此兩種數據庫操作基本可以實現sqlite增刪改查四項基礎功能。


4.封裝

query,insert,update,delete 分別為Android 封裝的查詢、插入、更新、刪除操作,方便了大家的使用。

insert(String table,String nullColumnHack,ContentValuesvalues)
參數1 表名稱
參數2 空列的默認值
參數3 ContentValues類型的一個封裝了列名稱和列值的Map;

private void insert(SQLiteDatabase db){   
//實例化常量值   
ContentValues cValue = new ContentValues();   
//添加用戶名   
cValue.put("sname","xiaoming");   
//添加密碼   
cValue.put("snumber","01005");   
//調用insert()方法插入數據   
db.insert("stu_table",null,cValue);   
}   

delete(String table,String whereClause,String[] whereArgs)
參數1 表名稱
參數2 刪除條件
參數3 刪除條件值數組

private void delete(SQLiteDatabase db) {   
//刪除條件   
String whereClause = "id=?";   
//刪除條件參數   
String[] whereArgs = {String.valueOf(2)};   
//執行刪除   
db.delete("stu_table",whereClause,whereArgs);   
}   

update(String table,ContentValues values,String whereClause, String[] whereArgs)
參數1 表名稱
參數2 跟行列ContentValues類型的鍵值對Key-Value
參數3 更新條件(where字句) 參數4 更新條件數組

private void update(SQLiteDatabase db) {   
//實例化內容值 ContentValues values = new ContentValues();   
//在values中添加內容   
values.put("snumber","101003");   
//修改條件   
String whereClause = "id=?";   
//修改添加參數   
String[] whereArgs={String.valuesOf(1)};   
//修改   
db.update("usertable",values,whereClause,whereArgs);   
}   

public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);

各個參數的意義說明:

參數table:表名稱

參數columns:列名稱數組

參數selection:條件字句,相當于where

參數selectionArgs:條件字句,參數數組

參數groupBy:分組列

參數having:分組條件

參數orderBy:排序列

參數limit:分頁查詢限制

參數Cursor:返回值,相當于結果集ResultSet

Cursor是一個游標接口,提供了遍歷查詢結果的方法,如移動指針方法move(),獲得列值方法getString()等.

Cursor游標常用方法

方法名稱 方法描述 getCount() 獲得總的數據項數 isFirst() 判斷是否第一條記錄 isLast() 判斷是否最后一條記錄
moveToFirst() 移動到第一條記錄 moveToLast() 移動到最后一條記錄 move(int offset) 移動到指定記錄
moveToNext() 移動到下一條記錄 moveToPrevious() 移動到上一條記錄
getColumnIndexOrThrow(String columnName) 根據列名稱獲得列索引 getInt(int
columnIndex) 獲得指定列索引的int類型值 getString(int columnIndex)
獲得指定列縮影的String類型值

private void query(SQLiteDatabase db) {   
//查詢獲得游標   
Cursor cursor = db.query ("usertable",null,null,null,null,null,null);   
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
                Object obj = cls.newInstance();
                for (int i = 0; i < cursor.getColumnCount(); i++) {
                    //cursor.getString(i)
                    }
                }
                resultList.add(obj);
            }
            if (cursor != null) {
                cursor.close();
            }
}  

5.數據庫的升級

onUpgrade 數據庫的升級

        if (oldVersion < DATABASE_VERSION) {
            try {
                 onCreate(db);
              //  UpdateDB(db);
            } catch (Exception e) {
                // TODO: handle exception
                Log.e("Sql_error", e.getMessage().toString());
            }
        }

6.數據的批量操作

beginTransaction,endTransaction

        DBHelper db = new DBHelper(context);
        SQLiteDatabase dataBase = db.getWritableDatabase();
        try {
            dataBase.beginTransaction(); // 手動設置開始事務
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject itemdata = (JSONObject) jsonArray.get(i);
                dataBase.insert(cls.getSimpleName(), null, InSertContentValues(cls, itemdata));
            }
            dataBase.setTransactionSuccessful(); // 設置事務處理成功,不設置會自動回滾不提交
            Log.i("SQLite", "Success insert info into SqliteDatabase " + cls.getSimpleName());

        } catch (Exception e) {
            Log.e("SQLite ERROR " + cls.getSimpleName(), e.getMessage().toString());
        } finally {
            dataBase.endTransaction(); // 處理完成
            dataBase.close();
            db.close();
        }

7.數據庫的封裝

單例模式

public class SingletonC {  

/** 
    * 單例對象實例 
     */  
    private static SingletonKerriganD instance = null;  
  
    public static SingletonC getInstance() {  
       if (instance == null) {  
            synchronized (SingletonC.class) {  
               if (instance == null) {  
instance = new SingletonC();  
}  
}  
      }  
        return instance;  
}  
}  


源碼鏈接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容