准备工作:
自己建立一个类继承SQLiteOpenHelper类,这样就相当于你不费吹灰之力就继承了父类的一些属性和方法。
public class DBHelper extends SQLiteOpenHelper{
然后在你自己创建的类DBHelper中要重写这两个方法:
第一个方法可以在里面写一些创建表的操作(我记得onCreate方法好像必须主动调用,就算第一次初始化DBHelper也不会执行,要是想知道的话最好打印Log看下),第二个方法是在数据库升级后的回调,我其实这两个方法都没有使用。
构造方法: 必须有四参那个
然后这个类里你可以封装一些对表的操作,增删改查然后传等等,然后通过在别的类里对DBHelper实例化使用其对象调用这些方法,但是由于我需要操作感觉太多重复,没复用多少。
关于运行哪个线程:可以在多线程中,并且同步问题SQLiteDatabase帮你实现了!!
它的同步策略:
1.引用计数和ThreadLocal完成的
2.每个线程持有一个数据库连接(不一定创建,有数据库连接池的优化)
3.数据库会给主线程持有的连接提高优先级。
(具体了解还需要自行分析,这个我只是简单了解了一下需不需要同步)
下来看具体操作吧:
首先不管做什么操作之前都需要一个SQLiteDatabase对象,它可以通过DBHelper获取:
//this是DBHelper对象
//获取相关操作需要的读/写类型的 SQLiteDatabase 对象
SQLiteDatabase database = this.getWritableDatabase(); //写
SQLiteDatabase database = this.getReadableDatabase(); //读
创建表:
方式一:
//通过sql语句
SQLiteDatabase db = dbHelper.getWritableDatabase(); //写
// 语句格式:"create table 表名(字段名 类型,字段名 类型,...)"
// 注意','后没空格
String sql = "create table search(title varchar(40))";
db.execSQL(sql);
应该还有别的方式,不过用的好像不多,我也没用过,所以就不写了
删除表:
public void deleteTable(String tableName){
SQLiteDatabase database;
database = this.getWritableDatabase(); //写
//先判断存在再删
if(IsTableExist(tableName,database)){
//sql语句格式:"drop table "+tableName
String sql = "drop table "+tableName;
database.execSQL(sql);
}
}
判断表是否存在
@SuppressLint("Recycle")
public boolean IsTableExist(String tabName, SQLiteDatabase db) {
boolean result = false;
if (tabName == null) {
return false;
}
Cursor cursor = null;
//sql语句格式:如下一致
String sql = "select count(*) as c from sqlite_master where type ='table' and name ='"
+ tabName.trim() + "' ";
cursor = db.rawQuery(sql, null);
//判断是否有下一个
if (cursor.moveToNext()) {
int count = cursor.getInt(0);
if (count > 0) {
result = true;
}
}
return result;
}
清空表
public void deleteTable(SQLiteDatabase db){
db.execSQL("delete from tableName");
}
添加一条数据:
方式一:
// sql语句:"insert into search (title) values(?)"
// "insert into 表名 (字段名) values(?)"
// 第二个参数:字段集合
public void addOneDate(String sql,Object[] params){
SQLiteDatabase database;
database = this.getWritableDatabase();
database.execSQL(sql,params);
}
方式二:
public void addOneHistoryRecord(){
//获取搜索框文字
String text = searchEditTextView.getText().toString();
//主要靠这个contentValues对象存储.<key,value>形式
ContentValues contentValues = new ContentValues();
contentValues.put("title", text);
contentValues.put("tag",tableName);
//写
dbHelper.getWritableDatabase()
.insert("history",null,contentValues);
//后面这些逻辑和添加数据无关
historyList.add(new DBDataBean(text,tableName));
updateHistory();
historyRecAdapter.notifyDataSetChanged();
}
删除和某条件相关所有数据:
方式一:
//第一参数:表名
//第二参数:根据哪个字段名来删除数据 如:"title"←这是一个字段名
//第三参数:上面那个字段名对应具体数据集合如:{"我要删除这句话"}
//然后就会删除title="我要删除这句话"的所有数据
public void deleteDate(String tableName,String columnName,Object[] params){
SQLiteDatabase database;
String sql = "delete from "+tableName+" where "+columnName+"=?";
database = this.getWritableDatabase();
database.execSQL(sql,params);
}
方式二:
public void delete(String name) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
//参数列表:表名,条件,具体数据列表
db.delete("person", "name=?", new String[]{name});
}
查询和某条件相关所有数据:
查询有很多方式,尤其是模糊查询,有很多方式。
public void queryHistoryTable(String tableName ,String[] columnNames,String keyName,String key){
SQLiteDatabase database;
database = this.getReadableDatabase(); //读
Cursor cursor = database.query(tableName
,columnNames
//这是一个模糊查询,包含key字符串用这个" LIKE"+" '%"+key+"%'"
//注意空格!!
,keyName+" LIKE"+" '%"+key+"%'"
,null //
,null //
,null //
,null); //
historyList.clear();
//下面操作是从cursor中取数据
//cursor.getString(0)取出同一条数据的第一字段值
//cursor.getString(1)取出同一条数据的第二字段值
//注意:上面字段必须是第二个参数String[] columnNames中有的字段
//cursor.moveToNext()移向下一条数据
for(int i =0 ; i< 20&& cursor.moveToNext(); i++){
historyList.add(new DBDataBean(cursor.getString(0),cursor.getString(1)));
Log.e("query_his",""+cursor.getString(0));
}
}
更新某条件相关的数据
public void updateDate(String tableName,String columnName,Object[] params){
SQLiteDatabase database;
String sql = "update "+tableName+" set "+columnName+"=? where "+columnName+"=?";
database = this.getWritableDatabase(); //写
database.execSQL(sql);
}