Android Sqlite数据库详解
在整理ContentProvider知识点之前要先整理Sqlite数据库的知识,因为ContentProvider中要使用到数据库。
步入正题:Sqlite的起源是一艘军舰上,一个数据库程序员觉得潜艇正在使用的数据库太过强大,每次更新升级操作复杂,耗时,效率不高。然后就想优化,目标就是设计出一个结构功能简单,操作简单,独立性强的数据库,因为也是开源的,之后就在开源社区流行起来,很多开发者都开始使用sqlite数据库。很适合手机移动端
定义:Sqlite是是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,是为了嵌入式系统。
特点:体积小,轻量级,独立不依赖其他,简洁。效率高。
Sqlite数据库的数据类型:android sqlite支持的数据类型_seekrg的博客-CSDN博客 看到这位介绍的还不错就不做赘述了,未考证其内容,请谨慎参考。
最新出现了一个新的数据库 ,GreenDAO团队出了一个基于对象的数据库处理库ObjectBox,不再是sqlite数据库,速度快,使用方便,不用数据库版本更新。新项目应该拥抱ObjectBox,旧项目的greendao也可以转objectbox。可以去官网看使用文档,当你掉进坑里的时候,可以看一下我另一篇文章:Android ObjectBox 数据库避坑Duplicate files copied in APK lib/armeabi-v7a/libobjectbox.so_Android_周志豪378623234的博客-CSDN博客
1.Sqlite数据库的创建
继承SqliteOpenHelper 数据库助手类,重写onCreate方法,创建表的语句就写在这里
package com.zhouzhihao.test.database;import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Build;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;/*** description:** @author zhouzhihao* @time 2020/12/4 0004*/
public class DbHelper extends SQLiteOpenHelper {public DbHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);}public DbHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version, @Nullable DatabaseErrorHandler errorHandler) {super(context, name, factory, version, errorHandler);}@RequiresApi(api = Build.VERSION_CODES.P)public DbHelper(@Nullable Context context, @Nullable String name, int version, @NonNull SQLiteDatabase.OpenParams openParams) {super(context, name, version, openParams);}@Overridepublic void onCreate(SQLiteDatabase db) {String sql="create table user (id integer primary key autoincrement, name text(4),address text(5))";db.execSQL(sql);//版本4改动String sql1="create table testid (_id integer primary key autoincrement, name text(4))";db.execSQL(sql1);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {switch (newVersion){case 2://版本2改动,没有break 所以版本4改动也会一层层执行case 4://版本4改动String sql1="create table testid (_id integer primary key autoincrement, name text(4))";db.execSQL(sql1);}}
}
使用数据库的类中调用,test是数据库名称,4是版本号
dBhelper=new DbHelper(this,"test",null,4);
2.增删改查
SQLiteDatabase dataBase = dBhelper.getWritableDatabase();try {//创建存放数据的ContentValues对象ContentValues values = new ContentValues();values.put("name","zhou");//数据库执行插入命令dataBase.insert("user", null, values);String name="lili",address="广东省广州市";String sql="insert into user (name,address) values ('"+name+"','"+address+"')";dataBase.execSQL(sql);//删除//方式二dataBase.delete("user", "name = ? or address = ?", new String[]{"zhouzhihao"});String sql1="delete from user where name='lili'";dataBase.execSQL(sql1);//修改ContentValues contentValues=new ContentValues();contentValues.put("address","河南焦作");dataBase.update("user",contentValues, "name=?",new String[]{"zhou"});//方式二String sql2="update user set address='广东' where name='zhou'";dataBase.execSQL(sql2);//查看Cursor cursor=dataBase.rawQuery("select * from user",null);//方式二cursor=dataBase.query("user",new String[]{"id","name","address"},"id=?",new String[]{"11"},null,null,null,null);ArrayList<User> dats = new ArrayList<>();while (cursor.moveToNext()) {User user = new User();int id = cursor.getInt(cursor.getColumnIndex("id"));String name_temp = cursor.getString(cursor.getColumnIndex("name"));String address_temp = cursor.getString(cursor.getColumnIndex("address"));user.setId(id);user.setName(name_temp);user.setAddress(address_temp);dats.add(user);}cursor.close();
记得cursor 调用close关闭,释放资源。
3.数据库版本更新维护
重点分析:onCreate 只在版本创建的时候调用,onUpgrade 只在数据库更新时调用,所以会有版本1升级成版本2,版本2升级成版本4,版本1升级成版本4,直接装上去就是版本4等诸多情况
我们的目的就是使所有情况在代码执行完,数据库都是完整的两张表,那么就要再onCreate和onUpgrade 存在两份相同的代码,但用户的各种情况只会执行一份。注意:switch后面的case没有break,这样才不会出现跨版本更新时,有部分代码漏掉的情况。
@Overridepublic void onCreate(SQLiteDatabase db) {String sql="create table user (id integer primary key autoincrement, name text(4),address text(5))";db.execSQL(sql);//版本4改动String sql1="create table testid (_id integer primary key autoincrement, name text(4))";db.execSQL(sql1);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {switch (newVersion){case 2://版本2改动,没有break 所以版本4改动也会一层层执行case 4://版本4改动String sql1="create table testid (_id integer primary key autoincrement, name text(4))";db.execSQL(sql1);}}
最后,最后安利一下Android Studio 的数据库查看工具,太好用了,很多人不知道新版更新了这个功能:
Android Sqlite数据库详解相关推荐
- Android Room 数据库详解
一.前言 数据库是 Room 的三大组件之一,数据库是用来存储数据的,是 Room 中必不可少的一部分.本篇幅将详细讲解 Room 数据库相关的内容(对于数据库的基本使用请参阅:Android Roo ...
- android sqlite 类使用,Android SQLite编程详解(不使用SQLiteOpenHelper类)
数据库功能非常强大,使用起来也非常方便,SQLite数据库的一般操作包括:创建数据库.打开数据库.创建表.向表中添加数据.从表中删除数据.修改表中的数据.关闭数据库.删除指定表.删除数据库和查询表中的 ...
- Android SQLite编程详解
SQLite 数据库功能非常强大,使用起来也非常方便,SQLite数据库的一般操作包括:创建数据库.打开数据库.创建表.向表中添加数据.从表中删除数据.修改表中的数据.关闭数据库.删除指定表.删除数据 ...
- android 数据库表格数据库数据库中,Android SQLite数据库中的表详解
Android SQLite数据库 前言 以前写PHP的时候,内置了print_r()和var_dump()两个函数用于打印输出任意类型的数据内部结构,现在做Android的开发,发现并没有这种类似的 ...
- JMessage Android 端开发详解
JMessage Android 端开发详解 目前越来越多的应用会需要集成即时通讯功能,这里就为大家详细讲一下如何通过集成 JMessage 来为你的 App 增加即时通讯功能. 首先,一个最基础的 ...
- 《Java和Android开发实战详解》——1.2节Java基础知识
本节书摘来自异步社区<Java和Android开发实战详解>一书中的第1章,第1.2节Java基础知识,作者 陈会安,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...
- Android中AMS工作原理,Android AMS启动详解
启动 在Android系统启动流程中中我们提到过,AMS是在system_service中启动的, //frameworks/base/services/java/corri/android/serv ...
- Android系统目录结构详解
Android系统基于linux内核.JAVA应用,算是一个小巧精致的系统.虽是开源,但不像Linux一般庞大,娇小可亲,于是国内厂商纷纷开发出自己基于Android的操作系统.在此呼吁各大厂商眼光放 ...
- [Android]多进程知识点详解
作者:Android开发_Hua 链接:https://www.jianshu.com/p/e0f833151f66 多进程知识点汇总: 一:了解多进程 二:项目中多进程的实现 三:多进程的优缺点与使 ...
最新文章
- ***CSS魔法堂:选择器及其优先级
- A SPI class of type org.apache.lucene.codecs.PostingsFormat with name 'Lucene40' does not exist.
- 使用sql语句,查询 mysql 的安装地址
- 【程序员面试宝典】强制类型转换之面试例题2
- 【Python 2 到 3 系列】 print 是函数
- sql网站路径php,如何在源码中找出sql语句的位置呢
- .net core Entity Framework Core Code First 框架 分层开发
- Memcached总结
- 雨课堂知识点总结(七)
- 看图说话,FastJson 并没有那么流行!
- 微信小程序(底部导航)
- Sublime 编译汇编程序
- python控制电脑休眠唤醒键_使用Python实现Wake On Lan远程开机功能
- BP神经网络(Back Propagation Neural Network)Matlab简单实现
- 虚拟机上装oracle,cmd窗口输入法有问题,按了U,I,O,P,J,K,L,M这些键为什么不是UIOPJK
- 移动端实现图标拖拽效果
- 周末作业——循环练习题
- 基于Python的人机博弈象棋游戏的设计与实现
- Alpha阶段敏捷冲刺②
- Spring声明式事务管理的配置详解