Android——基本控件(下)(二十一)

news2025/1/21 6:35:57

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/966644.html

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

相关文章

JS算法与树(二)

前言 二叉搜索树&#xff08;BST&#xff09;存在一个问题&#xff1a;当你添加的节点数够多的时候&#xff0c;树的一边可能会非常的深。而其他的分支却只有几层。 AVL树 为了解决上面的问题&#xff0c;我们提出一种自平衡二叉搜索树。意思是任何一个节点左右两侧子树的高度之…

NTT功能与实现

NTT的基础功用与拓展功能: 1.evaluate和interpolate evaluate的本质是选择n个点(假设f(x)的度为n)&#xff0c;计算得到其值&#xff0c;因此根据定义可以直接进行代入计算。为了加快计算的过程选取 w n w_n wn​的幂次(DFT问题即离散傅里叶变换)&#xff0c;使用FFT算法来加…

CXL.cachemem 简介(背景通道)

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

无涯教程-JavaScript - TDIST函数

The TDIST function replaces the T.DIST.2T & T.DIST.RT functions in Excel 2010. 描述 该函数返回学生t分布的百分点(概率)​​,其中数值(x)是t的计算值,将为其计算百分点。 t分布用于小样本数据集的假设检验。使用此函数代替t分布的临界值表。 语法 TDIST(x,deg_fr…

iOS 设置下载部分文件,如何获取完整文件的大小

在视频的需求中&#xff0c;遇到这样一个需求&#xff0c;播放一视频的时候&#xff0c;要预下载 后面10条视频&#xff0c;但是只下载后面十条视频的前面1M 实现方法 1 创建请求时设置cacheLength resource [[IdiotResource alloc] init];resource.requestURL task.request…

屋大人少,凶多吉少

在这个世界上&#xff0c;包括人在内的万事万物&#xff0c;都是有自己的气场存在的。 那么&#xff0c;人所产生的气场&#xff0c;我们称之为人气。 道法自然&#xff0c;阴阳二象&#xff0c;同样&#xff0c;人的身上也是有阴阳二气&#xff0c; 二气平衡充盈&#xff0c;会…

【Python】批量下载页面资源

【背景】 有一些非常不错的资源网站,比如一些MP3资源网站。资源很丰富,但是每一个资源都不大,一个一个下载费时费力,想用Python快速实现可复用的批量下载程序。 【思路】 获得包含资源链接的静态页面,用beautifulsoup分析页面,获得所有MP3资源的实际地址,然后下载。…

将 Spring Boot 应用程序与 Amazon DocumentDB 集成

Amazon DocumentDB&#xff08;与 MongoDB 兼容&#xff09;是一种可扩展、高度持久和完全托管的数据库服务&#xff0c;用于操作任务关键型 MongoDB 工作负载。在 Amazon DocumentDB 上&#xff0c;您可以使用相同的 MongoDB 应用程序代码、驱动程序和工具来运行、管理和扩展工…

bazel介绍以及其发展历史

简介 Bazel Google开源的&#xff0c;是一款与 Make、Maven 和 Gradle 类似的开源构建和测试工具。 它使用人类可读的高级构建语言。Bazel 支持多种语言的项目&#xff0c;可为多个平台构建输出。Bazel支持任意大小的构建目标&#xff0c;并支持跨多个代码库和大量用户的大型代…

JavaSE基础(1)

1 初识Java 知识导图 1.1 Java简介及发展史 1.1.1 Java是什么 Java是一种优秀的程序设计语言&#xff0c;它具有令人赏心悦目的语法和易于理解的语义。 不仅如此&#xff0c;Java还是一个有一系列计算机软件和规范形成的技术体系&#xff0c;这个技术体系提供了完整的用于软…

系统学习Linux-PXE无人值守装机(附改密)

目录 pxe实现系统自动安装pxe工作原理 大致的工作过程如下&#xff1a; PXE的组件&#xff1a; 一、配置vsftpd 二、配置tftp 三、准备pxelinx.0文件、引导文件、内核文件 四、配置dhcp 配置ip 配置dhcp 五、创建default文件 六、新建测试主机用来测试装机效果 七、…

github指南

记录一些Github上的宝贵功能 1、github trending/star 1.1查看github的热门趋势 可以选择点击上面热门趋势的链接&#xff0c;从主页点进去的方式如下 在这个页面中&#xff0c;你可以选择language/data range等来搜索到你想要的 1.2 查看github的star排行 比如&#xff1a…

出货量腰斩,不用中国芯片,美国PC巨头要凉了,苹果成为大赢家

市调机构Canalys公布的二季度数据显示美国PC巨头戴尔在中国市场的出货量同比暴跌52%&#xff0c;显示出它在公开宣布舍弃中国芯片之后&#xff0c;中国消费者正纷纷抛弃它&#xff0c;毕竟如今的PC品牌如此之多&#xff0c;完全有更多的替代选择。 Canalys公布的数据显示&#…

Python Opencv实践 - 拉普拉斯(Laplacian)算子边缘检测

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_GRAYSCALE) print(img.shape)#拉普拉斯边缘检测 #cv.Laplacian(src, ddepth, dst, ksize, scale, delta, borderType) #src:原图 …

正中优配:沪指震荡涨0.23%,保险、酿酒等板块走强,半导体板块下挫

1日早盘&#xff0c;沪指、深成指盘中强势震动上扬&#xff0c;创业板指回落翻绿&#xff0c;科创50指数跌超1%&#xff1b;两市半日成交缺乏5000亿元。 到午间收盘&#xff0c;沪指涨0.23%报3127.19点&#xff0c;深成指涨0.25%&#xff0c;创业板指跌0.23%&#xff0c;科创5…

Ubuntu22.04安装Mongodb7.0

Ubuntu安装Mongodb 1.平台支持2.安装MongoDB社区版2.1导入包管理系统使用的公钥2.2为MongoDB创建列表文件2.3重新加载本地包数据库2.4安装MongoDB包1.安装最新版MongoDB2.安装指定版MongoDB 3.运行MongoDB社区版1.目录2.配置文件3.初始化系统4.启动MongoDB5.验证MongoDB是否成功…

列表、字典的删除操作

1.列表的删除操作&#xff0c;可以使用del 列表[索引]、列表.pop(索引)、列表.remove(元素)、列表.clear() del(如果不指定列表索引&#xff0c;就是删除整个列表&#xff0c;再使用就会出现 name XX is not defined) a [10, 20, 30, 40] print(f"删除前为:{a}") de…

简易虚拟培训系统-UI控件的应用5

目录 Toggle控件简介 示例-使用Toggle组实现主轴速度选择 本篇介绍UI控件Toggle&#xff0c;尝试一个小示例-使用单选框实现速度的选择控制。 Toggle控件简介 1. Toggle的结构如下&#xff1a;最重要的Toggle组件挂在Toggle节点上&#xff0c;下面的Image组件用于显示单选框…

大数据Flink(七十一):SQL的时间属性

文章目录 SQL的时间属性 一、Flink三种时间属性简介

【jsthree.js】全景vr看房进阶版

three小结&#xff1a; Scene场景 指包含了所有要渲染和呈现的三维对象、光源、相机以及其他相关元素的环境&#xff1b;场景可以被渲染引擎或图形库加载和处理&#xff0c;以生成最终的图像或动画 常见属性&#xff1a; scene.background new THREE.Color(0x000000); // …