创建数据库需要继承SQLiteOpenHelper,并且手动实现构造方法:传入上下文对象,实现在activity创建对象
public DBHelper(Context context){
//需要super的构造方法,实现数据库信息的设置
/**
* 参数1:Context 用于访问应用内部存储区,数据库默认放在此处
* 参数2:创建或打开数据看的文件名称
* 参数3:用于在获取数据时,返回游标cursor的工厂,对于sqlite,可以为null
* 参数4:当前应用程序对应的数据库最新的版本号,这个版本可能与数据库文件中的版本不同
*/
super(context,"app.db",null,1);
}
/**
*当第一次程序进行数据库创建之后,会调用这个方法,用于创建数据库表及初始化数据;
* 当数据库创建成功,这个方法就不会再执行了,除非数据库清空;
* @param db 创建好的数据库对象
*/
@Override
public void onCreate(SQLiteDatabase db) {
//1,在库中创建表
db.execSQL(CREATE_STUDENTS);
db.execSQL(CREATE_TEACHER);
}
/**
* 当数据库版本提高之后,就需要回调这个方法,系统自动回调
* @param db
* @param oldVersion 数据库文件中当前的版本信息
* @param newVersion 构造方法中,指定的版本信息
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d("dbhelper",""+oldVersion+","+newVersion);
// TODO: 通常在这个方法添加、修改、删除数据库表
if(newVersion==3){
//3代表添加教师表
db.execSQL(CREATE_TEACHER);
}else if(newVersion==4){
//代表向teachrers添加email字段
db.execSQL(UP_TEACHERS_V4);
}
}
SQLiteOpenHelper的子类创建完成之后,实现数据库的连接:
1)在activity中创建该子类的对象,并且传入上下文参数this,用于打开数据库,没有会自动创建,
2)利用该子类对象调用getWritableDatabase()方法,获取数据库的可读写的对象,当此方法第一次调用时,会自动创建数据库对象,打开数据库,并回调子类当中onCreate方法;
3)返回的SQLiteDatabase类型的对象,就可以对数据库进行增删改查的操作
这样就完成了数据库的连接;
注意事项:
默认情况下,onCreate方法,应该创建内容和构造方法中指定版本号代表的内容一致,因为有可能用户以前没有执行过
程序,自定创建数据库,因此要包含onUpgrade的对应版本操作;
默认不要依赖于onUpgrade,onUpgrade主要针对旧版本升级用的;
通常onUpgrade在内部不建议删除表(drop table),否则用户数据就没了;可以采用给数据库表添加字段的形式,进行扩展
增:
long l = db.insert("students", null, values);
参数1:将要添加数据的数据表;
参数2:可以为null,当参数3(values)为null,或values的尺寸为0时,API就会主动使用第二个参数的名称作为列名来拼接SQL语句;
参数3:要填添加的数据,添加记录需要使用到ContentValues,可以认为是hashmap:
ContentValues values = new ContentValues();
values.put("name",name);
values.put("age",age);
返回值:如果添加成功会返回一个Long类型的数值,如果添加失败会返回-1;
删:
int num = db.delete(
"students", //将要添加数据的数据表
null, //where条件,可包含“?”
null //String[]条件参数
);
返回值:返回删除的数目,0代表没删除
改:
ContentValues values = new ContentValues();
values.put("age",18);
int num = db.update(
"students",
values, //更新数据需要ContentValues,内部放的是update的set部分的字段和数据
"id = ?",
new String[]{"5"}
);
查:
Cursor cursor = db.query(
"students", // table
new String[]{"id as _id","name"}, //column,如果该参数部位null,则必须要加上_id这个字段
null, //where
null, //数组中的元素,对应的是selection中对应的位置
null, // group by
null, // having
null // order by
);
if(cursor!=null){
//bianli cursor中的结果
int count = cursor.getCount();//获取记录总数
Log.d("MainActivity","count"+count);
int columnCount = cursor.getColumnCount();//获取每行列的数量
Log.d("MainActivity","columnCount"+columnCount);
String[] columnNames = cursor.getColumnNames();//获取每列的列名
Log.d("MainActivity","columnNames"+ Arrays.toString(columnNames));
while(cursor.moveToNext()){ //使用while循环,每次移动一行,进行数据获取
//进行一条记录的获取
int index = cursor.getColumnIndex("name");
if(index>-1){
String string = cursor.getString(index);
//Toast.makeText(this,string,Toast.LENGTH_SHORT).show();
}
index = cursor.getColumnIndex("_id");
if(index>-1){
int anInt = cursor.getInt(index);
Toast.makeText(this,""+anInt,Toast.LENGTH_SHORT).show();
}
}
query.close();
}