Android之数据持久化三(SQLite 数据库存储)一

来源:互联网 发布:直播软件下载 编辑:程序博客网 时间:2024/04/29 06:23

Android之数据持久化三(SQLite 数据库存储)一

一,创建数据库

Android 为了让我们能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper 帮
助类, 借助这个类就可以非常简单地对数据库进行创建和升级。 既然有好东西可以直接使用,
那我们自然要尝试一下了,下面我就将对 SQLiteOpenHelper 的基本用法进行介绍。
首先你要知道 SQLiteOpenHelper 是一个抽象类,这意味着如果我们想要使用它的话,
就需要创建一个自己的帮助类去继承它。SQLiteOpenHelper 中有两个抽象方法,分别是
onCreate()和 onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两
个方法中去实现创建、升级数据库的逻辑。
SQLiteOpenHelper 中 还 有 两 个 非 常 重 要 的 实 例 方 法 , getReadableDatabase() 和
getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在
则直接打开,否则创建一个新的数据库) ,并返回一个可对数据库进行读写操作的对象。不
同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对
象将以只读的方式去打开数据库,而 getWritableDatabase()方法则将出现异常。
SQLiteOpenHelper 中有两个构造方法可供重写, 一般使用参数少一点的那个构造方法即
可。这个构造方法中接收四个参数,第一个参数是 Context,这个没什么好说的,必须要有
它才能对数据库进行操作。第二个参数是数据库名,创建数据库时使用的就是这里指定的名
称。第三个参数允许我们在查询数据的时候返回一个自定义的 Cursor,一般都是传入 null。
第四个参数表示当前数据库的版本号,可用于对数据库进行升级操作。构建出
SQLiteOpenHelper 的实例之后,再调用它的 getReadableDatabase()或 getWritableDatabase()方
法就能够创建数据库了,数据库文件会存放在/data/data/<package name>/databases/目录下。
此时,重写的 onCreate()方法也会得到执行,所以通常会在这里去处理一些创建表的逻辑。
接下来还是让我们通过例子的方式来更加直观地体会 SQLiteOpenHelper 的用法吧,首
先新建一个 DatabaseTest 项目。
这里我们希望创建一个名为BookStore.db的数据库, 然后在这个数据库中新建一张Book
表,表中有 id(主键) 、作者、价格、页数和书名等列。创建数据库表当然还是需要用建表
语句的,这里也是要考验一下你的 SQL 基本功了,Book 表的建表语句如下所示:

create table Book (id integer primary key autoincrement,author text,price real,pages integer,name text)

只要你对 SQL 方面的知识稍微有一些了解,上面的建表语句对你来说应该都不难吧。
SQLite 不像其他的数据库拥有众多繁杂的数据类型, 它的数据类型很简单, integer 表示整型,
real 表示浮点型,text 表示文本类型,blob 表示二进制类型。另外,上述建表语句中我们还
使用了 primary key 将 id 列设为主键,并用 autoincrement关键字表示 id 列是自增长的。
然后需要在代码中去执行这条 SQL语句, 才能完成创建表的操作。 新建 MyDatabaseHelper
类继承自 SQLiteOpenHelper,代码如下所示:

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, String name, CursorFactoryfactory, int version) {super(context, name, factory, version);mContext = context;}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_BOOK);Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}

可以看到,我们把建表语句定义成了一个字符串常量,然后在 onCreate()方法中又调用
了 SQLiteDatabase的 execSQL()方法去执行这条建表语句,并弹出一个 Toast 提示创建成功,
这样就可以保证在数据库创建完成的同时还能成功创建 Book 表。
现在修改 activity_main.xml 中的代码,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><Buttonandroid:id="@+id/create_database"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Create database"/></LinearLayout>

布局文件很简单,就是加入了一个按钮,用于创建数据库。最后修改 MainActivity 中的
代码,如下所示:

public class MainActivity extends Activity {private MyDatabaseHelper dbHelper;@Overrideprotected 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() {@Overridepublic void onClick(View v) {dbHelper.getWritableDatabase();}});}}

这里我们在 onCreate()方法中构建了一个 MyDatabaseHelper 对象,并且通过构造函数的
参数将数据库名指定为 BookStore.db,版本号指定为 1,然后在 Create database 按钮的点击
事件里调用了 getWritableDatabase()方法。这样当第一次点击 Createdatabase按钮时,就会检测
到当前程序中并没有 BookStore.db这个数据库, 于是会创建该数据库并调用 MyDatabaseHelper
第 2 章 先从看得到的入手,探究活动
243
中的 onCreate()方法,这样 Book 表也就得到了创建,然后会弹出一个 Toast 提示创建成功。
再次点击 Create database按钮时,会发现此时已经存在 BookStore.db 数据库了,因此不会再
创建一次。
现在就可以运行一下代码了, 在程序主界面点击 Createdatabase按钮, 结果如图所示。


二,升级数据库

我们只需要巧妙
地运用 SQLiteOpenHelper的升级功能就可以很轻松地解决这个问题。 修改 MyDatabaseHelper
中的代码,如下所示:

public class MyDatabaseHelper extends SQLiteOpenHelper {……@Overridepublic 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()方法去重新创
建。这里先将已经存在的表删除掉,是因为如果在创建表时发现这张表已经存在了,就会直
接报错。
接下来的问题就是如何让 onUpgrade()方法能够执行了,还记得 SQLiteOpenHelper 的构
造方法里接收的第四个参数吗?它表示当前数据库的版本号,之前我们传入的是 1,现在只
要传入一个比 1 大的数, 就可以让 onUpgrade()方法得到执行了。 修改 MainActivity 中的代码,
如下所示:

public class MainActivity extends Activity {private MyDatabaseHelper dbHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);Button createDatabase = (Button) findViewById(R.id.create_database);createDatabase.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {dbHelper.getWritableDatabase();}});}}

这里将数据库版本号指定为 2,表示我们对数据库进行升级了。现在重新运行程序,并
点击 Create database按钮,这时就会再次弹出创建成功的提示。








1 0
原创粉丝点击