Android SQLite簡單使用

一直都是用的數據庫框架,今天覆習的時候忽然發現好像不怎麼會使用SQLite了,複習一下吧。

首先繼承創建一個SQLite輔助類SqlHelper,繼承SQLiteOpenHelper

一、SQLiteOpenHelper

public class SqlHelper extends SQLiteOpenHelper {
    //數據庫名
    private static final String DB_NAME = "test_db";
    //數據庫版本
    private static final int DB_VERSION = 1;

    public static SqlHelper instance;

    public static SqlHelper getInstance(){
        if (instance == null){
            instance = new SqlHelper(MyApp.context);
        }
        return instance;
    }

    /**
     * @param context 上下文
     *                數據庫名稱
     *                數據庫遊標工廠類(可選)
     *                數據庫版本
     */
    public SqlHelper(@Nullable Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }


    @Override
    public void onCreate(SQLiteDatabase db) {
        //創建教師表
        db.execSQL(TeacherTable.CREATE_TABLE);
        //創建學生表
        db.execSQL(StudentTable.CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String drop = "DROP TABLE IF EXISTS ";
        //drop older table existed
        db.execSQL(drop + StudentTable.TABLE_NAME);
        db.execSQL(drop + TeacherTable.TABLE_NAME);

        onCreate(db);
    }

    /**
     * 插入
     *
     * @param tableName 表名
     * @param values
     * @return 插入是否成功
     */
    public boolean insert(String tableName, ContentValues values) {
        SQLiteDatabase db = this.getWritableDatabase();
        long res = db.insert(tableName, null, values);
        return res != -1;
    }

    /**
     * 根據ID刪除
     * @param tableName 表名
     * @param id
     * @return
     */
    public boolean delete(String tableName, String id) {
        try {
            SQLiteDatabase db = this.getWritableDatabase();
            db.delete(tableName, "id = ?", new String[]{id});
            return true;
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 根據條件刪除
     * @param tableName
     * @param where
     * @param args
     * @return
     */
    public boolean delete(String tableName, String where, String[] args) {
        try {
            SQLiteDatabase db = this.getWritableDatabase();
            db.delete(tableName, where, args);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 修改
     * @param tableName
     * @param id
     * @param values
     * @return
     */
    public boolean update(String tableName, String id, ContentValues values) {
        try {
            SQLiteDatabase db = this.getWritableDatabase();
            db.update(tableName, values, TeacherTable.COLUMN_ID + " = ? ", new String[]{id});
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("tag","update Exception: " + e.toString());
        }
        return false;
    }

    /**
     * 查詢
     * @param tableName
     * @param columns
     * @param selection
     * @param selectionArgs
     * @return
     */
    public Cursor query(String tableName, String[] columns, String selection, String[] selectionArgs) {
        try {
            SQLiteDatabase db = this.getReadableDatabase();
            Cursor cursor = db.query(tableName, columns, selection, selectionArgs, null, null, null);
            return cursor;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 根據ID查詢
     * @param tableName
     * @param id
     * @return
     */
    public Cursor rawQuery(String tableName, String id) {
        try {
            SQLiteDatabase db = this.getReadableDatabase();
            Cursor cursor = db.rawQuery("SELECT * FROM " + tableName + " WHERE ID = " + id, null);
            return cursor;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 查詢Sql語句
     * @param sql
     */
    public void rawQuery(String sql) {
        SQLiteDatabase db = this.getReadableDatabase();
        db.rawQuery(sql, null);
    }

}

除了構造方法、onCreateonUpgrade是必須的。其餘的增刪改查方式都是自己實現的。

二、創建表

onCreate方法中會執行表的創建操作:

    @Override
    public void onCreate(SQLiteDatabase db) {
        //創建教師表
        db.execSQL(TeacherTable.CREATE_TABLE);
        //創建學生表
        db.execSQL(StudentTable.CREATE_TABLE);
    }

爲了方便處理,這裏將表創建的sql語句拿到TeacherTableStudentTable類中了,每個類代表一張表。

這樣的好處是當不止一張表的時候,表的結構會比較清晰。如果只創建一張表的話,在SqlHelper中初始化即可。

TeacherTable

public class TeacherTable {
    //表名
    public static final String TABLE_NAME = "teacher";
    //列
    public static final String COLUMN_ID    = "id";
    public static final String COLUMN_NAME  = "name";
    public static final String COLUMN_GRADE = "grade";
    public static final String COLUMN_CLS   = "cls";

    //創建teacher表
    public static final String CREATE_TABLE = "CREATE TABLE "  //"CREATE TABLE IF NOT EXISTS "
            + TABLE_NAME + "("
            + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
            + COLUMN_NAME + " TEXT,"
            + COLUMN_GRADE + " TEXT,"
            + COLUMN_CLS + " TEXT"
            + ")";

    private int id;
    private String name;
    private String grade;
    private String cls;
}

StudentTable

public class StudentTable {

    //表名
    public static final String TABLE_NAME = "student";
    //列名
    public static final String COLUMN_ID = "id";
    public static final String COLUMN_NAME = "name";
    public static final String COLUMN_GRADE = "grade";
    public static final String COLUMN_CLS = "cls";

    //創建student表
    public static final String CREATE_TABLE = "CREATE TABLE "
            + TABLE_NAME + " ("
            + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
            + COLUMN_NAME + " TEXT,"
            + COLUMN_GRADE + " TEXT,"
            + COLUMN_CLS + " TEXT"
            + ")";

    private int id;
    private String name;
    private String grade;
    private String cls;
}

後面的增刪改查就是SQL語句的執行。

三、使用

1、增加

 	ContentValues values = new ContentValues();
    values.put(TeacherTable.COLUMN_NAME, mTeachName);
    values.put(TeacherTable.COLUMN_GRADE,"1");
    values.put(TeacherTable.COLUMN_CLS,"3");
    values.put(TeacherTable.COLUMN_ID, id);
    mSqlHelper.insert(TeacherTable.TABLE_NAME, values);

mTeachName是隨便輸入的字符串

2、刪除

mSqlHelper.delete(TeacherTable.TABLE_NAME,TeacherTable.COLUMN_NAME + " = ?", new String[]{mTeachName});

這裏面是根據姓名刪除的,當然也可以根據ID刪除。

3、修改

   ContentValues contentValues = new ContentValues();
   contentValues.put(TeacherTable.COLUMN_NAME, "張三");
   contentValues.put(TeacherTable.COLUMN_GRADE, "9");
   contentValues.put(TeacherTable.COLUMN_CLS, "13");
	// contentValues.put(TeacherTable.COLUMN_ID, 111);
   mSqlHelper.update(TeacherTable.TABLE_NAME, "1", contentValues);

根據ID修改,也可以把ID成新的修改。

4、查詢

    	Cursor cursor = mSqlHelper.query(TeacherTable.TABLE_NAME,null,"name = ?", new String[]{mTeachName});
        if (cursor == null){
            return;
        }
        cursor.moveToFirst();
        StringBuffer sb = new StringBuffer();
        while (!cursor.isAfterLast()){
             sb.append("ID:" + cursor.getInt(cursor.getColumnIndex(TeacherTable.COLUMN_ID))
                    + " name:" + cursor.getString(cursor.getColumnIndex(TeacherTable.COLUMN_NAME))
                    + " grade:"+ cursor.getString(cursor.getColumnIndex(TeacherTable.COLUMN_GRADE))
                    + " cls: " + cursor.getString(cursor.getColumnIndex(TeacherTable.COLUMN_CLS))
                    + "\n"
             );
             cursor.moveToNext();
        }
        cursor.close();	
 

上面是根據姓名查詢。

總結

當創建好SQLiteOpenHelper的實現類,並執行構造方法創建數據庫,執行onCreateonUpgrade。後面的增刪改查基本就是SQL語句的執行了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章