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

参考资料: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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值