• 【免费】全网独家:这是一份非常值得珍藏的Android知识体系!!!

一、为什么要会点SQLite?

SQLite作为一款轻量级的关系型数据库,占用的资源特别少,所以其应用场景也是特别的多。在移动开发中,我们经常会有将数据存储在本地的需求,此时SQLite将是我们最佳的选择。 可喜的是,SQLite已经被完美的集成在Android系统中,所以对于开发者而言,上手SQLite的难度又降低了不少。

二、开始玩玩SQLite

首先来说说在Android中操作SQLite数据库的整体思路:

1、自定义数据库操作辅助类,并继承自SQLiteOpenHelper类;
2、在Application中初始化SQLiteOpenHelper对象,并公开一个方法供其他类调用获取该对象;
3、根据SQLiteOpenHelper对象实例化SQLiteDatabase对象;
4、最后,我们拿SQLiteDatabase对象即可进行SQLite数据库的常规操作了。
复制代码

其实整个流程并不复杂,稍微来点耐心,动动手指头,再回头瞧瞧SQLite,“哇哦,操作你如此简单!”

1、自定义数据库操作辅助类,并继承自SQLiteOpenHelper类

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;/*** author:silencezwm on 16/6/20 06:43* email:silencezwm@gmail.com* description:数据库操作辅助类*/
public class DBHelper extends SQLiteOpenHelper {//数据库名称private static final String DBName = "study.db";//数据库版本号private static final int DBVersion = 1;//构造方法public DBHelper(Context context) {super(context, DBName, null, DBVersion);}@Overridepublic void onCreate(SQLiteDatabase db) {//创建表---studydb.execSQL("CREATE TABLE study ( _id integer PRIMARY KEY AUTOINCREMENT NOT NULL, bookName varchar, bookDesc varchar)");}/*** 数据库版本更新* @param db            数据库实例* @param oldVersion    旧版本号* @param newVersion    新版本号*/@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("DROP TABLE IF EXISTS study");onCreate(db);}
}
复制代码

该类继承了SQLiteOpenHelper,并实现了三个方法,其中onCreate()在数据库初始化时会调用,onUpgrade()方法只有在数据库新版本号大于旧版本号时才会调用,即进行数据库的更新操作。其中涉及到了常用SQL语句的书写,看不懂的童鞋得抽空脑补一下这方面的知识哦。

SQLiteOpenHelper有什么用?

该SQLiteOpenHelper是Android平台提供给我们的数据库辅助类,用于创建或打开数据库。
复制代码

2、在Application中初始化SQLiteOpenHelper对象,并公开一个方法供其他类调用获取该对象

考虑到整个应用中的不同地方都有可能涉及到数据库的操作,所以我们有必要将该类的初始化放在我们自定义的Application类中。就像该下:

public class MyApp extends Application {//数据库辅助类实例private static DBHelper mDBHelper;@Overridepublic void onCreate() {super.onCreate();mDBHelper = new DBHelper(getApplicationContext());}//返回DBHelper实例,public static DBHelper getmDBHelper(){return mDBHelper;}
}
复制代码

我们来看看初始化SQLiteOpenHelper类源码的实现方式

public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {this(context, name, factory, version, null);
}
复制代码

参数含义解析:

context:上下文对象,这里我们传入了ApplicationContext;
name:数据库名称,这里我们定义为"study.db";
factory:操作数据库后返回的默认Cursor对象,这里我们默认为null,后续需要保存返回的Cursor对象时,自己再进行构造;
version:数据库的版本号,初始版本号必须大于1,否则系统会抛IllegalArgumentException("Version must be >= 1, was " + version)异常。
复制代码

3、根据SQLiteOpenHelper对象实例化SQLiteDatabase对象

该操作将会让我们得到SQLiteDatabase对象,而一旦有了该对象,我们就可以进行数据库的增删改查操作了。该操作我们可以单独封装在某个类,同样也可以直接在某个Activity中实现。 核心代码如下:

//获取的数据库对象
//其中 getWritableDatabase() 和 getReadableDatabase() 区别???
SQLiteDatabase db = MyApp.getmDBHelper().getWritableDatabase();
//SQLiteDatabase db = MyApp.getmDBHelper(). getReadableDatabase();
复制代码

得到SQLiteDatabase实例有以上两种方法,两种方法的主要区别在于:

在数据库仅开放只读权限或磁盘已满时,getReadableDatabase只会返回一个只读的数据库对象。
复制代码

另外在我们每次初始化SQLiteDatabase对象时,系统都会进行数据库版本号的判断,该判断的核心代码如下(有兴趣的童鞋可以研究下getWritableDatabase()、getReadableDatabase()的源码实现):

//获取数据库版本号,默认为0
final int version = db.getVersion();//如果老版本号与新版本号不同if (version != mNewVersion) {//如果数据库为只读,系统则会抛出"SQLiteException"异常if (db.isReadOnly()) {throw new SQLiteException("Can't upgrade read-only database from version " +db.getVersion() + " to " + mNewVersion + ": " + mName);}//数据库开启事务db.beginTransaction();try {//表示数据库第一次创建,则会进入我们文章最上面自定义DBHelper类的onCreate()方法if (version == 0) {onCreate(db);} else {//如果旧版本号大于新版本号,数据库会”降级“,否则数据库会”升级“if (version > mNewVersion) {onDowngrade(db, version, mNewVersion);} else {onUpgrade(db, version, mNewVersion);}}//设置数据库的最新版本号db.setVersion(mNewVersion);//事务成功完成db.setTransactionSuccessful();} finally {//最后结束事务db.endTransaction();}}
复制代码

4、拿SQLiteDatabase对象进行SQLite数据库的常规操作

该下简略介绍两种操作方法:

1、使用SQL语句
2、使用Android封装好的方法
复制代码

我们在初始化SQLiteDatabase对象的时候,创建了一个数据库:study.db,并在数据库中创建了一个表:study,表中包含主键自增 _id , 还有两个字段:bookName、bookDesc。 该下代码实现了往数据库中插入、更新、查询、删除四种常用操作,此时你应该亲自动手试试...

    //插入数据case R.id.btn_insert://使用SQL语句if (useSQL) {db.execSQL("insert into study values(null, ?, ?)",new Object[]{et_insert_book_name.getText().toString(), et_insert_book_desc.getText().toString()});//使用Android封装的方法} else {//其中cv为ContentValues的实例cv.put("bookName", et_insert_book_name.getText().toString());cv.put("bookDesc", et_insert_book_desc.getText().toString());long isOK = db.insert("study", null, cv);//-1代表操作失败if (isOK == -1) {Toast.makeText(DBDemoActivity.this, "插入失败", Toast.LENGTH_SHORT).show();} else {Toast.makeText(DBDemoActivity.this, "插入成功", Toast.LENGTH_SHORT).show();}}break;//更新数据case R.id.btn_update:if (useSQL) {db.execSQL("update study set bookName = ? where bookName = ?", new String[]{et_update_new_book_name.getText().toString(), et_update_book_name.getText().toString()});} else {cv.put("bookName", et_update_new_book_name.getText().toString());int updateCount = db.update("study", cv, "bookName = ?", new String[]{et_update_book_name.getText().toString()});//更新后更新的个数,"0"表示更新失败if (updateCount != 0) {Toast.makeText(DBDemoActivity.this, "更新成功,共更新个数:" + updateCount, Toast.LENGTH_SHORT).show();} else {Toast.makeText(DBDemoActivity.this, "更新失败", Toast.LENGTH_SHORT).show();}}break;//查询操作case R.id.btn_query:if (useSQL) {Cursor cursor = db.rawQuery("select * from study", null);StringBuilder sb = new StringBuilder();for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {sb.append("总数:" + cursor.getCount() + "\\\\n" + "书名:" + cursor.getString(cursor.getColumnIndex("bookName"))+ "----该书简介:" + cursor.getString(cursor.getColumnIndex("bookDesc")));text_query_result.setText(sb.toString());}//记得进行关闭哦cursor.close();} else {//查询该表中所有数据Cursor c = db.query("study", null, null, null, null, null, null);StringBuffer sb = new StringBuffer();for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {sb.append("总数:" + c.getCount() + "\\\\n" + "书名:" + c.getString(c.getColumnIndex("bookName"))+ "----该书简介:" + c.getString(c.getColumnIndex("bookDesc")));text_query_result.setText(sb.toString());}//记得进行关闭哦c.close();}break;//删除操作case R.id.btn_del:if (useSQL) {db.execSQL("delete from study where bookName = ?", new String[]{et_del_book_name.getText().toString()});} else {db.delete("study", "bookName = ?", new String[]{et_del_book_name.getText().toString()});}break;
复制代码

三、SQLite说

”555...又被你看穿了“


  • 【免费】全网独家:这是一份非常值得珍藏的Android知识体系!!!

不会点SQLite,都不好意思说自己是开发的相关推荐

  1. OSChina 周日乱弹 ——不穿泳衣,我都不好意思上厕所

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2017)请戳(这里) [今日歌曲] @玉之丞  :分享筠子的单曲<立秋> <立秋>- ...

  2. 一位豪气的老板,送东西送到让客户都不好意思了,当天收款100万!

    做生意要想赚大钱,你必须首先把优惠给到客户,用真心,才能换真心. 就目前的社会环境来说,生意相比十年前,难做了许多,相比五年前,也难做许多. 一位豪气的老板,送东西送到让客户都不好意思了,当天收款10 ...

  3. python能干啥是什么意思_这年头不懂点Python都不好意思说是码农 神奇的Python都能干啥...

    原标题:这年头不懂点Python都不好意思说是码农 神奇的Python都能干啥 如果你在周末.有WIFI的房间里不知道做什么,不如学下Python吧.有了它,你可以什么都不需要! 基础需求篇 温饱与空 ...

  4. 没有表情包都不好意思说自己是年轻人——python一键保存几千张表情包图片

    现在年轻人聊天,不带点表情包都不好意思说自己是年轻人- 刚认识的朋友丢几个表情包出去分分钟拉进关系,女朋友生闷气了整两个表情包开心一下,也可以化解尴尬,没时间打字整两张表情包,礼貌而不失尴尬. 一.欲 ...

  5. 重庆大学计算机学院卓越班,没有重点班,都不好意思自称985

    原标题:没有重点班,都不好意思自称985 中国 大学超3000所,如何培养杰出人才? 大学早已行动起来了,超过50%的保研率,享受最优质的资源,有丰厚的奖学金--这些年,实验班.基地班.卓越工程师班不 ...

  6. 狠起来连自己都打,Adobe公司开发反PS软件,识别率达99%

    作者:蒋宝尚 来源:大数据文摘(ID:BigDataDigest) Photoshop是迄今为止世界上最畅销的图象编辑软件.它已成为许多涉及图像处理的行业的标准. PS的出生也颇有传奇色彩,它最初是由 ...

  7. 为什么很多公司都纷纷转型go语言开发?Go语言能做什么

    一.我们为什么选择Go语言 选择Go语言的原因可能会有很多,关于Go语言的特性.优势等,我们在之前的文档中也已经介绍了很多了.但是最主要的原因,应该是基于以下两方面的考虑: 执行性能 缩短API的响应 ...

  8. 任何人都可以胜任全栈开发?

    什么样的人能够被称之为全栈工程师? 作者 | Alon Bar David 译者 | 弯月,责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 最近,每当我谈论起全栈开发时,很多人都深表怀疑 ...

  9. 这些代号1024的论坛,我听得都不好意思了(突然害羞.jpg)

    杨净 发自 凹非寺  量子位 报道 | 公众号 QbitAI 最近,圈内AI开发者社群,气氛怪怪的. 他们一个个聊天,老是说着1024,1024的. 像是某种暗语.代号一样,起初我还没咋当回事. 然鹅 ...

最新文章

  1. Docker_Swarm集群系统
  2. 感动!盲人计算机科学家研发语音浏览器,致力科技改善盲人生活
  3. 业务智能 ETL 设计实施策略(转载)
  4. Tensorflow分批量读取tfrecords
  5. kaggle-Santander 客户交易预测总结
  6. linux centos查看CPU型号及物理CPU个数
  7. jQueryHTMLCSS3实现垂直手风琴折叠菜单方法讲解
  8. 注释和简单用户交互程序
  9. Ajax — 图书管理
  10. 动态规划训练17 [Super Jumping! Jumping! Jumping! HDU - 1087 ]
  11. 【转】DPDK(一):专业术语
  12. java ajax传递到action_ajax传值到action,后台取不到值。
  13. hexo搭建个人博客_hexo 搭建个人博客
  14. 使用ffmpeg转换webm格式到MP4格式
  15. 在电脑上如何用桌面便签进行日程管理?
  16. Android APK 修改
  17. 什么是CBR,VBV和CPB
  18. Openwrt无线中继AP设置教程
  19. d630 无线驱动 linux,DELL D630安装CentOS6的无线网卡驱动
  20. 如何使用智遥工作流为SAP节省License实例

热门文章

  1. install java 8_Install Java 8 on Ubuntu
  2. 6_机器翻译与Seq2Seq模型
  3. python的动态参数
  4. html 源码_HTML从零开始——简单介绍
  5. php retoken,laravel 5.5 关闭token的3种实现方式
  6. .mvn 需要放git上吗_汽车行李架上可以放东西吗?放了东西可以跑高速吗?
  7. java读取sh脚本_linux环境下java读取sh脚本并执行
  8. Python案例:求满足条件的人数
  9. JDBC连接MySQL数据库:建立SSL连接出现警告信息
  10. 2019年Java Web学习笔记目录