解读此文件,并对内容和实验步骤进行更详细的规划,补充所缺内容,完成实验
时间: 2024-11-12 12:40:13 浏览: 4
### 实验概述
**实验名称**: Android 移动开发之数据存储
**实验目的**:
1. 了解 Android 数据存储的基本方法。
2. 掌握 `SharedPreferences`、内部文件存储、外部存储技术。
**实验内容**:
1. 使用 `SharedPreferences` 在程序关闭时保存用户输入的信息,并在程序重新启动时自动恢复这些信息。
2. 以 INI/TXT 文件形式,将数据保存在内部或外部存储器上,以实现相同的功能。
### 实验步骤及详细规划
#### 1. 使用 `SharedPreferences` 存储数据
##### 创建新项目
- **布局文件**: `activity_main1.xml`
- 包含四个 `TextView` 和两个 `Button`。
- `TextView` 用于显示联系人信息(姓名、电话、邮箱、地址)。
- `Button` 分别用于编辑和显示信息。
##### 主活动实现
- **类名**: `MainActivity1`
- **功能**: 打开 `SharedPreferences` 并显示数据。
```java
package com.example.sharedpreferencesdemo;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity1 extends AppCompatActivity implements View.OnClickListener {
Button Edit;
Button Show;
TextView Name;
TextView Phone;
TextView Email;
TextView Address;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main1);
Name = findViewById(R.id.NameS);
Phone = findViewById(R.id.PhoneS);
Email = findViewById(R.id.EmailS);
Address = findViewById(R.id.AddressS);
Show = findViewById(R.id.show);
Edit = findViewById(R.id.Edit);
Edit.setOnClickListener(this);
Show.setOnClickListener(this);
}
@Override
public void onClick(View view) {
int id = view.getId();
switch (id) {
case R.id.Edit:
Intent intent = new Intent();
intent.setClass(MainActivity1.this, MainActivity2.class);
startActivity(intent);
break;
case R.id.show:
Show();
break;
}
}
public void Show() {
SharedPreferences sharedPreferences = getSharedPreferences("userDATA", MODE_PRIVATE);
String name = sharedPreferences.getString("NAME", "Default Name");
String phone = sharedPreferences.getString("PHONE", "Default Phone");
String email = sharedPreferences.getString("EMAIL", "Default Email");
String address = sharedPreferences.getString("ADDRESS", "Default Address");
Name.setText(name);
Phone.setText(phone);
Email.setText(email);
Address.setText(address);
}
}
```
##### 编辑界面设计
- **布局文件**: `activity_main2.xml`
- 包含四个 `EditText` 和一个 `Button`。
- `EditText` 用于输入联系人信息(姓名、电话、邮箱、地址)。
- `Button` 用于保存信息。
##### 编辑活动实现
- **类名**: `MainActivity2`
- **功能**: 输入并保存数据到 `SharedPreferences`。
```java
package com.example.sharedpreferencesdemo;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity2 extends AppCompatActivity {
EditText Name;
EditText Phone;
EditText Email;
EditText Address;
Button Save;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main2);
Name = findViewById(R.id.nameE);
Phone = findViewById(R.id.phoneE);
Email = findViewById(R.id.emailE);
Address = findViewById(R.id.addressE);
Save = findViewById(R.id.save);
Save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Save();
}
});
}
public static final int MODE = MODE_PRIVATE;
public void Save() {
SharedPreferences.Editor editor = getSharedPreferences("userDATA", MODE).edit();
editor.putString("NAME", String.valueOf(Name.getText()));
editor.putString("PHONE", String.valueOf(Phone.getText()));
editor.putString("EMAIL", String.valueOf(Email.getText()));
editor.putString("ADDRESS", String.valueOf(Address.getText()));
editor.apply();
}
}
```
##### 查看存储文件
- **路径**: `/data/data/<包名>/shared_prefs/`
- **工具**: Android Studio 中的 Device Explorer
#### 2. 内部存储
##### 创建新项目
- **项目名称**: `FileStoreDemo`
##### 布局设计
- **布局文件**: `activity_main.xml`
- 包含一个 `TextView`、一个 `EditText` 和一个 `Button`。
- `EditText` 用于输入文本。
- `Button` 用于保存文本。
```xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:gravity="center_horizontal"
android:text="记事本"
android:textSize="18sp" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/black" />
<EditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="600dp"
android:layout_weight="1"
android:gravity="start"
android:hint="请输入文本"
android:inputType="textMultiLine" />
<Button
android:id="@+id/save"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:onClick="saveFile"
android:text="Save" />
</LinearLayout>
```
##### 活动实现
- **类名**: `MainActivity`
- **功能**: 读取和保存文本文件。
```java
package com.example.filestoredemo;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class MainActivity extends AppCompatActivity {
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
editText = findViewById(R.id.edit_text);
String str = load();
if (!TextUtils.isEmpty(str)) {
editText.setText(str);
Toast.makeText(this, "加载成功", Toast.LENGTH_LONG).show();
}
}
public void saveFile(View view) {
saveFile(editText.getText().toString());
}
public void saveFile(String str) {
FileOutputStream fos = null;
BufferedWriter writer = null;
try {
fos = openFileOutput("badao.txt", MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(fos));
writer.write(str);
Toast.makeText(this, "保存成功", Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public String load() {
FileInputStream fis = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
fis = openFileInput("badao.txt");
reader = new BufferedReader(new InputStreamReader(fis));
String str;
while ((str = reader.readLine()) != null) {
content.append(str);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}
}
```
#### 3. 外部存储
##### 创建新项目
- **项目名称**: `FileStoreDemo1`
##### 布局设计
- **布局文件**: `activity_file_store_demo1.xml`
- 包含一个 `EditText`、一个 `Button` 和一个 `TextView`。
- `EditText` 用于输入文本。
- `Button` 用于保存文本。
- `TextView` 用于显示已保存的文本。
```xml
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context=".FileStoreDemo1">
<EditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入文本" />
<Button
android:id="@+id/save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保存" />
<TextView
android:id="@+id/Show"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="显示已保存的文本" />
</LinearLayout>
```
##### 活动实现
- **类名**: `FileStoreDemo1`
- **功能**: 读取和保存外部存储中的文本文件。
```java
package com.example.filestoredemo1;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileStoreDemo1 extends AppCompatActivity {
private File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
private File dataFile = new File(dir, "data.txt");
private Button save;
private EditText inputText;
private TextView Show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_file_store_demo1);
save = findViewById(R.id.save);
inputText = findViewById(R.id.edit_text);
Show = findViewById(R.id.Show);
// 动态请求权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
write();
read();
}
});
}
private void write() {
try {
if (!dataFile.exists()) {
dataFile.createNewFile();
}
FileOutputStream fos = new FileOutputStream(dataFile);
String input = inputText.getText().toString();
fos.write(input.getBytes("utf-8"));
fos.flush();
fos.close();
} catch (IOException e) {
Log.e("FileStoreDemo1", "写入文件失败", e);
}
}
private void read() {
try {
FileInputStream fis = new FileInputStream(dataFile);
byte[] bytes = new byte[fis.available()];
fis.read(bytes);
fis.close();
String str = new String(bytes, "utf-8");
if (Show != null) {
Show.setText(str);
}
Log.i("FileStoreDemo1", str);
} catch (IOException e) {
Log.e("FileStoreDemo1", "读取文件失败", e);
}
}
}
```
##### 权限声明
- **AndroidManifest.xml**
```xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.filestoredemo1">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
... >
...
</application>
</manifest>
```
### 运行与测试
1. 安装应用到设备或模拟器。
2. 测试 `SharedPreferences` 存储和读取功能。
3. 测试内部存储的记事本功能。
4. 测试外部存储的文件读写功能。
通过以上步骤,你可以全面掌握 Android 中 `SharedPreferences`、内部存储和外部存储的使用方法。
阅读全文