原文链接:http://www.orlion.ga/603/

一、创建数据库

Android为了让我们能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper帮助类, 借助这个类就可以非常简单地对数据库进行创建和升级。

SQLiteOpenHelper是一个抽象类,其中有两个抽象方法分别是onCreate()和onUpgrade(),分别在这两个方法中实现创建和升级数据库的逻辑

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

SQLiteOpenHelper中有两个构造方法可以重写,一般使用参数少的那个构造方法即可。这个构造方法接收四个参数,第一个是Context 。第二个是数据库名。第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null。第四个参数是当前数据库的版本号,可用于对数据库进行升级操作。构建出SQLiteOpenHelper的实例之后,再调用它的getReadableDatabase()或getWritableDatabase()方法就能够创建数据库了,数据库文件会存放在/data/data/<package name>/databases/目录下。此时重写的onCreate()方法也会得到执行,所以通常会在这里去处理一些创建表的逻辑。

创建一个项目DatabaseDemo,新建MyDatabaseHelper类从SQLiteOpenHelper继承:

package ga.orlion.databasedemo;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteDatabase.CursorFactory;

import android.widget.Toast;

import android.database.sqlite.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, "数据库创建了", Toast.LENGTH_SHORT).show();

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

}

其中建表语句:

create table Book (

id integer primary key autoincrement,

author text,

price real,

pages integer,

name text)

SQLite不像其他的数据库拥有众多繁杂的数据类型, 它的数据类型很简单, integer表示整型,real表示浮点型,text表示文本类型,blob表示二进制类型。另外,上述建表语句中我们还使用了 primary key将 id列设为主键,并用 autoincrement关键字表示 id列是自增长的。

我们把建表语句定义成了一个字符串常量,然后在 onCreate()方法中又调用了 SQLiteDatabase的 execSQL()方法去执行这条建表语句,并弹出一个 Toast提示创建成功。

修改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="创建数据库" />

</LinearLayout>

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

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

dbHelper = new MyDatabaseHelper(this , "BookStore.db" , null , 1);

Button button = (Button) findViewById(R.id.create_database);

button.setOnClickListener(new View.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数据库了,因此不会再创建一次。

接下来我们使用adb shell来对数据库和表的创建情况进行查看,adb工具在Android SDK中自带,这个工具可以对连接在电脑上的手机或模拟器进行调试操作,它存放在sdk的platform-tools目录下。先将这个目录添加到环境变量中。然后控制台中输入 "adb shell",然后使用"cd"命令进入/data/data/ga.orlion.databasedemo/databases/目录下,使用ls查看所有文件会看到有两个文件,一个是我们创建的BookStore.db,另一个BookStore.db-journal则是为了数据库能够支持事务而产生的临时日志文件,通常情况下该文件的大小是0。接下来我们通过sqlite3命令打开数据库,只需要输入sqlite3后边跟上数据库名即可。这时就打开BookStore.db数据库了,现在就可以对这个数据库的表进行管理了,可以通过".table"命令来查看有哪些表

,此时有两个表,android_meatdata是每个数据库都会自动生成的,另外一个表book是我们创建的。还可以通过".schema"命令来查看他们的建表语句。

二、升级数据库

如果我们想再添加一个表到我们创建的数据库BookStore.db中不能像创建第一个表book时那样简单的写到oncreate方法中了,因为我们的数据库已经创建了,onCreate()不会再执行了,所以就用到了onUpgrade()方法。

可以将MyDatabaseHelper改为:

package ga.orlion.databasedemo;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteDatabase.CursorFactory;

import android.widget.Toast;

import android.database.sqlite.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)";

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

super(context, name, factory, version);

mContext = context;

}

@Override

public void onCreate(SQLiteDatabase db) {

db.execSQL(CREATE_BOOK);

db.execSQL(CREATE_CATEGORY);

Toast.makeText(mContext, "数据库创建了", Toast.LENGTH_SHORT).show();

}

@Override

public 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大的数, 就可以让 onUpgrade()方法得到执行了。

dbHelper = new MyDatabaseHelper(this , "BookStore.db" , null , 2);

Android入门(十)SQLite创建升级数据库的更多相关文章

  1. Android入门(十二)SQLite事务、升级数据库

    原文链接:http://www.orlion.ga/610/ 一.事务 SQLite支持事务,看一下Android如何使用事务:比如 Book表中的数据都已经很老了,现在准备全部废弃掉替换成新数据,可 ...

  2. Android入门(十一)SQLite CURD

    原文链接:http://www.orlion.ga/594/ 一.添加数据 SQLiteOpenHelper的getReadableDatabase()或getWritableDatabase()方法 ...

  3. Android入门(十四)内容提供器-实现跨程序共享实例

    原文链接:http://www.orlion.ga/661/ 打开SQLite博文中创建的 DatabaseDemo项目,首先将 MyDatabaseHelper中使用 Toast弹出创建数据库成功的 ...

  4. Android:查看应用创建的数据库

    每个Android应用程序都可以使用SQLite数据库.它创建的位置在data/data/<项目文件夹>/databases/ 运行后打开,window->show view-> ...

  5. Android入门(十九)WebView

    原文链接:http://www.orlion.ga/676/ WebView可以在自己的应用程序中嵌入一个浏览器来展示网页. 创建一个项目WebViewDemo,修改activity_main.xml ...

  6. Android入门(十八)服务

    原文链接:http://www.orlion.ga/674/ 一.定义一个服务 创建一个项目ServiceDemo,然后在这个项目中新增一个名为 MyService的类,并让它继承自 Service, ...

  7. Android入门(十六)调用摄像头相册

    原文链接:http://www.orlion.ga/665/ 一.调用摄像头 创建一个项目ChoosePicDemo,修改activity_main.xml: <LinearLayout xml ...

  8. Android入门(十五)通知

    原文链接:http://www.orlion.ga/663/ 1.通知的基本用法 创建通知的步骤,首先需要一个NotificationManager来对通知进行管理,可以调用Context的getSy ...

  9. android: SQLite创建数据库

    SQLite 是一款轻量级的关系型数据库,它的运算速度非常快, 占用资源很少,通常只需要几百 K 的内存就足够了,因而特别适合在移动设备上使用.SQLite 不仅支持标准的 SQL 语法,还遵循了数据 ...

随机推荐

  1. velocity模板入门

    $!{velocityCount}  随机

  2. U盘占空间,但看不到内容——解决方案

    原因: u盘感染了病毒 .病毒把U盘里的文件都加上了隐藏属性和系统属性,所以看不到了,但仍占用存储空间. 解决办法: 1.在“运行“里面输入:cmd,回车:2.在cmd中进入U盘.比如你的U盘是H盘, ...

  3. Sqlite 管理工具收藏

    1.SQLite Administrator   http://download.orbmu2k.de/files/sqliteadmin.zip 2.SQLite2009Pro-v3.8.3.1 h ...

  4. 2.使用JDK开发webService

    使用jdk开发webService需要注意:jdk版本必须1.6以及1.6以上! 以下webService的组成部分: server端和client端,通过服务器端(server)webService ...

  5. Mybatis 后台SQL不输出

    在正确设置log4j.properties之后还是无法输出想要的SQL语句 经过搜索,发现是跟slf4j-api-1.6.1.jar这个jar包冲突了. 删掉之后就正常了, 但是这个包删掉的话acti ...

  6. [OLE DB 源 [1]] 警告: 无法从 OLE DB 访问接口检索列代码页信息。如果该组件支持“DefaultCodePage”属性,将使用来自该属性的代码页。如果当前的字符串代码页值不正确,请更改该属性的值。如果该组件不支持该属性,将使用来自该组件的区域设置 ID 的代码页。

    SSIS的警告信息,虽然不影响使用,但是对于一个有强迫症的人来说,实在痛苦, 解决办法:控件右键--属性--AlaywayseUseDefaultCodePage 修改成True即可,默认为False

  7. Xamarin开发Android笔记:使用ZXing进行连续扫描

    在项目开发中需要使用到条码扫描,因为以前就测试过ZXing,感觉识别速度和功能都不错,所以直接引用.不过在实际开发的过程中,却遇到连续扫描的问题,每次扫描识别完成之后,扫描窗体自动关闭了. 在Xama ...

  8. UWP应用开发系列视频教程简介 - Built for Windows 10

    万分感谢Fdyo同学给我们带来的有中文字幕的系列教程! http://zhuanlan.zhihu.com/MSFaith/20364660 下面是这系列video教程中的一个截图作为示例,有代码,有 ...

  9. javascript中this指针探讨

    javascript是一门类java语言有很多跟java相类似的特点,但也仅是类似而已,真正使用中还是有很大的差别.this指针常常让很多初学者抓狂,本人也曾为此困惑不解,查找过很多资料,今天在这里总 ...

  10. 实战-Fluxion与wifi热点伪造、钓鱼、中间人攻击、wifi破解

    原作者:PG     整理:玄魂工作室-荣杰 目录: 0x00-Fluxion是什么 0x01-Fluxion工作原理 0x02-Kali上安装fluxion 0x03-Fluxion工具使用说明+实 ...