Android数据库基础用法

来源:互联网 发布:韩国聊天软件talk 编辑:程序博客网 时间:2024/06/07 16:54

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);
0 0
原创粉丝点击