android: SQLite建立数据库

SQLite 是一款轻量级的关系型数据库,它的运算速度很是快, 占用资源不多,一般只须要几百 K 的内存就足够了,于是特别适合在移动设备上使用。SQLite 不只支持标准的 SQL 语法,还遵循了数据库的 ACID 事务,因此只要你之前使用过其余的 关系型数据库,就能够很快地上手 SQLite。而 SQLite 又比通常的数据库要简单得多,它甚 至不用设置用户名和密码就可使用。Android 正是把这个功能极为强大的数据库嵌入到了 系统当中,使得本地持久化的功能有了一次质的飞跃。android

前面咱们所学的文件存储和 SharedPreferences 存储毕竟只适用于去保存一些简单的数据 和键值对,当须要存储大量复杂的关系型数据的时候,你就会发现以上两种存储方式很难应 付得了。好比咱们手机的短信程序中可能会有不少个会话,每一个会话中又包含了不少条信息 内容,而且大部分会话还可能各自对应了电话簿中的某个联系人。很难想象如何用文件或者 SharedPreferences 来存储这些数据量大、结构性复杂的数据吧?可是使用数据库就能够作得 到。那么咱们就赶快来看一看,Android 中的 SQLite 数据库究竟是如何使用的。sql

建立数据库shell

Android 为了让咱们可以更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper 帮 助类,借助这个类就能够很是简单地对数据库进行建立和升级。既然有好东西能够直接使用, 那咱们天然要尝试一下了,下面我就将对 SQLiteOpenHelper 的基本用法进行介绍。数据库

首先你要知道 SQLiteOpenHelper 是一个抽象类,这意味着若是咱们想要使用它的话, 就须要建立一个本身的帮助类去继承它。SQLiteOpenHelper 中有两个抽象方法,分别是 onCreate()和 onUpgrade(),咱们必须在本身的帮助类里面重写这两个方法,而后分别在这两 个方法中去实现建立、升级数据库的逻辑。bash

SQLiteOpenHelper 中 还 有 两 个 非 常 重 要 的 实 例 方 法 , getReadableDatabase() 和 getWritableDatabase()。这两个方法均可以建立或打开一个现有的数据库(若是数据库已存在 则直接打开,不然建立一个新的数据库),并返回一个可对数据库进行读写操做的对象。不 同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对 象将以只读的方式去打开数据库,而 getWritableDatabase()方法则将出现异常。ide

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,ui

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, CursorFactory factory, int version) {

super(context, name, factory, version);

mContext = context;

}

 

 

@Override

public void onCreate(SQLiteDatabase db) {

db.execSQL(CREATE_BOOK);

Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();

}

 

 

@Override

public 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" >

 

<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 Activity {

 

private 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,而后在 Create database 按钮的点击 事件里调用了 getWritableDatabase()方法。这样当第一次点击 Create database 按钮时,就会检测 到当前程序中并无 BookStore.db 这个数据库,因而会建立该数据库并调用 MyDatabaseHelper中的 onCreate()方法,这样 Book 表也就获得了建立,而后会弹出一个 Toast 提示建立成功。

再次点击 Create database 按钮时,会发现此时已经存在 BookStore.db 数据库了,所以不会再 建立一次。

如今就能够运行一下代码了,在程序主界面点击 Create database 按钮,结果如图 6.11 所示。

 

图   6.11

 

此时 BookStore.db 数据库和 Book 表应该都已经建立成功了,由于当你再次点击 Create database 按钮时不会再有 Toast 弹出。但是又回到了以前的那个老问题,怎样才能证明它们 的确是建立成功了?若是仍是使用 File Explorer,那么最多你只能看到 databases 目录下出现 了一个 BookStore.db 文件,Book 表是没法经过 File Explorer 看到的。所以此次咱们准备换一 种查看方式,使用 adb shell 来对数据库和表的建立状况进行检查。

adb 是 Android SDK 中自带的一个调试工具,使用这个工具能够直接对链接在电脑上的 手机或模拟器进行调试操做。它存放在 sdk 的 platform-tools 目录下,若是想要在命令行中使 用这个工具,就须要先把它的路径配置到环境变量里。

若是你使用的是 Windows 系统,能够右击个人电脑→属性→高级→环境变量,而后在 系统变量里找到 Path 并点击编辑,将 platform-tools 目录配置进去,如图 6.12 所示。

图   6.12

 

若是你使用的是 Linux 系统,能够在 home 路径下编辑.bash_profile 文件,将 platform-tools目录配置进去便可,如图 6.13 所示:

 

图   6.13

 

配置好了环境变量以后,就可使用 adb 工具了。打开命令行界面,输入 adb shell,就 会进入到设备的控制台,如图 6.14 所示。

 

图   6.14

 

而后使用 cd 命令进行到/data/data/com.example.databasetest/databases/目录下,并使用 ls命令查看到该目录里的文件,如图 6.15 所示。

图   6.15

 

这个目录下出现了两个数据库文件,一个正是咱们建立的 BookStore.db ,而另外一个 BookStore.db-journal 则是为了让数据库可以支持事务而产生的临时日志文件,一般状况下这 个文件的大小都是 0 字节。

接下来咱们就要借助 sqlite 命令来打开数据库了,只须要键入 sqlite3,后面加上数据库 名便可,如图 6.16 所示。

 

图   6.16

 

这时就已经打开了 BookStore.db 数据库,如今就能够对这个数据库中的表进行管理了。 首先来看一下目前数据库中有哪些表,键入.table 命令,如图 6.17 所示。

 

图   6.17

 

能够看到,此时数据库中有两张表,android_metadata 表是每一个数据库中都会自动生成的,不用管它,而另一张 Book 表就是咱们在 MyDatabaseHelper 中建立的了。这里还能够经过.schema 命令来查看它们的建表语句,如图 6.18 所示。

 

图   6.18

 

由此证实,BookStore.db 数据库和 Book 表确实已是建立成功了。以后键入.exit 或.quit命令能够退出数据库的编辑,再键入 exit 命令就能够退出设备控制台了。

相关文章
相关标签/搜索