Android——数据存储(一)(二十一)

news2024/11/27 12:39:17

1. 数据存储

1.1 知识点

(1)掌握Android数据存储的分类;

(2)可以使用SharedPreferences存储数据。

1.2 具体内容

对于我们数据的存储而言,Android一共提供了5个数据存储的方式:SharedPreferences存储、文件存储方式、Sqlite存储、Content Provider存储、网络存储。

在Android之中操作,都需要使用Activity程序进行支持,本次课程我们只关注操作方法,所有不做过多的页面展示。

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <LinearLayout 
        android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:orientation="horizontal"
        >
        <TextView
            android:layout_width="wrap_content"
       	 	android:layout_height="wrap_content"
       	 	android:text="请输入键:"
            />
        <EditText
            android:id="@+id/usernameKey"
	        android:layout_width="200px"
	        android:layout_height="wrap_content" />
    </LinearLayout>
     <LinearLayout 
        android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:orientation="horizontal"
        >
        <TextView
            android:layout_width="wrap_content"
       	 	android:layout_height="wrap_content"
       	 	android:text="请输入值:"
            />
        <EditText
            android:id="@+id/username"
	        android:layout_width="200px"
	        android:layout_height="wrap_content" />
    </LinearLayout>
	<Button 
	    android:id="@+id/mybut"
	    android:layout_width="match_parent"
       	android:layout_height="wrap_content"
       	android:text="保存"
	    />
</LinearLayout>

现在的关键问题就在于编写Activity程序。

package com.example.sharedpreferences;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.TextView;

public class SharedPreferencesActivity extends Activity {
	private TextView username = null;
	private TextView age = null;
	public static final String FILMNAME = "wanczy";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.activity_shared_preferences);
		this.age = (TextView) super.findViewById(R.id.age);
		this.username = (TextView) super.findViewById(R.id.username);
		SharedPreferences share = super.getSharedPreferences(FILMNAME, Activity.MODE_PRIVATE);
		this.username.setText("用户名:"+ share.getString("username", "无所谓默认值"));//根据键取得值并放入到TextView中
		this.age.setText("年龄:"+ share.getInt("年龄",0));
	}
 

}
 

和在Java中使用属性存储操作上有相似之处,但是Java中的属性存储已经过时,现在存储比较流行的是xml存储。此时程序就已经完成了,默认情况下,存储文件都会保存在手机里面,后缀为.xml,现在程序已经可以保存,当然也可以读取咯。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/age"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>
package com.example.sharedpreferences;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.TextView;

public class SharedPreferencesActivity extends Activity {
	private TextView username = null;
	private TextView age = null;
	public static final String FILMNAME = "wanczy";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.activity_shared_preferences);
		this.age = (TextView) super.findViewById(R.id.age);
		this.username = (TextView) super.findViewById(R.id.username);
		SharedPreferences share = super.getSharedPreferences(FILMNAME, Activity.MODE_PRIVATE);
		this.username.setText("用户名:"+ share.getString("username", "无所谓默认值"));//根据键取得值并放入到TextView中
		this.age.setText("年龄:"+ share.getInt("age",0));
	}
 

}

对于SharedPreferences存储而言,并没有太多复杂操作,实际应用当中,使用SharedPreferences可以保存一些配置信息:例如,你正在看小说,希望关闭之后,下次打开能够在你最后浏览的进度点,那么这种情况下就可以使用SharedPreferences进行保存 。

1.3 小结

(1)SharedPreferences可以实现简单的数据存储功能实现,可以利用super.getSharedPreferences()方法取得实例;

2. 文件存储

2.1 知识点

(1)掌握Activity对文件存储的若干操作;

(2)可以实现文件的保存和读取操作。

2.2 具体内容

对于文件存储这块,必须要先掌握IO的基本操作,InputStream,OutputStream。

了解一下IO流对文件的操作:

·使用File找到一个指定的文件

·使用字节流或者字符流的子类为父类进行实例化

·完成输入/输出的操作

·关闭流

举例:向文件中写入内容—输出,我们的输入输出是对于程序而言。

范例:本次还是以文件保存为主,不再进行页面的编写。

package com.example.filesave;

import java.io.FileOutputStream;
import java.io.PrintStream;

import android.app.Activity;
import android.os.Bundle;

public class FileSaveActivity extends Activity {
	public static final String FILENAME = "wanczy.txt";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.activity_file_save);
		FileOutputStream output = null;
		PrintStream out = null;
		try {
			output = super.openFileOutput(FILENAME, Activity.MODE_PRIVATE);//使用Activity提供的方法创建了一个文件字节输出流
			//在IO操作中,打印流操作是最方便的
			out = new PrintStream(output);
			out.print("姓名:毛栗子");
			out.print("年龄:30");
			out.print("地址:兰州市庆阳路128号");
		} catch (Exception e) {
		} finally{
			out.close();
		}
	}
}

那么现在既然可以写入内容到文件,当然我们也可以将内容从文件中拿出来,那么对于读取文件,那肯定需要将文件内容放入到TextView中显示。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView
        android:id="@+id/msg"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

以后的读取的内容就放在msg这个文本显示组件上,如果大家学习过Java的话,应该很清楚,使用PrintStream对于输出来说很方便,对于输入呢,使用什么最方便呢?使用扫描类肯定是最方便的,就是Scanner

package com.example.filesave;

import java.io.FileInputStream;
import java.util.Scanner;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class FileSaveActivity extends Activity {
	private static final String FILENAME = "wanczy.txt";
	private TextView msg = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.activity_file_save);
		this.msg = (TextView) super.findViewById(R.id.msg);
		FileInputStream input = null;
		Scanner sc = null;
		try {
			input = super.openFileInput(FILENAME);//使用Activity提供的方法创建了一个文件字节输出流
			//在IO操作中,打印流操作是最方便的
			sc = new Scanner(input);
			String content = sc.next();//读取数据
			this.msg.setText("读取的信息为:"+content);
		} catch (Exception e) {
		} finally{
			sc.close();
		}
	}
}

以上的这种写法就是比较标准的程序。

范例:向SD卡上保存文件

package com.example.filesave;

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;

import android.app.Activity;
import android.os.Bundle;

public class FileSaveActivity extends Activity {
	public static final String FILENAME = "/mnt/sdcard/wanczy/jjm/wanczy.txt";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.activity_file_save);
		FileOutputStream output = null;
		PrintStream out = null;
		try {
			File file = new File(FILENAME);
			if(!file.getParentFile().exists()){//如果文件夹不存在
				file.mkdirs();
			}
			output = new FileOutputStream(file,true);//表示创建了一个文件的字节输出流 ,这种写法不能进行文件内容的追加
			//在IO操作中,打印流操作是最方便的
			out = new PrintStream(output);
			out.print("姓名:毛栗子");
			out.print("年龄:30");
			out.print("地址:兰州市庆阳路128号");
		} catch (Exception e) {
		} finally{
			if(null != out){
				out.close();
			}
		}
	}

}

范例:向SD卡上保存文件

现在虽然程序写好了,既然是对SD card的操作,那么一定需要具备操作sdcard的权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

现在我们只需要使用此类去判断sdcard是否存在。

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//表示存储目录能够进行你读写操作
			System.out.println("表示sdcard存在");
		}
package com.example.filesave;

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.widget.Toast;

public class FileSaveActivity extends Activity {
	public static final String FILENAME = "/mnt/sdcard/wanczy/jjm/wanczy.doc";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.activity_file_save);
		if (Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED)) {// 表示存储目录能够进行你读写操作
			FileOutputStream output = null;
			PrintStream out = null;
			try {
				File file = new File(FILENAME);
				if (!file.getParentFile().exists()) {// 如果文件夹不存在
					file.mkdirs();
				}
				output = new FileOutputStream(file, true);// 表示创建了一个文件的字节输出流
															// ,这种写法不能进行文件内容的追加
				// 在IO操作中,打印流操作是最方便的
				out = new PrintStream(output);
				out.print("《幽窗小记》 宠若不惊 闲看庭前花开花落 去留无意 漫随天外云卷云舒");
			} catch (Exception e) {
			} finally {
				if (null != out) {
					out.close();
				}
			}
		}else{
			Toast.makeText(this, "sdcard不存在,请使用其他保存路径", Toast.LENGTH_SHORT).show();
		}
	}

}

这个程序更加适合在真机上进行操作。现在已经完成输出的功能,现在进行一些输入的显示。

package com.example.filesave;

import java.io.File;
import java.io.FileInputStream;
import java.util.Scanner;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.widget.TextView;
import android.widget.Toast;

public class FileSaveActivity extends Activity {
	private static final String FILENAME = "wanczy.doc";
	private static final String DIR = "CSDN/mlz";
	private TextView msg = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.activity_file_save);
		this.msg = (TextView) super.findViewById(R.id.msg);
		if (Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED)) {
			FileInputStream input = null;
			Scanner sc = null;
			try {
				File file = new File(Environment.getExternalStorageDirectory().toString()+File.separator+DIR+File.separator+FILENAME);
				input = new FileInputStream(file);
				sc = new Scanner(input);
				while(sc.hasNext()){
					this.msg.append( sc.next());
				}
			} catch (Exception e) {
			} finally {
				sc.close();
			}
		}else{
			Toast.makeText(this, "sdcard不存在,请使用其他保存路径", Toast.LENGTH_SHORT).show();
		}
	}
}

以上保存在sdcard的程序与之前的不保存在sdcard并没有本质的区别。

package com.example.filesave;

import java.io.InputStream;
import java.util.Scanner;

import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.widget.TextView;

public class FileSaveActivity extends Activity {
	private TextView msg = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.activity_file_save);
		this.msg = (TextView) super.findViewById(R.id.msg);
		Resources res = super.getResources();//取得Resources对象
		InputStream in = res.openRawResource(R.raw.wanczy);//将资源文件加入到字节输入流、
		Scanner sc = null;
		StringBuffer sb = new StringBuffer();
		try {
			sc = new Scanner(in);
			while(sc.hasNext()){
				sb.append(sc.next()+"\n");
			}
		}catch(Exception e){
			
		}finally{
			sc.close();
		}
		this.msg .setText(sb.toString());
	}
	
}

2.3 小结

(1)使用文件存储可以保存更加丰富的数据;

(2)在Android之中可以使用XML的DOM和SAX解析方式进行文件操作;

(3)在Android之中提供了PULL解析用于完成XML解析;

(4)JSON可以进行简便的信息传送,性能更高;

(5)可以将要读取的文件配置到项目的res文件目录之中,这样可以采用Resource直接进行资源文件的读取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/979683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Swift 另辟蹊径极速生成图片的缩略图

功能需求 在 App 开发中,创建图片缩略图是一种很常见的操作。但是超大图片如何快速且便捷的生成指定尺寸的缩略图呢? 如上图所示:我们极速生成缩略图比常规方式快了将近 27 倍之多!且生成代码没有用任何第三方库,完全是  原生实现。 在上面演示中包含几张数码相机原始…

huggingface 使用入门笔记

概念 Hugging Face Hub​​和 Github 类似&#xff0c;都是Hub(社区)。Hugging Face可以说的上是机器学习界的Github。Hugging Face为用户提供了以下主要功能&#xff1a; ​模型仓库&#xff08;Model Repository&#xff09;​​&#xff1a;Git仓库可以让你管理代码版本、…

动态规划区间dp之647回文子串

题目&#xff1a; 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 示例&#xff1a; 题目链接&#xff1a;647.…

Android 线程池源码详解(一)

线程池的创建是通过Executors 构造出来的&#xff0c;这是个典型的工厂类&#xff0c;使用了工厂模式。常用的有四种线程池&#xff1a; 分别是newFixedThreadPool&#xff0c;newSingleThreadExecutor&#xff0c; newCachedThreadPool&#xff0c;newScheduledThreadPool&am…

小白备战大厂算法笔试(二)——数组、链表、列表

常见数据结构 常见的数据结构包括数组、链表、栈、队列、哈希表、树、堆、图&#xff0c;它们可以从“逻辑结构”和“物理结构”两个维度进行分类。 逻辑结构可被分为“线性”和“非线性”两大类。线性结构比较直观&#xff0c;指数据在逻辑关系上呈线性排列&#xff1b;非线…

制药行业常见生产设备有哪些?

制药行业是一个关系到人民健康和生命安全的特殊领域&#xff0c;因此&#xff0c;生产质量和合规性是至关重要的。为了满足严格的生产质量管理规范&#xff08;GMP&#xff09;要求&#xff08;>>制药行业GMP是什么&#xff1f;&#xff09;&#xff0c;制药企业需要使用…

公司办公文件加密防泄密软件哪个好?

天锐绿盾是一款专业的数据安全解决方案&#xff0c;旨在保护企业的核心数据。它采用基于Windows、Mac、Linux内核的文档透明加解密技术&#xff0c;对指定类型的文件进行实时、强制、透明加密&#xff0c;使得文件在操作时自动解密&#xff0c;关闭时自动加密&#xff0c;能够有…

基于物理层网络编码的相位同步算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..........................................................................%数据长度 Len…

前端(十七)——gitee上开源一个移动端礼盒商城项目(前端+后台)

&#x1f917;博主&#xff1a;小猫娃来啦 &#x1f917;文章核心&#xff1a;gitee上开源一个移动端礼盒商城项目 文章目录 前言开源地址项目运行命令项目基本展示前端效果细节展示视频前端代码细节展示视频后台效果展示后台代码展示经典优势思维导图实现思路 前言 项目样式老…

Redux中间件源码解析与实现

基本介绍 本文中涉及到的关键npm包的版本信息如下&#xff1a; react 的版本为18.2.0 redux的版本为4.1.2 redux-thunk版本为2.4.2 redux-promise版本为0.6.0 redux-logger版本为3.0.6 在Redux源码解析与实现&#xff08;一&#xff09;Redux源码解析与实现&#xff08;二&…

Python爬虫:下载小红书无水印图片、视频

该代码只提供学习使用&#xff0c;该项目是基于https://github.com/JoeanAmier/XHS_Downloader的小改动 1.下载项目 git clone https://github.com/zhouayi/XHS_Downloader.git2.找到需要下载的文章的ID 写入main.py中 3.下载 python main.py最近很火的莲花楼为例<嘿嘿…

【Java】传输层UDP

传输层UDP UDP基本特点无连接不可靠面向数据报缓冲区大小受限 UDP协议端格式16位UDP长度16位UDP检验和 UDP基本特点 UDP传输的过程类似于寄信 无连接,不可靠传输,面向数据报,全双工 无连接 知道对端的IP和端口号就直接进行传输&#xff0c;不需要建立连接&#xff1b; 不可…

Linux进程间通信(IPC)的几种方式

概述: “ 进程间通信&#xff08;IPC&#xff0c;Inter-Process Communication&#xff09;&#xff0c;指至少两个进程或线程间传送数据或信号的一些技术或方法。进程是计算机系统分配资源的最小单位(进程是分配资源最小的单位&#xff0c;而线程是调度的最小单位&#xff0c;…

java八股文面试[数据库]——行溢出

行记录格式 1) 行格式分类 表的行格式决定了它的行是如何物理存储的&#xff0c;这反过来又会影响查询和DML操作的性能。如果在单个page页中容纳更多行&#xff0c;查询和索引查找可以更快地工作&#xff0c;缓冲池中所需的内存更少&#xff0c;写入更新时所需的I/O更少。 I…

如何利用TikTok营销策略,来帮你赢得用户的心?

TikTok作为一款全球热门的短视频社交应用&#xff0c;已经成为许多品牌和营销人员的首选平台之一。作为一个出海公众号博主&#xff0c;我将在下面的文章中探讨TikTok营销的重要性、策略和成功案例。 首先&#xff0c;我们来谈一谈TikTok营销的重要性。随着移动互联网的迅速发…

突然发现ONLYOFFICE支持了.wps格式系列文件了

突然发现ONLYOFFICE支持了.wps格式系列文件了 最近做慕课&#xff0c;突然发现&#xff0c;我国产金山的WPS办公软件的.wps后缀名格式文件&#xff0c;居然被ONLYOFFICE这款办公软件支持打开了&#xff0c;找到官网仔细查看更新说明才确认就是最新一次更新加入的&#xff0c;并…

LabVIEW利用人工神经网络辅助进行结冰检测

LabVIEW利用人工神经网络辅助进行结冰检测 结冰对各个领域构成重大威胁&#xff0c;包括但不限于航空航天和风力涡轮机行业。在起飞过程中&#xff0c;飞机机翼上轻微积冰会导致升力降低25%。研究报告称&#xff0c;涡轮叶片上的冰堆积可在19个月的运行时间内造成29MWh的功率损…

View体系简析

应用程序中的View框架 应用程序中的View框架如图所示。 View和ViewRoot 如果以xml文件来描述UI界面的layout&#xff0c;可以发现里面的所有元素实际上都形成了树状结构的关系&#xff0c;比如&#xff1a; <LinearLayout xmlns:android"http://schemas.android.c…

算法通关村-----快速排序的应用

数组中的第K个最大元素 问题描述 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。详见leetcode215 问题分析 之前我们已经使用堆排序/堆查找的…

群晖NAS:黑群cpu信息显示不正确修正

群晖NAS&#xff1a;黑群cpu信息显示不正确修正 黑群晖的面板信息&#xff0c;cpu信息一直是错误的&#xff0c;很难受&#xff0c;修正方法如下&#xff1a; 【1】下载插件&#xff1a; 打开&#xff1a; https://github.com/FOXBI/ch_cpuinfo/releases 下载&#xff1a; …