hyacinthLJP

•引言

概念

  SQLite数据库,和其他的SQL数据库不同, 我们并不需要在手机上另外安装一个数据库软件,Android系统已经集成了这个数据库;

特点

  • SQLite是一个轻量级的关系型数据库,运算速度快,占用资源少,很适合在移动设备上使用

  • 不仅支持标准SQL语法,还遵循ACID(数据库事务)原则,无需账号,使用起来非常方便

  • SQLite支持五种数据类型

    • NULL
    • integer(整型)
    • real(浮点型)
    • text(文本类型)
    • blob(二进制类型)
  • SQLite 通过文件来保存数据库 

    • 一个文件就是一个数据库
    • 数据库中又包含多个表格
    • 表格里又有多条记录
    • 每条记录由多个字段构成
    • 每个字段都有对应的值

•创建数据库

  Android为了让我们能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper 帮助类;

  借助这个类就可以非常简单地对数据库进行创建和升级。

 

  SQLiteOpenHelper 是一个抽象类,这意味着如果我们想要使用它的话,就需要创建一个自己的帮助类去继承它;

  SQLiteOpenHelper 中有两个抽象方法,分别是  oncreate()  和  onUpgrade() ;

  •  onCreate(database)  : 数据库第一次被创建时被调用

  •  onUpgrade(database,oldVersion,newVersion)  : 在数据库的版本发生变化时会被调用

    • 一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的
    • 假设数据库现在的版本是 1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构
    • 为了实现这一目的,可以把原来的数据库版本设置为 2,或者其他与旧版本号不同的数字即可

  我们必须在自己的帮助类里面重写这两个方法,然后分别在这两个方法中去实现 创建、升级数据库 的逻辑。

 

  SQLiteOpenHelper 中还有两个非常重要的实例方法: getReadableDatabase() 和  getWritableDatabase() 。

  这两个方法都可以 创建或打开 一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),

  并返回一个可对数据库进行读写操作的对象。

  不同的是,当数据库不可写入的时候(如磁盘空间已满):

  •  getReadableDatabase() 方法返回的对象将以只读的方式去打开数据库
  •  getWritableDatabase() 方法则将出现异常

  

  SQLiteOpenHelper 中有三个构造方法可供重写,一般使用参数少一点的那个:

 SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) 

  该构造方法中接收四个参数:

  •  Context context :这个没什么好说的,必须有这个才能对数据库进行操作
  •  String name :第二个参数是数据库名,创建数据库时使用的就是这里指定的名称
  •  SQLiteDatabase.CursorFactory factory :第三个参数允许我们在查询数据的时候返回一个自定义的 Cursor,一般都是传入null
  •  int version :第四个参数表示当前数据库的版本号,可用于对数据库进行升级操作

  构建出 SQLiteOpenHelper 的实例之后,再调用它的  getReadableDatabase()  或  getWritableDatabase()  方法就能够创建数据库了;

  数据库文件会存放在  /data/data/<package name>/databases/  目录下;

  此时,重写的  onCreate()  方法也会得到执行,所以通常会在这里去处理一些创建表的逻辑。

•通过代码深入理解

准备工作

  首先新建一个 TestDatabase 项目。

  在该项目中新建 MyDatabaseHelper 类,继承自 SQLiteOpenHelper;

MyDatabaseHelper.java

public class MyDatabaseHelper extends SQLiteOpenHelper {

    public static final String CREATE_BOOK = "create table Book (" +
            "id integer primary key autoincrement," +
            "name text," +
            "price real)";

    private Context mContext;

    public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.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()  中调用了  db.execSQL(CREATE_BOOK); 去执行这条建表语句;

  之后,弹出一个 Toast 提示建表成功,这样就可以保证在数据库创建的同时创建 Book 表;

  在 SQL 中,Book 表的建表语句如下:

CREATE TABLE Book(
    id INTEGER PRIMARY KEY autoincrement,
    NAME TEXT,
    price REAL);

  其中,设置 id 为 primary key,并用 autoincrement 关键字表示 id 列是自增长的。

  接下来,修改 activity_main.xml 中的代码;

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp">

    <Button
        android:id="@+id/create"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Create"
        android:textAllCaps="false"
        />

</LinearLayout>

  布局文件很简单,就是加入了一个按钮,用于创建数据库。

  最后,修改 MainActivity.java 中的代码;

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private MyDatabaseHelper helper;
    private Button mBtnCreate;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

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

        mBtnCreate = findViewById(R.id.create);
        mBtnCreate.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()){
            case R.id.create:
                helper.getWritableDatabase();
                break;
        }
    }
}

  这里我们在  onCreate()  方法中构建了一个 MyDatabaseHelper 对象,并且通过构造函数的参数将数据库名指定为 BookStore.db,版本号指定为 1;

  然后在 Create按钮 的点击事件里调用了  getWritableDatabase() 方法;

  这样当第一次点击 Create按钮 时,就会检测到当前程序中并没有 BookStore.db 这个数据库,

  于是会创建该数据库并调用 MyDatabaseHelper 中的  onCreate() 方法,这样 Book 表也就得到了创建,然后会弹出一个 Toast 提示创建成功。

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

运行效果

  

  此时 BookStore.db数据库 和 Book表 应该都已经创建成功了,因为当你再次点击 Create按钮 时,不会再有 Toast 弹出;

  可是怎样才能证实它们的确创建成功了?

  打开 Android Device Monitor(不知道什么是 ADM 的小伙伴可以参考我的这篇博客

分类:

技术点:

相关文章: