首先封装一个SQliteOpenHelper,这是安卓的数据库帮助类,一般建表和封装增删改查方法等工作都放在这个里面
public class LocalDataHelper extends SQLiteOpenHelper{
public static final String detail_customer_table = "detail_customer";//定义一个静态的常量表示表名
//设计一张表
private String createSimple = "create table "+simple_customer_table+"(" +
"id INTEGER(20) primary key ," + //默认id
"name varchar2(20)," + // 客户姓名
"phone varchar2(20)," + // 手机号
"createTime varchar2(20)" + // 创建时间
");";
//构造方法
public LocalDataHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(createSimple );//新建一张表
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
这样一个SQLiteOpenHelper就重写好了,在我们自定义的这个SQLiteOpenHelper里我们设计了一张表detail_customer,包含四个字段id(主键),name,phone,createTime,要注意每个字段之间要用“,”隔开,execSQL()这个方法是SQLiteDatabase的一个方法,是执行括号里面的SQL语句。.
这个类是安卓官方提供的对数据库进行操作的类,里面我们主要用到四个基本的方法:insert,delete,update,query。也就是最基础的增删改查四个功能。
public class ClientActivity extends BaseActivity {
private LocalDataHelper helper;
private SQLiteDatabase database;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_client);
//通过构造方法新建一个数据库info_input_db
helper = new LocalDataHelper(this, "info_input_db", null, 1);
database = helper.getWritableDatabase();
}
}
public long insert(String table, String nullColumnHack, ContentValues values)
insert方法带有三个参数,table:表名,values:ContentValues 类型参数集合,nullColumnHack:如果values为空的话,除主键外其他字段设置的默认值,一般我们都个这个参数传一个null。
在使用这个方法时,我们一般先创建一个ContentValues对象来添加数据,它的使用方法与Map基本相同:
ContentValues cv = new ContentValues();
cv.put("id","01");
cv.put("name ","Android");
cv.put("phone ","13390000000");
cv.put("createTime ","2017-03-14");
insert方法的返回值是一个long类型的数,它的值是你这个语句添加的数据的行的id,也就是你的数据添加到了第几行,所以只要返回值大于0,就是插入成功了
long result = database .insert(LocalDataHelper.detail_customer_table,null,cv);
if(result > 0){
//添加成功
}else{
//添加失败
}
public int delete(String table, String whereClause, String[] whereArgs)
同样delete方法也有三个参数 table:表名,whereClause:可选的where语句,whereArgs:whereClause语句中表达式的?占位参数列表。
whereClause参数一般为“列名=?”这种形式,例如:id=?,而whereArgs是一个String类型的数组,直观的我们可以new一个String[]:
delete的返回值是一个int类型,代表的含义一般为删除的行数(官方解释为如果whereclause通过受影响的行数),如果删除全部的话返回值为1,删除失败一般返回0
int result = database .delete(LocalDataHelper.detail_customer_table,"id=?",new String[]{"1","2"});//删除ID为1和2 的两条数据
if(result > 0){
//删除成功
}else{
//删除失败
}
public int update(String table, ContentValues values, String whereClause, String[] whereArgs)
update方法有四个参数 table:表名,values:你需要修改的字段和值,whereClause:可选的where语句,whereArgs:whereClause语句中表达式的?占位参数列表。
这里的参数使用方法和insert与delete里面同名参数用法一样,值得注意的是,这里的values可以就修改整条数据中的某几个字段,不修改的字段可以不放进去。
返回值是一个int值,一般表示受影响的行数,也就是修改成功的行数
ContentValues cv = new ContentValues();
cv.put("name ","ios");
cv.put("phone ","13390005000");
cv.put("createTime ","2016-03-14");
int result = db.update(table,cv,"id=?",new String[]{"1"}
if(result > 0){
//修改成功
}else{
//修改失败
}
query方法在官方API中有四种,在这里我们只介绍最简单的两种,至于其他的两种方法详见官方API
public Cursor query(String table, String[] columns, String selection,
String[] selectionArgs, String groupBy, String having,
String orderBy)
public Cursor query(String table, String[] columns, String selection,
String[] selectionArgs, String groupBy, String having,
String orderBy, String limit)
query第一个方法有7个参数,table:要查询的表名;columns:想要显示的列;selection:where子句;selectionArgs:where子句对应的条件值;groupBy:分组方式;having:having条件;orderBy:排序方式;然而第二种方法仅仅多了一个参数 limit:限制返回的记录的条数
虽然query方法参数多,但是如果你简简单单的要检索全部数据,除了表名其他参数都可以为空
这里说一下这个返回值,返回值类型是一个Cursor类型,使用方法比较复杂,也比较烦,网上有些博客介绍的方法,先moveToFirst(),然后while(cursor.moveToNext){} 这种方式在我做项目的时候出现过一些问题,就是第一条自动给pass了,所以我一般采用do{}while(cursor.moveToNext)
Cursor cursor = database.query(LocalDataHelper.detail_customer_table,null,null,null,null,null,null);
List<Map<String,String>> list = new ArrayList<>();
cursor.moveToFirst();
if (cursor.getCount() != 0){ //判断cursor有多少个数据,如果没有就不要进入循环了
do {
String id = cursor.getString(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
String createTime = cursor.getString(cursor.getColumnIndex("createTime"));
Map<String,String> map = new HashMap();
map.put("id ",id );
map.put("name ",name );
map.put("phone ",phone );
map.put("createTime ",createTime );
list.add(map);
}
}while(cursor.moveToNext());
}
Cursor的用法比较烦,一般要使用Android封装的API方法去是Cursor移动,首先用moveToFirst()方法移动到第一个的位置,然后用getColumnIndex()方法获取对应字段的索引,在使用getString()方法获取对应索引的值,这才把第一个Cursor里的一个字段拿出来,然后反复用这种方法把所有的字段拿出来之后,调用moveToNext()方法移动到下一个位置,如此循环拿出所有的数据。
上面提到的增删改查方法的封装,如果大家有兴趣,可以根据个人需要封装,通常我都是根据实际情况进行封装,例如这样:
/**
* 查询信息
* @param db SQLiteDatabase
* @param table 表名
* @return 查询出来的Cursor
*/
public Cursor query(SQLiteDatabase db, String table){
return db.query(table,null,null,null,null,null,null);
}
把这个方法放到自定义的SqliteOpenHelper里,这样调用的时候,就不用去写那么一堆null了,还可以在外面注释上参数都是什么,提升代码的整洁性。
Cursor cs = helper.query(database,LocalDataHelper.detail_customer_table);