Android数据库SQLite操作详解及LitePal用法详解(一)

来源:互联网 发布:麦多商城系统 源码 编辑:程序博客网 时间:2024/06/09 19:23

参考资料:Android数据库高手秘籍
第一行代码

在安卓中数据的存储是很重要的一部分,任何一个应用程序其实说白了就是在不停地和数据打交道。Android 系统中主要提供了四种方式用于简单地实现数据持久化功能,即文件存储、外部存储、SharedPreference 存储以及数据库存储。使用文件、SharedPreference 或数据库来保存数据会比外部存储相对更简单一些,而且比起将数据保存在 SD 卡中会更加的安全。

文件存储和 SharedPreferences存储毕竟只适用于去保存一些简单的数据和键值对,当需要存储大量复杂的关系型数据的时候,你就会发现以上两种存储方式很难应付得了。比如我们手机的短信程序中可能会有很多个会话,每个会话中又包含了很多条信息内容,并且大部分会话还可能各自对应了电话簿中的某个联系人。很难想象如何用文件或者SharedPreferences 来存储这些数据量大、结构性复杂的数据吧?但是使用数据库就可以做得到。

这里就来整理下SQLite的操作详解:

  1. 创建数据库:
    首先我们需要知道 SQLiteOpenHelper 是什么: SQLiteOpenHelper 是一个抽象类,具有onCreate()和 onUpgrade()两个方法,可以分别在这两个方法中去实现创建、升级数据库的逻辑。数据库文件会存放在/data/data/package name/databases/目录下。

创建一个类继承SQLiteOpenHelper ,并实现其抽象方法,添加构造函数:

package com.example.kevin.learnsqlite.dbhelper;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.widget.Toast;/** * 作者:Created by Kevin on 2016/3/8. * 邮箱:haowei0708@163.com * 描述:DbOpenHelper */public class DbOpenHelper extends SQLiteOpenHelper {    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 DbOpenHelper(Context context, String name, 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,"创建成功",Toast.LENGTH_SHORT).show();    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    }}

我们添加一个按钮来创建数据库:

mDbOpenHelper = new DbOpenHelper(MainActivity.this,"BookStore.db",null,1);findViewById(R.id.btn_create).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                mDbOpenHelper.getWritableDatabase();            }        });

Toast弹出了创建成功,还是不安心,打开Android Device Monitor确认一下,到/data/data/package name/databases/目录下,到处BookStore.db看下我们的数据库:
这里写图片描述

那么我们再点一下创建数据库按钮会怎么样??
什么也没有发生,说明并没有走到onCreate方法内,所以说是存在改数据库,则不会再次创建。

那么这个时候我们再接着创建另一个表呢?

package com.example.kevin.learnsqlite.dbhelper;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.widget.Toast;/** * 作者:Created by Kevin on 2016/3/8. * 邮箱:haowei0708@163.com * 描述:DbOpenHelper */public class DbOpenHelper extends SQLiteOpenHelper {    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 static final String CREATE_CATEGORY = "create table Category ("            + "id integer primary key autoincrement, "            + "category_name text, "            + "category_code integer)";    public DbOpenHelper(Context context, String name, SQLiteDatabase.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) {    }}

点击按钮后也不会弹出吐司,说明 BookStore.db 数据库已经存在了,之后不管我们怎样点击 Create database 按钮MyDatabaseHelper 中的 onCreate()方法都不会再次执行,因此新添加的表也就无法得到创建了。

怎么解决呢?
那么就接着说我们的升级数据库了。

  1. 更新数据库 :
    第一种方法:更新数据库,直接删除原有的数据库,然后再创建两个数据库:
    @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);    }

记得在MainActivity中修改版本号为2才会进行更新。
最后结果是能弹出吐司,不放心的还可以打开Android Device Monitor再看看。

当然这种方法过于简单粗暴,用户使用的本地数据也会跟着丢失,所以这种方法只适用于简单场合。
第二种方法:
我们注意到在onUpdate方法中有两个参数是oldVersion和newVersion,我们就是通过这两个参数进行操作的。

switch (oldVersion){            case 1:                db.execSQL("drop table if exists Category");            default:        }

一个新的需求,给Book添加新的一列,我们的版本就更新到了3

switch (oldVersion){            case 1:                db.execSQL("drop table if exists Category");            case 2:                db.execSQL("alter table Book add column category_id integer");            default:        }

注意到所有的case都没有break,这可以让更旧的版本迭代到最新版本。

Android数据库SQLite操作详解及LitePal用法详解(二)
将继续学习数据库的增删改查。

0 0