数据存储之-SQLite数据库二

简介: 数据存储之-SQLite数据库二

1.SQLite事务


20160311004157444.png

简单点说就是:写在事务里的所有数据库操作都成功,事务提交,否则,事务回滚,就是回到前面 的状态——未执行数据库操作的时候!另外,前面我们也将了,在data/data/<包名>/database/目录 下除了有我们创建的db文件外,还有一个xxx.db-journal这个文件就是用来让数据库支持事务而 产生的 临时的日志文件!


2.SQLite存储大二进制文件


当然,一般我们很少往数据库中存储大二进制文件,比如图片,音频,视频等,对于这些我们一般 是存储文件路径,但总会有些奇葩的需求,某天你突然想把这些文件存到数据库里,下面我们以 图片为例子,将图片保存到SQLite中,以及读取SQLite中的图片!


20160311004312858.png

3.SimpleCursorAdapter绑定数据库数据


当然,这个玩玩可以,还是不建议使用,尽管用起来很简单! 其实在讲ContentProvider我们就使用过这个东西来绑定联系人列表!这里就不写实例了, 直接上核心代码!需要的自己捣鼓捣鼓就好了,另外,现在我们一般很少自己写数据库的东西 ,一般是通过第三方的框架:ormlite,greenDao等,在进阶部分,我们会再来学习~

20160311004354905.png


4.数据库升级的一些集锦

1)什么是数据库版本升级?怎么升级法?


答:假如我们开发了一款APP,里面用到了数据库,我们假定这个数据库版本为v1.0, 在这个版本,我们创建了一个x.db的数据库文件,我们通过onCreate()方法创建了第一个table, t_user,里面有两个字段:_id,user_id;后面我们想增加一个字段user_name,这个时候 我们就需要对数据库表的结构进行修改了,而我们可以把更新数据库的操作梵高onUpgrade() 方法中,我们只需要在实例化自定义SQLiteOpenHelper的时候,修改版本号,比如把1改成2 这样,就会自动调用onUpgrade()的方法了!另外,对于每个数据库版本我们都应该做好 相应的记录(文档),类似于下面这种:

20160311004605977.png


2)一些疑问以及相关解决方案

①应用升级,数据库文件是否会删除?

答:不会!数据什么的都在!


②如果我想删除表中某个字段或者增加一个新的字段,原先的数据还在吗?

答:在的!

③你刚说的那种粗暴的更新数据库版本的方式,不保留数据的,可以贴下吗?

答:可以,这里用的是第三方的ormlite,你也可以自己写数据库创建以及删除的代码:


20160311004710040.png


④比如是这种,假如我们已经升级到第三个版本了,我们在第二个版本增加了一个表, 然后第三个版本也增加了一个表,加入用户直接从第一个版本升级到第三个版本,这样 没经过第二个版本,就没有增加的那个表,这可怎么破?

答:很简单,我们可以在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;

相关文章
|
2月前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在9月20日2024云栖大会上,阿里云智能集团副总裁,数据库产品事业部负责人,ACM、CCF、IEEE会士(Fellow)李飞飞发表《从数据到智能:Data+AI驱动的云原生数据库》主题演讲。他表示,数据是生成式AI的核心资产,大模型时代的数据管理系统需具备多模处理和实时分析能力。阿里云瑶池将数据+AI全面融合,构建一站式多模数据管理平台,以数据驱动决策与创新,为用户提供像“搭积木”一样易用、好用、高可用的使用体验。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
|
11天前
|
数据采集 数据库 Python
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
121 75
|
2月前
|
存储 监控 数据处理
flink 向doris 数据库写入数据时出现背压如何排查?
本文介绍了如何确定和解决Flink任务向Doris数据库写入数据时遇到的背压问题。首先通过Flink Web UI和性能指标监控识别背压,然后从Doris数据库性能、网络连接稳定性、Flink任务数据处理逻辑及资源配置等方面排查原因,并通过分析相关日志进一步定位问题。
229 61
|
24天前
|
SQL 存储 运维
从建模到运维:联犀如何完美融入时序数据库 TDengine 实现物联网数据流畅管理
本篇文章是“2024,我想和 TDengine 谈谈”征文活动的三等奖作品。文章从一个具体的业务场景出发,分析了企业在面对海量时序数据时的挑战,并提出了利用 TDengine 高效处理和存储数据的方法,帮助企业解决在数据采集、存储、分析等方面的痛点。通过这篇文章,作者不仅展示了自己对数据处理技术的理解,还进一步阐释了时序数据库在行业中的潜力与应用价值,为读者提供了很多实际的操作思路和技术选型的参考。
40 1
|
29天前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
1月前
|
前端开发 JavaScript 数据库
获取数据库中字段的数据作为下拉框选项
获取数据库中字段的数据作为下拉框选项
59 5
|
30天前
|
存储 数据采集 数据挖掘
CSV vs 数据库:数据存储的最佳选择是什么
本文介绍了爬虫数据存储中CSV和数据库的优缺点,分析了两者在不同场景下的适用性。CSV简单易用、资源消耗低,适合小量数据;数据库则在处理大量数据和复杂查询时表现出色,支持并发操作。通过Python代码示例,展示了如何使用多线程和爬虫代理IP技术将百度搜索数据存储到MySQL数据库中,适用于大型项目和复杂数据分析需求。
|
1月前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
278 15
|
2月前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
234 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
2月前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据