数据存储与访问之SQLite数据库 数据存储与访问之sqlite数据库的区别
suiw9 2024-10-28 18:33 28 浏览 0 评论
1.SQLite事务
简单点说就是:写在事务里的所有数据库操作都成功,事务提交,否则,事务回滚,就是回到前面 的状态——未执行数据库操作的时候!另外,前面我们也将了,在data/data/<包名>/database/目录 下除了有我们创建的db文件外,还有一个xxx.db-journal这个文件就是用来让数据库支持事务而 产生的 临时的日志文件!
2.SQLite存储大二进制文件
当然,一般我们很少往数据库中存储大二进制文件,比如图片,音频,视频等,对于这些我们一般 是存储文件路径,但总会有些奇葩的需求,某天你突然想把这些文件存到数据库里,下面我们以 图片为例子,将图片保存到SQLite中,以及读取SQLite中的图片!
3.SimpleCursorAdapter绑定数据库数据
当然,这个玩玩可以,还是不建议使用,尽管用起来很简单! 其实在讲ContentProvider我们就使用过这个东西来绑定联系人列表!这里就不写实例了, 直接上核心代码!需要的自己捣鼓捣鼓就好了,另外,现在我们一般很少自己写数据库的东西 ,一般是通过第三方的框架:ormlite,greenDao等,在进阶部分,我们会再来学习~
4.数据库升级的一些集锦
PS:好吧,这一块我并没有做过,始终是项目经验不够,公司的产品都是定位类的,刚看过公司 项目,发现前人留下的代码是:onCreate()创建DB,然后onUpgrade()把前面的DB删掉,然后 再调用onCreate()方法!看了几个版本的代码,发现并没有数据库升级的操作...没得借鉴, 只能参考下别人的做法了,下面是小猪查阅资料后的一些归纳,如果有什么不对,欢迎指出, 可能有些第三方的框架已经弄好了这个,时间关系,就不慢慢去考究了!知道可以留言,谢谢!
1)什么是数据库版本升级?怎么升级法?
答:假如我们开发了一款APP,里面用到了数据库,我们假定这个数据库版本为v1.0, 在这个版本,我们创建了一个x.db的数据库文件,我们通过onCreate()方法创建了第一个table, t_user,里面有两个字段:_id,user_id;后面我们想增加一个字段user_name,这个时候 我们就需要对数据库表的结构进行修改了,而我们可以把更新数据库的操作梵高onUpgrade() 方法中,我们只需要在实例化自定义SQLiteOpenHelper的时候,修改版本号,比如把1改成2 这样,就会自动调用onUpgrade()的方法了!另外,对于每个数据库版本我们都应该做好 相应的记录(文档),类似于下面这种:
数据库版本andoid对应版本内容v1.01第一个版本,包含两个字段...v1.12数据保留,新增user_name字段
2)一些疑问以及相关解决方案
①应用升级,数据库文件是否会删除?
答:不会!数据什么的都在!
②如果我想删除表中某个字段或者增加一个新的字段,原先的数据还在吗?
答:在的!
③你刚说的那种粗暴的更新数据库版本的方式,不保留数据的,可以贴下吗?
答:可以,这里用的是第三方的ormlite,你也可以自己写数据库创建以及删除的代码:
④比如是这种,假如我们已经升级到第三个版本了,我们在第二个版本增加了一个表, 然后第三个版本也增加了一个表,加入用户直接从第一个版本升级到第三个版本,这样 没经过第二个版本,就没有增加的那个表,这可怎么破?
答:很简单,我们可以在onUpgrade()里写一个switch(),结构如下:
public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource,
int arg2, int arg3) {
switch(arg2){
case 1:
db.execSQL(第一个版本的建表语句);
case 2:
db.execSQL(第二个版本的建表语句);
case 3:
db.execSQL(第三个版本的建表语句);
}
}
细心的你可能发现这里并没有写break,这就对了,这是为了保证跨版本升级时,每次数据库 修改都能全部执行到!这样可以保证表结构都是最新的!另外不一定是建表语句,修改表结构 也可以哦!
⑤旧表的设计太糟糕,很多字段要改,改动太多,想建一个新表,但是表名要一样 而且以前的一些数据要保存到新表中!
答:呵呵,给你跪了,当然,也有解决办法,下面说下思路:
1.将旧表改名成临时表: ALTER TABLE User RENAME TO _temp_User;
2.创建新表: CREATE TABLE User (u_id INTEGER PRIMARY KEY,u_name VARCHAR(20),u_age VARCHAR(4));
3.导入数据; INSERT INTO User SELECT u_id,u_name,"18" FROM _temp_User; //原表中没有的要自己设个默认值
4.删除临时表; DROP TABLE_temp_User;
本节小结:
好的,本节我们对SQLite的事务,大二进制存储,SimpleCursorAdapter以及数据库升级的 一些问题进行了探究,而关于SQLite的东西,我们暂时就学这么多,关于第三方的使用,以及 一些高深的话题,我们到进阶的时候再和大家一起去研究
相关推荐
- 设置文件的默认打开方式(如何设定文件的默认打开方式)
-
在操作系统中,设置文件的默认打开方式可以让特定类型的文件始终使用你选择的程序打开。以下是Windows和macOS系统中设置默认打开方式的详细步骤:Windows系统方法1:通过文件属性设置右键点...
- 电脑怎么设置默认浏览器(电脑怎么设置默认浏览器?)
-
在电脑上设置默认浏览器的步骤因操作系统不同而有所差异。以下是Windows和Mac系统的设置方法:Windows系统方法1:通过系统设置打开“设置”:...
- Java接口默认方法:灵活与约束并存
-
Java接口默认方法:灵活与约束并存在Java编程的世界里,接口作为定义行为规范的重要工具,一直扮演着举足轻重的角色。然而,在Java8引入了默认方法之后,接口的设计和使用方式发生了微妙的变化。今天...
- Java8新特性之默认方法:为接口注入灵魂
-
Java8新特性之默认方法:为接口注入灵魂Java8发布时,它带来的最大创新之一就是接口的默认方法。这就像给一个传统的木偶注入了生命,让它不仅能动还能说话了。今天我们就来聊聊这个让Java开发者欢呼雀...
- CentOS系统在不重启的情况下为虚拟机添加新硬盘
-
一、概述用过虚拟机的都知道,如果在系统运行的时候去给虚拟机添加一块新设备,比如说硬盘,系统是读取不到这个新硬盘的,因为系统在启动的时候会去检测硬件设备。但是我们也可能会遇到这样的情况,比如正在运行比较...
- [常用工具] 基于psutil和GPUtil获取系统状态信息
-
本文主要介绍在Python3中利用psutil库获取系统状态,利用GPUtil获取gpu状态。psutil(processandsystemutilities)(进程和系统实用程序)是一个跨平...
- Docker容器内执行宿主机指令(docker执行宿主机shell)
-
一背景最近项目有个需求,需要程序配置服务器IP并且可以重启服务器。如果程序直接部署在服务器,相信大家都会操作。但是程序是用docker运行的,在docker中执行指令就很麻烦了。...
- 容器网络调试怎么办?一条命令就搞定!
-
nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令。它位于util-linux包中。用途...
- linux自动化巡检脚本集(linux服务器巡检内容以及标准)
-
以下是一个自动化巡检脚本集的制作方案,包含常见系统检查项和可扩展框架,使用Python和Shell脚本实现:...
-
- 麒麟KOS|统信UOS系统添加新数据盘
-
原文链接:麒麟KOS|统信UOS系统添加新数据盘...
-
2025-03-26 16:57 suiw9
- Linux CentOS 7 根目录扩容(linux扩展根目录磁盘空间)
-
一、现状描述现有一台CentOS7的虚拟机,硬盘容量为30GB通过lsblk命令查看分区容量,当前根目录容量为27.5GB左右二、扩容需求...
- 从Linux底层分析Docker原理(linux docker-compose)
-
写在前面如果你觉得本人对你有帮助,请你记得评论,点赞,关注;如果你觉得文章还不错请记得收藏,点赞。如果你觉得文章非常的好可以私信我,我会在第一时间回复你。...
- CentOS新增硬盘的使用步骤(centos扩展硬盘)
-
一、查看机器所挂硬盘个数及分区情况,新增硬盘为/dev/sdb...
- Python之psutil库简介(python3 pil库)
-
psutil(pythonsystemandprocessutilities)是一个跨平台的第三方库,能够轻松实现获取系统运行的进程和系统利用率(包扩CPU、内存、磁盘、网络等)信息。它主...
- 运维,你还不会查看Linux系统cpu信息?
-
CPU也称为微处理器或简称为处理器。就像大脑如何控制人体一样,CPU控制着计算机的所有部分。因此CPU被认为是计算机的大脑。那我们怎么在Linux系统中查看如IntelCorei3、i5、AM...
你 发表评论:
欢迎- 一周热门
-
-
Linux:Ubuntu22.04上安装python3.11,简单易上手
-
宝马阿布达比分公司推出独特M4升级套件,整套升级约在20万
-
MATLAB中图片保存的五种方法(一)(matlab中保存图片命令)
-
别再傻傻搞不清楚Workstation Player和Workstation Pro的区别了
-
Linux上使用tinyproxy快速搭建HTTP/HTTPS代理器
-
如何提取、修改、强刷A卡bios a卡刷bios工具
-
Element Plus 的 Dialog 组件实现点击遮罩层不关闭对话框
-
日本组合“岚”将于2020年12月31日停止团体活动
-
SpringCloud OpenFeign 使用 okhttp 发送 HTTP 请求与 HTTP/2 探索
-
tinymce 号称富文本编辑器世界第一,大家同意么?
-
- 最近发表
- 标签列表
-
- dialog.js (57)
- importnew (44)
- windows93网页版 (44)
- yii2框架的优缺点 (45)
- tinyeditor (45)
- qt5.5 (60)
- windowsserver2016镜像下载 (52)
- okhttputils (51)
- android-gif-drawable (53)
- 时间轴插件 (56)
- docker systemd (65)
- slider.js (47)
- android webview缓存 (46)
- pagination.js (59)
- loadjs (62)
- openssl1.0.2 (48)
- velocity模板引擎 (48)
- pcre library (47)
- zabbix微信报警脚本 (63)
- jnetpcap (49)
- pdfrenderer (43)
- fastutil (48)
- uinavigationcontroller (53)
- bitbucket.org (44)
- python websocket-client (47)