文档章节

文件存储

 梦想家Peng
发布于 2016/03/02 11:31
字数 1402
阅读 19
收藏 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();
}


© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 34
码字总数 15605
作品 0
深圳
文件、块、对象存储类型了解

块存储和文件存储是我们比较熟悉的两种主流的存储类型,就是我们通常所说的SAN和NAS。在安防监控领域的以IPSAN和IPNAS最为常见。而对象存储(Object-Based Storage)是一种新兴的存储架构,基...

莫问viva
2016/03/21
143
0
存储知识整理

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

hncscwc
2016/03/07
397
2
[翻译]Android教程-保存数据-保存文件

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

LeoXu
2014/05/18
0
0
捷讯技术分析块存储、文件存储、对象存储的区别和应用场景

关于块存储、文件存储和对象存储,大家一定都不陌生,只是对于三者的本质区别和应用场景可能还不是很了解,今天阿里云湖北授权服务中心捷讯技术的小编就给大家简单单的聊聊吧。 一、块存储 ...

捷讯技术17
07/19
0
0
对象存储、块存储、文件存储的区别

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

墨持alvin
01/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在...

红薯
今天
3
0
C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
今天
3
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
今天
2
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
今天
3
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部