在安卓中,系统提供了SQLite数据库供我们使用,增删改查四个基本功能是基本的,今天我就我学习中遇到的数据库的增加数据功能来做一个简单回复
SQLiteOpenHelper是一个系统提供的抽象类,我们通过写一个类继承这个抽象类,
以此获取一个数据库对象之后进行数据库操作
public class DBOpenHelper extends SQLiteOpenHelper {
private Context mContext;
public DBOpenHelper( Context context,String name,SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
//创建用户数据表
private static final String USERDB_CREATE =
"create table USERINFO ( USER_NAME varchar(15),USER_KEY varchar(20));";
//创建图书数据表
private static final String BOOKDB_CREATE = //将SQL语句封装成一个String文本
"create table BOOKINFO ( " +
"BOOK_ID integer primary key," +
"BOOK_NAME varchar(20)," +
"BOOK_WRITER varchar(20)," +
"BOOK_PUBLISHER varchar(20)," +
"BOOK_TOTALNUMBER integer," +
"BOOK_LEAVENUMBER integer)";
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(USERDB_CREATE); //数据库第一次创建时会执行这里面的语句
db.execSQL(BOOKDB_CREATE);
Toast.makeText(mContext,"数据表创建成功",Toast.LENGTH_LONG).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//数据库发生更新时会执行这里
}
}
当我们new一个DBOpenHelper时,系统会做出判断,如果该名称的数据库已经存在了,那么就会打开这个数据库,若该名称的数据库不存在,则会执行onCreate中的方法,创建一个数据库
日常使用中,我们需要new一个DBOpenHelper对象来对数据库进行操作
DBOpenHelper dbHelper = new DBOpenHelper(Context context,“DB_NAME.db”,null,1);
第一个参数:上下文对象
第二个参数:数据库名称(一定要以.db结尾)
第三个参数:公司名,一般使用null
第四个参数:版本号version
在实例化之后,我们就可以拿到一个SQLiteDataBase对象来对数据库做进一步操作了
SQLiteDataBase db = dbHelper.getReadableDatabase(); //获得一个可读数据库
SQLiteDataBase db = dbHelper.getWriterableDatabase(); //获得一个可写入数据库
注意:可写入的一般情况下都可以读取,而可读取的数据库不一定可以写入,
因此一般我们使用getWriterableDatabase这个方法来获得一个可写数据库
在获取了上面的db对象之后,我们就可以进行对数据库的增删改查了
使用ContentValues对象进行封装
ContentValues对象中使用put方法封装键值对数据
然后使用数据库对象的insert方法进行写入
ContentValues values = new ContentValues();
values.put("key",values); //这里的key使用要写入的数据表中的列名以及对应列的数据值
values.put("key2",values);
db.insert("USERINFO",null,values); //第一个值:数据表的名称
//第二个值:空白的列中填充的数据,一般为null
//第三个值:contentValues对象
//contentValues对象可以反复使用,只要调用clear方法即可清空,然后重新添加键值对数据
values.clear(); //清空contentva对象中的数据
同样的,使用上述的数据库对象db,可以再delete方法中指定删除条件
db.delete("BOOKINFO","BOOK_ID = ?",new String[]{String.valueOf(bookArrayList.get(position).ID)});
第一个参数:目标数据表名称
第二个参数:删除条件,其中?为占位符
低三个参数:占位符的具体内容,在这个例子中就是要删除BOOK_ID为指定ID的条目
在这里,使用update方法对数据进行更新,需要指定几个参数
需要再次使用ContentValues对象来存放修改后的数据的键值对数据,下面为一个例子
ContentValues values = new ContentValues();
values.put("BOOK_NAME",addname.getText().toString());
values.put("BOOK_WRITER",addwriter.getText().toString());
values.put("BOOK_PUBLISHER",addpublisher.getText().toString());
values.put("BOOK_TOTALNUMBER",addnumber.getText().toString());
values.put("BOOK_LEAVENUMBER",addnumber.getText().toString());
db.update("BOOKINFO",values,"BOOK_ID = ?",new String[] {addid.getText().toString()});
在这里我们将修改后的内容存放在values中,在调用update方法对指定数据表的指定对象进行数据的更新
查询数据是数据库操作中最简单的,只需要使用query方法以及指定条件即可返回一个cursor对象
cursor对象可以理解为SQL中的游标,在具体的操作之前,我们通常还需要对cursor进行判断是否为空
如果不判断,当数据库无法读得数据时,cusor对象就会为空,这是如果再做具体操作,就会出现空指针报错
Cursor cursor = db.query("BOOKINFO",null,null,null,null,null,null);
可以看到,调用query方法查询时会有整整七个参数
第一个参数:指定数据表的表名
第二个参数:查询字段名,null表示所有字段
第三个参数:查询条件,同样采用占位符 ?
第四个参数:占位符具体指,参数数组
第五个参数:查询结果按照指定字段分组,这里指定字段名
第六个参数:限定分组条件
第七个参数:查询结果排序条件
如需查询所有的数据,只需要2-7六个参数统一为null即可
返回cursor对象后判断cursor是否为空
if(cursor.getCount()!=0){ //判断当前返回的cursor是否为空
cursor.moveToFirst();
do{
int id = cursor.getInt(cursor.getColumnIndex("BOOK_ID"));
String name = cursor.getString(cursor.getColumnIndex("BOOK_NAME"));
String writer = cursor.getString(cursor.getColumnIndex("BOOK_WRITER"));
String publisher = cursor.getString(cursor.getColumnIndex("BOOK_PUBLISHER"));
int totalnumber = cursor.getInt(cursor.getColumnIndex("BOOK_TOTALNUMBER"));
int leavenumber = cursor.getInt(cursor.getColumnIndex("BOOK_LEAVENUMBER"));
Book book = new Book(id,name,writer,publisher,totalnumber,leavenumber);
bookArrayList.add(book);
}while (cursor.moveToNext());
}else{
Toast.makeText(this,"当前数据库中没有图书,请添加",Toast.LENGTH_LONG).show();
}
在if中先让cursor的游标移到第一位,然后开始遍历cursor读取数据,在实例化成一个个对象存放在ArrayList中供其它地方调用
一般我们可以把增删改查也封装成一个类,当需要进行对数据库的操作时,直接传参调用即可
以上仅为我个人学习数据库操作一周的总结,请大神不吝赐教