文档章节

文件存储

 梦想家Peng
发布于 2016/03/02 11:31
字数 1402
阅读 20
收藏 0

将数据以文件的形式存储在本地。

根据存储的位置不同,区分为:内部存储、外部存储、缓存存储。

内部存储:

表现为将文件存储在应用程序的数据文件夹(/data/data/应用程序的包名/)中的files文件夹中

使用openFileOutput()即可获取输出流,用于写出文件,或者使用openFileInput()获取输入流,用于读取文件。

以上这2个方法都是由ContextWrapper定义的方法。

关于内部存储的其它管理:

// 获取内部存储的目录,表现为 /data/data/包名/files

File dir = getFilesDir();

// 获取指定名称的文件夹

File docDir = getDir("doc", MODE_PRIVATE);

// 删除指定的文件

boolean isSuccess = deleteFile("hello.txt");

// 获取文件列表

String[] files = fileList();

内部存储的数据都是可以被清除的:在“应用”的管理界面里,可以选择“清除数据”,或者,在应用程序被卸载时清除。

外部存储:

表现为可以被任何应用程序访问到的位置,通常是/mnt/sdcard/下的文件夹,外部存储应该用于保存对私密性没有要求,且应用程序对它们没有依赖性的数据。

外部存储不是任何时候都可以用的。使用Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())可以进行判断。


缓存存储:

缓存适用于存储临时需要使用到的数据或文件,这些数据或文件可能在一段时间之后就没有存在的意义了。

缓存也区分为内部和外部。通过getCacheDir()方法可以获取内部缓存文件夹的File对象,通过getExternalCacheDir()方法可以获取外部缓存文件夹的File对象。


外部存储中的媒体文件

-------------------------

媒体文件:图片、音频、视频

Android系统具有扫描媒体文件的功能,当扫描到媒体文件时,将把文件的相关信息记录在数据库中。

在Android原生系统中,有各种媒体播放工具,例如:图库、音乐等,这些工具显示的数据并不直接来自于存储设备,而是从数据库中读取的。

MediaScannerConnection.scanFile(Context context, String[] paths, String[] mimeTypes, OnScanCompletedListener callback)方法可以通知扫描程序进行实时扫描。

SQLite数据库

数据库:存储数据的仓库,每一个数据库都可以存在多张数据表

数据表:具体存储数据的表,类似excel表格

常见的数据库有:MS SQL Server、MY SQL、Oracle……

SQLite并不是数据库服务器软件,在开发中,它表现为某1个文件。

查看SQLite数据文件的软件:SQLiteSpy、SQLiteExpert


SQLite

---------------------------

【初始化过程】

1. 创建数据库

2. 创建数据表

【访问数据流程】

1. 连接到(打开)数据库

2. 访问数据表


创建数据库

方法1:openOrCreateDatabase()


创建数据表

CREATE TABLE '表名' (设计字段列表);

字段列表的格式为:字段(列)名、数据类型、约束

创建数据表示例:

String sql = "CREATE TABLE 'student' (" +

"_id integer primary key autoincrement, " +

"stu_name varchar(16) not null, " +

"stu_phone_number varchar(16) not null unique" +

")";

注意:SQLite是非常轻量级的数据库,所以,SQLite对存储的数据类型要求是不严格的,但是,仍然推荐规范的使用SQLite数据库。

eg:

String name = "tedu.db";
		int mode = MODE_PRIVATE;
		CursorFactory factory = null;
		SQLiteDatabase db;
		db = openOrCreateDatabase(name, mode, factory);
		
		// 创建数据表
		String sql = "CREATE TABLE 'student' (" +
				"_id integer primary key autoincrement, " +
				"stu_name varchar(16) not null, " +
				"stu_phone_number varchar(16) not null unique" +
				")";
		db.execSQL(sql);

数据操作:增删改查

增:insert into '表名' (字段列表) values (值列表)

删:delete from '表名' where子句

改:update '表名' set 字段=值的赋值列表 where子句

查:select 字段列表 from '表名' where子句 排序 分页


使用SQLiteDatabase实现数据管理

insert()

  第1个参数:表名

  第2个参数:无视,当确保第3个参数为有效值时,第2个参数没有任何意义

  第3个参数:确定要增加的数据,第3个参数ContentValues对象必须至少调用过1次put方法,即可使得该参数是有效的

  返回值:新记录的ID,如果增加失败,则返回-1

  eg:

// 无视,当确保第3个参数为有效值时,第2个参数没有任何意义
String nullColumnHack = null;
// 确定要增加的数据
ContentValues values = new ContentValues();
values.put("stu_name", "Alex");
values.put("stu_phone_number", "010-88668866");
// 执行增加数据
long id = db.insert(table, nullColumnHack, values);
if (id != -1) {
Toast.makeText(this, "增加完成,id=" + id, Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(this, "增加失败,原因嘛,不知道", Toast.LENGTH_SHORT).show();
}

delete()

  第1个参数:表名

  第2个参数:where子句,其中各字段对应的值(例如_id=1)可以使用问号(?)表示,如果使用问号,则对应的值需要在第3个参数中体现

  第3个参数:第2个参数中各问号对应的值,如果第2个参数中没有问号,则第3个参数可以为null

  返回值:受影响的行数,即删除的条目数量

eg:

// delete from student where id>1
// delete from student where stu_name='Jack' and
// stu_phone_number='010-88886666'
// 第2个参数:where子句,其中各字段对应的值(例如_id=1)可以使用问号(?)表示,如果使用问号,则对应的值需要在第3个参数中体现
String whereClause = "stu_name=? and stu_phone_number=?";
// 第3个参数:第2个参数中各问号对应的值,如果第2个参数中没有问号,则第3个参数可以为null
String[] whereArgs = { "Jack", "027-66668888" };
int affectedRows = db.delete(table, whereClause, whereArgs);
if (affectedRows > 0) {
Toast.makeText(this, "删除完成,受影响的行数:" + affectedRows,
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "删除失败,没有符合删除条件的记录!", Toast.LENGTH_SHORT)
.show();
}


© 著作权归作者所有

共有 人打赏支持
上一篇: SQLite
下一篇: 单例模式
粉丝 0
博文 34
码字总数 15605
作品 0
深圳
私信 提问
OSS新特性:支持文件上传、复制时,指定Object的存储类型以及修改已有文件的存储类型

对象存储OSS发布新特性:文件上传、复制,支持指定Object的存储类型。用户在上传、复制文件时,可灵活地指定文件的存储类型为Standard、IA、Archive;用户也可以修改实时修改文件的存储类型,...

whj.
2018/10/31
0
0
[翻译]Android教程-保存数据-保存文件

来源: http://developer.android.com/training/basics/data-storage/files.html Android使用了一种类似于其它平台上基于磁盘文件系统的文件系统. 本节课描述了如何使用 File API在Android文...

LeoXu
2014/05/18
0
0
存储知识整理

一、数据存储类型 数据存储常见的类型有数据块存储、文件方式存储、对象存储。块存储和文件存储就是通常说的SAN和NAS,而对象存储(Object-based Storage)是一种新的网络存储架构,基于对象...

hncscwc
2016/03/07
397
2
对象存储、块存储、文件存储的区别

参考链接 http://www.infoq.com/cn/articles/virtual-forum-three-basic-issues-about-distributed-storage 分布式存储的应用场景相对于其存储接口,现在流行分为三种: 对象存储: 也就是通常...

墨持alvin
2018/01/11
0
0
对象存储文件系统简介

一、引言 高性能计算已由传统的主机方式逐渐向集群方式演变,如TOP500中,1998年只有2台系统是集群方式,而到2003年已有208台为集群系统。随着高性能计算体系结构的发展变化,传统的基于主机...

天夣
2013/07/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

金丝雀发布、滚动发布、蓝绿发布到底有什么差别?关键点是什么?

根据 2017 年的 DevOps 发展报告,高效能组织和低效能组织在软件交付的效率上有数量级上的差异。技术组织的软件交付能力是一种综合能力,涉及众多环节,其中发布是尤为重要的环节。 作为技术...

问题终结者
35分钟前
2
0
Kubernetes Client-go Informer 源码分析

几乎所有的Controller manager 和CRD Controller 都会使用Client-go 的Informer 函数,这样通过Watch 或者Get List 可以获取对应的Object,下面我们从源码分析角度来看一下Client go Informe...

阿里云官方博客
今天
4
0
传统IDC部署网站(三)

11. 重置密码 密钥和密码都支持远程登陆, 二选一 两个都可以登陆, 密钥相对于密码来说,相对安全一点 本地登陆无法是用密钥 修改密码 root 用户 passwd root 修改普通用户 passwd usernam...

miko0089
今天
6
0
bash特性

1.支持别名 alias 2.命令替换 $(COMMANS) 或者 `COMMAND` 3. bash支持的引号: `` :命令替换 "":弱引用,可以实现变量替换 '':强引用,不实现变量替换 4.文件名通配 globbing:(man 7 glo...

忙碌的小蜜蜂
今天
3
0
以语音评测的PC端demo代码为例,讲解口语评测如何实现

本文由云+社区发表 作者:腾讯智慧教育 概述 腾讯云智聆口语评测(英文版)(Smart Oral Evaluation-English,SOE-E)是腾讯云推出的语音评测产品,是基于英语口语类教育培训场景和腾讯云的语...

腾讯云加社区
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部