sqlite简介
sqlite是android中内置的一款轻量级的关系型数据库。支持标准的sql语法,还遵循数据库的ACID事务。
如何创建数据库
Android为了让我们能够更加方便的管理数据库,专门提供了一个sqliteOpenHelper帮助类,借助这个类就可以非常简单的对数据库进行创建和升级。我们可以自己创建一个类去继承它。sqliteOpenHelper中有两个抽象方法,分别是onCreate()和onUpgrade(),我们必须要在自己定义的类中重写这两个方法,然后分别在这个两个方法中创建、升级数据库的逻辑。
方法参数分析
public MyDataBaseHelper(Context context,String name,sqliteDatabase.CursorFactory factory,int version)
{
super(context,name,factory,version);
}
@Override
public void onCreate(sqliteDatabase db) {
}
@Override
public void onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {
}
sqliteOpenHelper中有两个构造方法,一般使用参数少的构造方法即可。
context:应用程序环境的信息,即上下文
name:数据库名称
factory:允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null
version:当前数据库的版本号
构建出sqliteOpenHelper的实例后,再调用它的getReadableDatabase()或getWritableDatabase()方法就能够创建数据库了。
具体实例
public class MyDataBaseHelper extends sqliteOpenHelper {
public static final String CREATE_BOOK="create table book("
+"id integer primary key autoincrement,"
+"author text,"
+"price real,"
+"pages integer,"
+"name text)";
private Context mContext;
public MyDataBaseHelper(Context context,version);
mcontext=context;
}
@Override
public void onCreate(sqliteDatabase db) {
db.execsql(CREATE_BOOK);
}
@Override
public void onUpgrade(sqliteDatabase db,int newVersion) {
switch (oldVersion) {
case 1:
db.execsql(CREATE_CATEGORY);
case 2:
db.execsql("alter table Book add column category_id integer");
default:
}
}
}
-新建布局文件,在布局文件中添加一个按钮即可。
-在MainActivity中实现点击按钮,创建数据库和表的逻辑。
public class MainActivity extends Activity {
priavte MyDatabaseHelper dbHelper;
@override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper=new MyDatabaseHelper(this,"BookStore.db",null,1);
Button createDatabase=(Button)findViewById(R.id.create_database);
createDatabase.setOnClickListener(new OnClickListener(){
@override
public void onClick(View v)
{
dbHelper.getWritableDatabase();
}
});
}
}
首先在onCreate()方法中构建一个MyDatabaseHelper对象,并且通过构造函数的参数将数据库名指定为BookStore.db,版本号为1,点击界面上的按钮,调用getWritableDatabase()方法。
执行的逻辑如下:
点击按钮时,它首先会检测程序中是否有BookStore.db数据库。如果没有,就会创建数据库并调用MyDatabaseHelper中的onCreate()方法。这样表book就会被创建。当第二次点击按钮时,则MyDatabaseHelper中的onCreate()就不会执行了,因为数据库已存在,且也不会创建表。
如何升级数据库呢?
onUpgrade()方法是用于对数据库进行升级的。
假如现在要在数据库中添加一个CATEGORY的表,如何在上述程序上修改呢?
直接在onCreate()方法中添加创建语句是不行的,因为数据库已经存在,OnCreate()方法不会被运行了。那最基础的办法是,我们传入一个高一点的版本号,在onUpgrade运行删除数据库的操作,在点击按钮就可以运行OnCreate()方法了。
传入一个高一点的版本号,就可以让onUpgrade()方法执行
public class MyDataBaseHelper extends sqliteOpenHelper {
public static final String CREATE_BOOK="create table book("
+"id integer primary key autoincrement,"
+"name text,"
+"category_id integer)";
public static final String CREATE_CATEGORY="create table Category("
+"id integer primary key autoincrement,"
+"category_name text,"
+"category_code integer)";
private Context mContext;
public MyDataBaseHelper(Context context,version);
mContext=context;
}
@Override
public void onCreate(sqliteDatabase db) {
db.execsql(CREATE_BOOK);
db.execsql(CREATE_CATEGORY);
}
@Override
public void onUpgrade(sqliteDatabase db,int newVersion) {
db.execsql("drop table if exists Book");
db.execsql("drop table if exists Category");
onCreate(db);
}
}
}
升级数据库的最佳写法
上面的升级数据库的方法是不可取的,因为在现实应用中,数据库包含重要的历史数据,如果全部删除,后果不堪设想。
我们可以这样设想:
每个数据库在升级的时候都会对应一个版本号,当指定的数据库版本号大于当前数据库版本号的时候,就会进行到onUpgrade()方法中去执行更新操作。这里只需要为每一个版本号赋予它各自的更改的内容,然后在onUpgrade()方法中对当前数据库的版本号进行判断,再执行相应的改变就可以了。
public class MyDataBaseHelper extends sqliteOpenHelper {
public static final String CREATE_BOOK="create table book("
+"id integer primary key autoincrement,"
+"category_code integer)";
public MyDataBaseHelper(Context context,version);
}
@Override
public void onCreate(sqliteDatabase db) {
db.execsql(CREATE_BOOK);
}
@Override
public void onUpgrade(sqliteDatabase db,int newVersion) {
switch (oldVersion) {
case 1:
db.execsql(CREATE_CATEGORY);
case 2:
db.execsql("alter table Book add column category_id integer");
default:
}
}
}
[1]:参考资料:第一行代码 Android