文章目的:快速入门Android中的SQLite(数据库)来实现创建和升级(更新)
前言:Android 为了让我们能够方便地管理数据库,提供了一个SQLiteOpenHelper类, 借助这个类就可以非常简单地对数据库进行创建和升级。因本文是快速入门,就不对SQLiteOpenHelper进行详细介绍,这里简单提一下:SQLiteOpenHelper中有两个抽象方法,分别是onCreate()和onUpgrade(),还 有 两 个 非 常 重 要 的 实 例 方 法 , getReadableDatabase()和getWritableDatabase(),好了,相信同学们更在乎如何使用它,我们直接开始。
开发环境:
- 编写代码工具:Android Studio 2.2.2
- compileSdkVersion 25
- buildToolsVersion “25.0.0”
- minSdkVersion 19
- targetSdkVersion 25
- compile ‘com.android.support:appcompat-v7:25.0.0’
提示:文章末尾下载项目时注意开发环境的更改,以免造成不必要的时间浪费。
一、实现创建数据库和数据库的表
为了测试,我们创建一个名为BookStore.db的数据库,然后在这个数据库中新建一张Book表,表中有 id(主键)、作者、价格、页数和书名等列。当然数据库会用到SQL基本功,但是只要大家看下面的代码,也能轻松理解出来。
这里,我们新建名叫MySqlDataHelper类继承自 SQLiteOpenHelper。/**
* 继承SQLiteOpenHelper会先实现2个方法,实现1个构造方法
*/
public class MySqlDataHelper extends SQLiteOpenHelper {
//上下文的context
private Context mContext;
//数据库的标准写法,可以直接复制使用并稍微修改
public static final String CREATE_BOOK = "create table book ("
+ "id integer primary key autoincrement, "
+ "author text, "
+ "price real, "
+ "pages integer, "
+ "name text)";
public MySqlDataHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
/**
* 这里是创建
* @param sqLiteDatabase
*/
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//SQLiteDatabase中的execSQL方法来执行建表语句
sqLiteDatabase.execSQL(CREATE_BOOK);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
}
/**
* 这里是更新
* @param sqLiteDatabase
* @param i
* @param i1
*/
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
这样,我们就已经做好了准备,接下来只需要执行写入方法就行。
我们在activity_main的布局文件中创建一个Button来用点击创建这个监听事件。
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="创建数据库"
android:id="@+id/creat"/>
然后,在Activity中来实例对象,实现4个参数的构造方法即可。
public class MainActivity extends AppCompatActivity {
private Button mButton;
private MySqlDataHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = ((Button) findViewById(R.id.creat));
/*这个构造方法中接收四个参数,第一个参数是 Context,第二个参数是给数据库创建一个名字,
第三个参数允许我们在查询数据的时候返回一个自定义的 Cursor,一般都是传入 null。
第四个参数表示当前数据库的版本号,传入1即可*/
helper = new MySqlDataHelper(this, "BookStore.db", null, 1);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//执行写入数据
helper.getWritableDatabase();
}
});
}
}
准备完成,我们运行程序看看效果,点击Button,弹出Toast提示。说明已经创建完成,并且再次点击就不会弹出Toast。想要查看创建好的数据库位置,只需要在/data/data/<package name>/databases/目录下查看即可。(packagename是你的包名)
二、升级数据库
你肯定发现了MySqlDataHelper类中还有一个空方法,没错, onUpgrade()方法是用于对数据库进行升级的,它在整个数据库的管理工作当中起着非常重要的作用,可千万不能忽视它哟。
我们已经有一张 Book 表用于存放书的各种详细数据,但是我们又想再添加一张 Category表用于记录书籍的分类该怎么做呢?很简单,只需要再创建一个表,然后将两个表放入onUpgrade中,然后执行onCreate()方法。
我们回到MySqlDataHelper类中,对onUpgrade方法进行操作(注意注释掉onCreate()中的代码)
/**
* 这里是更新
* @param sqLiteDatabase
* @param i
* @param i1
*/
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL("drop table if exists Book");
sqLiteDatabase.execSQL("drop table if exists Category");
onCreate(sqLiteDatabase);
}
最后在MainActivity中,将之前的版本号改成大于1的数字就行了。
public class MainActivity extends AppCompatActivity {
private Button mButton;
private MySqlDataHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = ((Button) findViewById(R.id.creat));
/*这个构造方法中接收四个参数,第一个参数是 Context,第二个参数是给数据库创建一个名字,
第三个参数允许我们在查询数据的时候返回一个自定义的 Cursor,一般都是传入 null。
第四个参数表示当前数据库的版本号,传入1即可,更新的话,数字改成大于1的即可*/
helper = new MySqlDataHelper(this, "BookStore.db", null, 2);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//执行写入数据
helper.getWritableDatabase();
}
});
}
}
再次运行程序,点击Button后,数据库就更新完成了。在/data/data/<package name>/databases/目录下再次查看,就发现创建2个表成功了!
三、总结
Android中数据库的使用其实非常简单,但是运用在实际项目中,需要牢记:创建,更新,增删改查,我会在后面的文章中继续讲解数据库的增删改查。
项目下载地址:http://pan.baidu.com/s/1dFupDbN 如果链接挂了,请回复,我会尽快更新。
欢迎大家加微信进行技术交流和提出意见, 欢迎大家关注我的微信公众号,我一定会最快回复你!