Android数据库SQLite操作详解及LitePal用法详解(一)
来源:互联网 发布:麦多商城系统 源码 编辑:程序博客网 时间:2024/06/09 19:23
参考资料:Android数据库高手秘籍
第一行代码
在安卓中数据的存储是很重要的一部分,任何一个应用程序其实说白了就是在不停地和数据打交道。Android 系统中主要提供了四种方式用于简单地实现数据持久化功能,即文件存储、外部存储、SharedPreference 存储以及数据库存储。使用文件、SharedPreference 或数据库来保存数据会比外部存储相对更简单一些,而且比起将数据保存在 SD 卡中会更加的安全。
文件存储和 SharedPreferences存储毕竟只适用于去保存一些简单的数据和键值对,当需要存储大量复杂的关系型数据的时候,你就会发现以上两种存储方式很难应付得了。比如我们手机的短信程序中可能会有很多个会话,每个会话中又包含了很多条信息内容,并且大部分会话还可能各自对应了电话簿中的某个联系人。很难想象如何用文件或者SharedPreferences 来存储这些数据量大、结构性复杂的数据吧?但是使用数据库就可以做得到。
这里就来整理下SQLite的操作详解:
- 创建数据库:
首先我们需要知道 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()方法都不会再次执行,因此新添加的表也就无法得到创建了。
怎么解决呢?
那么就接着说我们的升级数据库了。
- 更新数据库 :
第一种方法:更新数据库,直接删除原有的数据库,然后再创建两个数据库:
@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用法详解(二)
将继续学习数据库的增删改查。
- Android数据库SQLite操作详解及LitePal用法详解(一)
- Android数据库SQLite操作详解及LitePal用法详解(二)
- Android数据库SQLite操作详解及LitePal用法详解(三)
- Android数据库SQLite操作详解及LitePal用法详解(四)
- android SQLite数据库开源框架LitePal的使用详解
- Android-SQLite数据库操作详解
- android SQLite数据库用法图文详解(附源码)
- Android 数据库框架LitePal使用详解
- Android LitePal数据库框架的使用详解
- Android Litepal数据库操作
- Android数据库(SQLite)框架(1)——创建表和LitePal的基本用法
- SQLite Android数据库详解
- Android数据库SQlite详解
- 神奇的 LitePal 操作数据库(一)
- Android数据库(SQLite)框架(5)——LitePal的修改和删除操作
- Android数据库SQLite使用详解一 : SQLiteOpenHelper详解
- 安卓数据库框架LitePal(一):SQLite命令
- Android 中数据库框架GreenDao与LitePal对比、集成、使用详解,greendao与原生SQLite性能对比
- array和list的排序算法对比(一):快速排序
- 策略模式
- Intent应用详解
- cocos2dx 基础
- Java的列表排序问题
- Android数据库SQLite操作详解及LitePal用法详解(一)
- linux下mysql的简单配置及监控
- 【ios】关于UIImageView的一个坑
- 内网穿透&UDP打洞
- Hibernate的单向N-N关联(四)
- 关于线程的一些概念和关于线程返回值的简单示例代码
- Apple Pay 详细教程
- Swift实现UITableViewCell的翻转效果
- java基础 创建xml文件