一直都是用的數據庫框架,今天覆習的時候忽然發現好像不怎麼會使用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);
}
}
除了構造方法、onCreate
和onUpgrade
是必須的。其餘的增刪改查方式都是自己實現的。
二、創建表
在onCreate
方法中會執行表的創建操作:
@Override
public void onCreate(SQLiteDatabase db) {
//創建教師表
db.execSQL(TeacherTable.CREATE_TABLE);
//創建學生表
db.execSQL(StudentTable.CREATE_TABLE);
}
爲了方便處理,這裏將表創建的sql語句拿到TeacherTable
和StudentTable
類中了,每個類代表一張表。
這樣的好處是當不止一張表的時候,表的結構會比較清晰。如果只創建一張表的話,在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
的實現類,並執行構造方法創建數據庫,執行onCreate
和onUpgrade
。後面的增刪改查基本就是SQL語句的執行了。