package com.example.sqltest;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
public class MyDataBaseHelper extends SQLiteOpenHelper{
private Context myContext; //构造函数里的Context
private SQLiteDatabase mydb;
/*
* SQLite关系数据库里的SQL语句:
* 整形:integer
* 浮点型:real
* 文本型:text
* 二进制型:blob
* SQLiteOpenHelper的getReadableDatabase()方法调用后才会执行onCreate()或onUpgrade(),而
* 不是构建时候调用
*/
//创建语句一般预设为public且static,外部通过类名可直接修改调用(便于数据库修改)
public static String createBook="create table Book(id integer primary key autoincrement,"
+ "author text,price real,pages integer,name text)";
public static String createBookBuyer="create table BookBuyer(name text,age integer)";
public MyDataBaseHelper(Context context, String name, CursorFactory factory, int version) {
//name为数据库名字,version为创建或打开的数据库版本号(极其重要),当传入版本号高于已存在
//版本号时,会自动调用onUpgrade()方法而不是onCreate()方法
super(context, name, factory, version);
myContext=context;
}
//第一次安装程序创建数据库时调用onCreate()方法
@Override
public void onCreate(SQLiteDatabase db) {
/**
* 这个方法
* 1、在第一次打开数据库的时候才会走
* 2、在清除数据之后再次运行-->打开数据库,这个方法会走
* 3、没有清除数据,不会走这个方法
* 4、数据库升级的时候这个方法不会走
*/
db.execSQL(createBook);
//db.execSQL(createBookBuyer);
mydb=this.getReadableDatabase();
Toast.makeText(myContext, "Successful Create!!",Toast.LENGTH_LONG).show();
}
//升级数据库时调用onUpgrade()方法,一般在数据库增添表,修改表结构等升级操作使用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
/**
* 1、第一次创建数据库的时候,这个方法不会走
* 2、清除数据后再次运行(相当于第一次创建)这个方法不会走
* 3、数据库已经存在,而且版本升高的时候,这个方法才会调用
*/
//若此时数据库旧版本号(即已传入版本)为1,2版本增加了createBookBuyer此时会调用onUpgrade()
//switch对旧版本号进行判断,依次升级数据库版本,不加break可升到最高级
switch(oldVersion) {
case 1:db.execSQL(createBookBuyer);
//如第二次版本若要修改已有Book表结构,应修改createBook的sql语句保证首次创建数据库准确
//然后再修改onUpgrade()里的switch语句添加新的列
//case 2:db.execSQL("alert table Book add column cost integer");
mydb=this.getReadableDatabase();
}
}
public void insert_delete_update(String sql,String[] str) {
mydb=this.getReadableDatabase();
startAffair();
mydb.execSQL(sql,str);
affairSuccessful();
endAffair();
}
//查询函数的sql语句允许使用?表示未知参数,未知参数在obj数组里依次给出
//也可以使用完整sql语句,第二个参数设为空即可
public List<Book> select(String sql,String[] obj) {
mydb=this.getReadableDatabase();
startAffair();
ArrayList<Book> result=new ArrayList<Book>();
Cursor cursor=mydb.rawQuery(sql,obj);
if(cursor.moveToFirst()) {//如果移动到数据表第一行不为空
do {
Book tableClass=new Book();
tableClass.setId(cursor.getInt(cursor.getColumnIndex("id")));
tableClass.setPages(cursor.getInt(cursor.getColumnIndex("pages")));
tableClass.setAuthor(cursor.getString(cursor.getColumnIndex("author")));
tableClass.setName(cursor.getString(cursor.getColumnIndex("name")));
tableClass.setPrice(cursor.getDouble(cursor.getColumnIndex("price")));
result.add(tableClass);
}while(cursor.moveToNext());
}
cursor.close();
affairSuccessful();
endAffair();
return result;
}
//开始事务
public void startAffair() {
mydb.beginTransaction();
}
//事务成功(设置成功会在结束事务时提交事务,否则就会回滚事务)
public void affairSuccessful() {
mydb.setTransactionSuccessful();
}
//结束事务
public void endAffair() {
mydb.endTransaction();
}
}