Android 开发中实际使用sql语句不多,那么android就提供了一个"叉叉"helper的类:SQLiteOpenHelper,但是开发人员是通过继承这个类来实现对数据进行操作的.
步骤如下:
<0> : 定义一个管理数据管理类:
public class SQLManager { public static final String SQ_LITE_DATABASE_TABLE="tsql"; public static final String SQL_TABLE_CREATE="create table "+SQ_LITE_DATABASE_TABLE+"{" + "id INTEGER PRIMARY KEY AUTOINCREMENT,user TEXT,password TEXT,nickname varchar(20) }"; public static final String SQL_DROP_EXSIT_TABLE="drop table if exist tsql"; public static final String TABLE_ID_FIELD="id"; public static final String TABLE_USER_FIELD = "user"; public static final String TABLE_PASSWORD_FIELD = "password"; public static final String TABLE_NICKNAME_FIELD = "nickname"; }
<1> 先要新建一个几成SQLiteOpenHelper的类:
public class SQLHelper extends SQLiteOpenHelper{ }
<2> 这个新建的类还必须要有构造函数,数据库名和版本号可以构建中传入,也可以直接传入常量,如下面:
public SQLHelper(Context context){ super(context,DATABASE_NAME,null,DATABASE_VERSION); } public SQLHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub }
private static final String DATABASE_NAME="user_db"; private static final int DATABASE_VERSION=1;
<3> 在重载onCreate中创建或者打开数据库:
@Override public void onCreate(SQLiteDatabase sqldb) { // TODO Auto-generated method stub sqldb.execSQL(SQLManager.SQL_TABLE_CREATE); }
<4> 打开数据库后,即可以开始操作了,在操作之前需要认识一个类ContentValues,由于android提供封装好的操作方法,操作方法在插入更新数据时,需要开发人员现将一个集合的数据打好包,然后传入操作方法中,而APP的数据就要放大一个"包中",相当于一个中间人,那么ContentValues就起到打包或者说中间人的作用:
ContentValues cvs = new ContentValues();
用其打包数据:把数据放到指定的字段中即可:
cvs.put(SQLManager.TABLE_USER_FIELD, user);
cvs.put(SQLManager.TABLE_PASSWORD_FIELD, password);
cvs.put(SQLManager.TABLE_NICKNAME_FIELD, nickname);
其次操作数据时,要么就是读取数据,要么就是写入数据,一般情况下如果读取数据时,我们就获得读取数据库的对象就可以了,同样写入:
SQLiteDatabase sqldb=this.getReadableDatabase();
SQLiteDatabase sqldb = this.getWritableDatabase();
<5> : 执行插入操作数据:
public boolean insert(String user, String password, String nickname) { SQLiteDatabase sqldb = this.getWritableDatabase(); ContentValues cvs = new ContentValues(); cvs.put(SQLManager.TABLE_USER_FIELD, user); cvs.put(SQLManager.TABLE_PASSWORD_FIELD, password); cvs.put(SQLManager.TABLE_NICKNAME_FIELD, nickname); // public long insert(String table, String nullColumnHack, ContentValues // values) Long result = sqldb .insert(SQLManager.SQ_LITE_DATABASE_TABLE, null, cvs); if (result == -1) { return false; } else { return true; } }
<6> 执行更新操作:注意操作过程中条件的设置
public boolean update(String user, String password, String nickname) { SQLiteDatabase sqldb = this.getWritableDatabase(); String where = SQLManager.TABLE_USER_FIELD + "=?"; String whereargs[] = { user }; ContentValues cvs = new ContentValues(); cvs.put(SQLManager.TABLE_USER_FIELD, user); cvs.put(SQLManager.TABLE_PASSWORD_FIELD, password); cvs.put(SQLManager.TABLE_NICKNAME_FIELD, nickname); int result = sqldb.update(SQLManager.SQ_LITE_DATABASE_TABLE, cvs, where, whereargs); if (result == 0) { return false; } else { return true; } }
<7> 执行删除数据操作:
public boolean delete(String user) { SQLiteDatabase sqldb = this.getWritableDatabase(); String where = SQLManager.TABLE_USER_FIELD + "=?"; String whereargs[] = { user }; int result = sqldb.delete(SQLManager.SQ_LITE_DATABASE_TABLE, where, whereargs); if (result == 0) { return false; } else { return true; } }
<8> : 执行查询操作:
public void query(){ SQLiteDatabase sqldb=this.getReadableDatabase(); String columns[]={SQLManager.TABLE_USER_FIELD,SQLManager.TABLE_PASSWORD_FIELD,SQLManager.TABLE_NICKNAME_FIELD}; String orderby=SQLManager.TABLE_ID_FIELD; Cursor cr=sqldb.query(SQLManager.SQ_LITE_DATABASE_TABLE, columns, null, null, null, null, null); cr.moveToFirst(); while(!cr.isAfterLast()){ Log.i(TAG,"user : " + cr.getString(1) + " password : " + cr.getString(2)+" nickname : "+ cr.getString(3)); cr.moveToNext(); } }
这个里面query可以传递查询条件,一般这个方法可以这样写:需要返回游标,上面直接打印了.
public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
<9> 写完上面辅助操作数据库类,进入具体使用阶段:
private SQLHelper sqlhelper;
sqlhelper = new SQLHelper(this);
sqlhelper.insert(...)
....
具体的例子网上很多,个人觉得只要看得懂API,再要记住操作流程,当然实际上寡人是做了demo的.