Android为我们提供了一个SQLiteOpenHelper帮助类来帮助我们方便地管理数据库。不过SQLiteOpenHelper是一个抽象类,我们需要建立一个自己的类去继承它,并且重写它的onCreate(),onUpgrade()方法,在这两个方法里面去写创建,升级数据库的逻辑。
getReadableDatabase(),getwriteableDatabase()都可以创建或者打开一个现有的数据库(如果数据库已经存在则直接打开,否则就自己创建一个数据库),不过,当数据库不可写入的时候,getReadableDatabase()方法只能以只读的方式打开数据库,而getwriteableDatabase()方法将会出现错误。
public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final String CREAT_BOOK="creat table book ("
+"id integer primary key autoincrement,"
+"author text,"
+"price real,"
+"pages integer,"
+"name text)";
private Context mContext;
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
this.mContext = mContext;
}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(CREAT_BOOK);
Toast.makeText(mContext,"Create suceeded",Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
}
}
这里,我新建一个MyDatabaseHelper类继承SQLiteOpenHelper抽象类,并且重写了一个构造方法。这里我简单说下构造方法里面的各个参数:第一个是Context,第二个是数据库的名字,第三个是参数允许我们在查询数据时返回一个Cursor,一般传入null,第四个参数表示数据库的版本号;这里我们还把建表语句定义成一个字符串常量;接着我们在onCreate()方法里面调用execSQL()方法去执行这条建表语句,弹出一个Toast.
贴上XML代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/create_database"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Create database"/>
</LinearLayout>
贴上MainActivity中的代码
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper=new MyDatabaseHelper(getApplicationContext(),"BookStore",null,1);
Button createDatabase=(Button)findViewById(R.id.create_database);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dbHelper.getReadableDatabase();
}
});
}
}
这样运行之后,数据库就建立成功了。
数据库的升级
在上文中,我们并没有在MyDatabaseHelper中重写onUpgrade()方法,这个方法是用于对数据库的升级的。
接下来,我们需要往数据库里面再添加一个表,在MyDatabaseHelper里面添加
public static final String CREATE_CATEGORY="create table Category("
+"id integer primary key autoincrement,"
+"category_name text,"
+"category_code integer)";
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(CREAT_BOOK);
db.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext,"Create suceeded",Toast.LENGTH_SHORT).show();
}
不过如果我们已经运行过上面的例子之后,那么此时我们再次运行可能发现我们结果并不会像我们想的那样,什么原因呢?原因在于此时已经存在数据库了(我们第一次运行创建的数据库)。所以我们点击Button按钮,MyDatabaseHelper里面的onCreate()方法都不会再执行了。这时候我们就需要运行SQLiteOpenHelper的升级功能了。修改代码如下
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(CREAT_BOOK);
db.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext,"Create suceeded",Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
}
我在onUpgrade()方法中执行了两条DROP语句,如果发现数据库里面已经存在Book表或者Category表,那么就把它给删除,然后在执行onCreate()方法。