通過SQLiteOpenHelper類可以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的創(chuàng)建和升級(jí)录语。首先,SQLiteOpenHelper是一個(gè)抽象類,如果要使用這個(gè)類毡惜,只能通過創(chuàng)建一個(gè)幫助類去繼承他。這個(gè)抽象類中有兩個(gè)抽象方法斯撮,onCreate()和onUpgrade()经伙,我們需要在自己的類中實(shí)現(xiàn)并重寫這兩個(gè)方法,然后在這兩個(gè)方法中去創(chuàng)建和升級(jí)數(shù)據(jù)庫的邏輯吮成。
SQLiteOpenHelper類中還有兩個(gè)非常重要的實(shí)例方法橱乱,getWritableDatabase()和getReadableDatabase(),這兩個(gè)方法都能夠創(chuàng)建或者打開一個(gè)現(xiàn)有的數(shù)據(jù)庫粱甫,并返回一個(gè)可對(duì)數(shù)據(jù)庫進(jìn)行讀寫操作的對(duì)象泳叠,當(dāng)磁盤空間已經(jīng)滿的時(shí)候,getReadableDatabase()方法返回的對(duì)象將以只讀的方式打開數(shù)據(jù)庫茶宵,getWritableDatabase()方法將出現(xiàn)異常危纫。
SQLiteOpenHelper類有兩個(gè)可以用的構(gòu)造方法,一般用參數(shù)比較少的那個(gè)乌庶。
SQliteOpenHelper(Context context,"databasename",null,"version of database"){}
實(shí)例
創(chuàng)建一個(gè)名為book的數(shù)據(jù)庫
- 新建一個(gè)類繼承自SQLiteHelper种蝶,要重寫里面的主要方法,同時(shí)在onCreate()方法中執(zhí)行SQL語句瞒大。
package ouc.b304.com.sqlitetest;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class MySQLite extends SQLiteOpenHelper {
private static final String TAG="DATABASE";
private static final String CREATETABLE="create table book("+" id integer primary key autoincrement,"+"author text"+"price real"+"pages integer"+"name text)";
public MySQLite(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATETABLE);
Log.d(TAG,"is created");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
- 在MainActivity中實(shí)現(xiàn)布局和邏輯
package ouc.b304.com.sqlitetest;
import android.database.sqlite.SQLiteOpenHelper;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.btn_createdatabase);
final SQLiteOpenHelper myHelper = new MySQLite(getApplicationContext(), "book", null, 1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myHelper.getWritableDatabase();
}
});
}
}
- 在實(shí)例化自己的SQLiteHelper類以后螃征,要通過getWritableDatabase()方法才能得到數(shù)據(jù)庫實(shí)例。
- 如果數(shù)據(jù)庫已經(jīng)成功創(chuàng)建透敌,那么再次點(diǎn)擊創(chuàng)建的時(shí)候盯滚,數(shù)據(jù)庫不會(huì)重復(fù)創(chuàng)建。
對(duì)數(shù)據(jù)庫進(jìn)行升級(jí)
如果想要在數(shù)據(jù)庫中再次添加一張表酗电,可以通過在自建SQLiteHelper類中的onUpgrade()方法中添加邏輯實(shí)現(xiàn)魄藕,并不能在onCreate()方法中添加邏輯實(shí)現(xiàn)新表的創(chuàng)建,同時(shí)應(yīng)該在onUpgrade()方法中進(jìn)行邏輯的判斷撵术,因?yàn)榍疤崾菙?shù)據(jù)庫的表從來沒有新建過背率,如果一旦onCreate()方法執(zhí)行過一次之后,那么再次修改onCreate()方法是無用的嫩与。
如果想實(shí)現(xiàn)數(shù)據(jù)庫的升級(jí)寝姿,應(yīng)當(dāng)在MainActivity中創(chuàng)建MyHelper實(shí)例的時(shí)候把versioncode更改為比1大的數(shù)。