SQLite的基本使用方法:
1.Android 提供了SQLiteOpenHelper类来对数据库进行创建和升级,所以写个子类继承他吧
SQLiteOpenHelper中有2个抽象方法,分别是onCreate和onUpgrade方法,我们必须在自己的帮助类里面重写这两个方法,
然后分别在这两个方法中实现创建,升级数据库的逻辑。SQLiteOpenHelper中还有2个非常重要的实例方法,
getReadableDatabase()和getWritableDatabase()方法。这两个方法都可以创建或打开一个现有的数据库
(如果数据库已经存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。
不同的是当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法方法将出现异常。
2.创建一个数据库
2.1.在android 数据库的创建中integer表示整形,real表示浮点型,text表示文本类型,blob表示二进制类型。下面开始创建一张数据表
在SQLiteOpenHelper 的子类MySQLiteHelper中
public static final String BOOK_TABLE="create table book ("
+ "id integer primary key autoincrement,"
+ "author text, "
+ "price real, "
+ "pages integer, "
+ "name text)";
然后在onCreate(SQLiteDatabase db){
db.execSQL(BOOK_TABLE);
}
2.2.Activity 中
//获得数据库操作类对象,
/*通过构造函数的参数
* 将数据库名指定为BookStore.db,版本号为1,然后在create database按钮的点击
* 事件里调用了getWritableDatabase()方法,这样当第一次点击create database按钮时
* 就会检测当前程序并没有BookStore.db这个数据库,于是会创建该数据库并调用MyDatabaseHelper
* 中的onCreate()方法,这样Book表也就得到了创建,然后会弹出一个Toast提示创建成功。再次点击
* create database按钮时,会发现此时已经存在BookStore.db数据库了,因此不会再创建一次了。
*/
dbHelper=new MyDatabaseHelper(this, "BookStore.db",
null, 1);
dbHelper.getWritableDatabase();
3.数据库的增删改查操作:SQLiteOpenHelper的getReadableDatabase()或getWritableDatabase()方法还都会返回一个SQLiteDatabase对象
db = sqliteHelper.getWritableDatabase();
3.1插入一条数据:
ContentValues values=new ContentValues();
values.put("name", "android第一行代码");
values.put("author", "jack");
values.put("pages", 500);
values.put("price", 18.98);
//values.put("category_id", 1111);
db.insert("book", null, values);//插入第一条数据
3.2删除一条数据:
//删除pages 等于500 的数据
db.delete("book", "pages=?", new String[]{"500"});
3.3修改数据库数据:
ContentValues values=new ContentValues();
values.put("price", 1500);
db.update("book", values, "name=?",
new String[]{"android第一行代码"});
3.4查询数据库:
Cursor cursor = db.query("book", null, null, null, null, null, null);
/*
* 调用moveToFirst()方法将数据的指针移动到第一行的位置,然后进入一个循环当中,去遍历查询到
* 的每一行数据。在这个循环中可以通过Cursor的getColumnIndex()方法取到某一列在表中对应的位置索引,
* 然后将这个索引传入到相应的取值方法当中,接可以得到从数据库中查询到的数据了。接着使用Log的方式将
* 取出来的数据打印出来,借此来检查一下读取工作有没有成功完成。最后别忘了调用close()方法来关闭Cursor。
* */
if(cursor.moveToFirst()){
do{
//遍历Cursor对象,取出数据并打印
String name=cursor.getString(cursor.getColumnIndex("name"));
String author=cursor.getString(cursor.getColumnIndex("author"));
int pages=cursor.getInt(cursor.getColumnIndex("pages"));
double price=cursor.getDouble(cursor.getColumnIndex("price"));
//打印数据
Log.e("MainActivity", "book name is "+name);
}while(cursor.moveToNext());
}
cursor.close();
4.数据库的升级在onUpgrade()判断版本号进行操作
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
switch (oldVersion) {
case 1:
db.execSQL(CATEGORY_TABLE);
case 2:
Log.e("SQLiteHelper","onUpgrade!!!!! ");
db.execSQL("alter table book add column category_id integer");
//db.execSQL("alter table book add column category_qqqqq integer");
default:
break;
}
}
查看SQLiteOpenHelper这个类,可以看到,在数据库的初始化中通过用户传递的参数
sqliteHelper = new MySQLiteHelper(this, "book.db", null, 2); 获取到最新的版本号,并与之前的版本号比较,默认为0 版本号为0那么久执行第一次创建数据库的操作,这是部分源码
final int version = db.getVersion();
if (version != mNewVersion) {
if (db.isReadOnly()) {
throw new SQLiteException("Can't upgrade read-only database from version " +
db.getVersion() + " to " + mNewVersion + ": " + mName);
}
db.beginTransaction();
try {
if (version == 0) {
onCreate(db);
} else {
if (version > mNewVersion) {
onDowngrade(db, version, mNewVersion);
} else {
onUpgrade(db, version, mNewVersion);
}
}
db.setVersion(mNewVersion);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
}
版本号不一致时,执行升级或者降级数据库版本。
switch中每个case的最后都是没有使用break的,这是为了保证在跨数据库版本升级的时候,每次的数据库修改都能被全部执行到。