文件存储
文件存储
梦想家Peng 发表于2年前
文件存储
  • 发表于 2年前
  • 阅读 9
  • 收藏 0
  • 点赞 1
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

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

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

内部存储:

表现为将文件存储在应用程序的数据文件夹(/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
博文 33
码字总数 15605
×
梦想家Peng
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: