Android数据库

SQliteOpenHelper

首先封装一个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语句。.

SqliteDatabase

这个类是安卓官方提供的对数据库进行操作的类,里面我们主要用到四个基本的方法: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();

    }
}

insert

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{
    //添加失败
    }

delete

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{
    //删除失败
    }

update

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

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);