概述
Android学习之数据存储方式
实际开发Android应用程序时,数据的存储与操作是必不可少的。在这里我主要介绍Android中实现数据存储的5种方式,分别是:
1、SharedPreferences存储数据
2、文件存储数据
3、SQLite数据库存储数据
4、ContentProvider存储数据
5、网络存储数据
今天我们主要学习前两种数据存储方式。
1、SharedPreferences存储数据
(1)、一种常用的数据存储方式。
(2)、本质是基于xml文件存储键值对(key-value)数据。
(3)、其只能读取数据,存储和修改需要通过Editor对象实现。
(4)、SharedPreferences将数据以键值对(key-value)的形式保存至xml文件中,而生成的xml文件保存于/data/data/程序包名/shared_prefs目录下。
(5)、SharedPreferences的使用非常简单,能够轻松的存放数据和读取数据,但只能保存基本类型的值 ,所以,适用于简单的数据保存,一般用于变量的存储。
1.1、SharedPreferences对象的常用方法:
方法 | 说明 |
---|---|
contains(String key) | 判断SharedPreferences是否包含特定名称为键(key)的数据,返回值类型为boolean,是返回true,否返回false。 |
edit() | 获取SharedPreferences数据里全部的键值对(key-value),返回值类型为Map<String, Object>。 |
getAll() | 返回一个Edit对象,用于操作SharedPreferences,返回值类型为Editor。 |
getXxx(String key, Xxx defValue) | 获取SharedPreferences指定键(key)所对应的值(value),其中Xxx表示不同的数据类型。 |
1.2、SharedPreferences.Editor对象的常用方法 :
方法 | 说明 |
---|---|
clear() | 清空SharedPreferences里所有的数据。 |
putXxx(String key,Xxx value) | 向SharedPreferences存入指定的key对应的数据,其中Xxx与之前所述相同一样,表示不同的数据类型。 |
commit() | 当Editor编辑完成后,调用该方法可以提交修改,相当于数据库中的提交操作。无论对SharedPreferences对象进行了什么操作,最后都必须使用commit()方法进行保存,否则将无法存储修改信息。返回值类型为boolean,提交成功返回true,失败返回false。 |
remove(String key) | 删除SharedPreferences里指定key对应的值。返回值类型为Editor。 |
1.3、SharePreferences的四种操作方式 :
方法 | 说明 |
---|---|
Context.MODE_PRIVATE | 默认操作,SharePreferences数据只能被本应用程序读、写,写入的内容会覆盖原文件的内容。 |
Context.MODE_APPEND | 检查SharePreferences文件是否存在,没有就创建新的SharePreferences文件或存在就追加写入SharePreferences文件中。 |
Context.MODE_WORLD_READABLE | SharePreferences文件可被其他应用读取,但是不能写入。 |
Context.MODE_WORLD_WRITEABLE | SharePreferences文件可被其他应用读取并写入。 |
1.4、两种获取SharedPreferences对象的方法
(1)、使用Contex.getSharedPreferences(String name,int mode)获取.
Name为配置文件的名称,mode为操作方式,可被同一应用程序下的其他组件共享。
(2)、使用Activity.getPreferences(int mode)获取.
(只能在本Activity中使用。
1.5、使用SharedPreferences存取数据
保存数据:
1.通过Context或Activity获取SharePreferences对象
2.使用SharePreferences的edit获取SharePreferences.Editor对象
3.使用Editor对象的putXXX方法保存key-value数据对
4.使用Editor对象的commit方法提交数据,进行实际存储
获取数据:
1.通过Context或Activity获取SharePreferences对象
2.使用SharePreferences对象的getXXX方法来获取数据
2、文件存储数据
文件存储可以分成两类 :
1、将文件存储在应用程序内,文件保存在/data/data/<package name>/files/目录下,称为File存储;
2、将文件存储在外接的存储设备中,也就是存储在SDCard存储卡中,称为SDCard存储。
2.1、File存储
Android中读取/写入文件的方法与java中的I/O操作一样。利用openFileInput()方法与FileInputStream()对象读取设备上的文件,并利用openFileOutput()方法与FileOutputStream()对象来创建文件,但File存储下,文件在不同的程序之间不能共享。
2.1.1、使用FileOutputStream类对象来创建文件信息:
• 使用OpenFileOutput(string name, int mode)函数创建对象,name为文件名,不需要路径信息和扩展名;mode为操作方式。
• 使用对象的.write(byte[] bytes)来写入二进制文件流,若为其它类型数据,则需要转换为二进制类型。
• 使用对象的.close()来关闭对象。
2.1.2、使用FileInputStream类对象来读取文件信息:
• openFileInput(String name)创建对象。
• 使用对象的.read(byte[] bytes)来读取二进制文件流。
• 将读取的二进制数据流,转换为原本的数据信息。
2.1.3、File存储常用操作:
方法 | 说明 |
---|---|
openFileOutput(String name, int mode) | 保存文件内容,打开指定的私有文件输出流,返回值类型为FileOutputStream,name为要打开的文件名,不能包含路径分隔符,mode四种模式如下,在使用模式时,可以用"+"来选择多种模式,比如openFileOutput(FileName, Environment.MODE_PRIVATE+MODE_WORLD_READABLE)。 |
openFileInput(String name) | 读取文件内容,打开指定的私有文件输出流,返回值类型为FileInputStream,name为要打开的文件名,不能包含路径分隔符,对于File存储所创建的文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以在创建文件时,指定Environment.MODE_WORLD_READABLE和Environment.MODE_WORLD_WRITEABLE权限。 |
deleteFile(String name) | 删除指定的文件,返回值类型为boolean,name为要删除的文件名,不能包含路径。 |
getDir(String name, int mode) | 在应用程序的数据文件下获取或创建name对应的子目录,返回值类型为File。 |
getFilesDir() | 得到该应用程序数据文件夹的绝对路径,返回值类型为File。 |
fileList() | 得到该应用程序数据文件夹下的全部文件的文件名,返回值类型为String[]。 |
• mode为操作模式,有以下4种保存模式:
Environment.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下写入的内容会覆盖原文件的内容。
Environment.MODE_APPEND:检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Environment.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取。
Environment.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
2.2、SDCard存储
Android为我们提供了SDCard的相关方法方便我们的操作。
2.2.1、Environment类的常用方法:
方法 | 说明 |
---|---|
getDataDirectory() | 获得Android下的data文件夹的目录,返回值类型为File。 |
getDownloadCacheDirectory() | 获得AndroidDownload/Cache内容的目录,返回值类型为File。 |
getExternalStorageDirectory() | 获得Android外部存储器也就是SDCard的目录,返回值类型为File。 |
getRootDirectory() | 获得Android下的root文件夹的目录,返回值类型为File。 |
getExternalStorageState() | 获得Android外部存储器的当前状态,返回值类型为String,有以下几种保存模式。 |
•保存模式:
Environment.MEDIA_BAD_REMOVAL:在没有正确卸载SDCard之前就移除。
Environment.MEDIA_CHECKING:正在磁盘检查。
Environment.MEDIA_MOUNTED:已经挂载并且拥有可读可写权限。
Environment.MEDIA_MOUNTED_READ_ONLY:已经挂载, 但只拥有可读权限。
Environment.MEDIA_NOFS:对象空白, 或者文件系统不支持。
Environment.MEDIA_REMOVED:已经移除扩展设备。
Environment.MEDIA_SHARED:如果SDCard未挂载, 同时通过USB大容量存储方式与其他设备共享。
Environment.MEDIA_UNMOUNTABLE:不可以挂载任何扩展设备。
Environment.MEDIA_UNMOUNTED:已经卸载。
2.2.2、对SDCard的写入与读取操作:
•1. 在AndroidMainfest.xml中添加权限。
<!--在SDCard中读取/写入文件权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--在SDCard中创建与删除文件权限-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
在API23以上,还要在JAVA代码中添加请求权限:
// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE};
public static void verifyStoragePermissions(AppCompatActivity activity) {
int permission = ActivityCompat.checkSelfPermission(activity,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE);
}
}
•2. 判断手机设备上是否有SDCard且具有读写SDCard的权限,用Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)来判断。
•3.获取SD卡的目录。
File sdCardDir=Enviroment.getExternalStorageDirectory()。
或File sdCardDir=new File(“/sdcard”); //直接访问默认目录。
☆☆☆•4.使用File类来写入SD卡文件。
•使用File类的构造函数设置SD卡文件,并指明路径和名称。
File savefile=new File(String dir, String filename)。
•创建FileOutputStream类对象来绑定File对象。
FileOutputStream fos= new FileOutputStream(savefile)。
•通过FileOutputStream类对象将数据流写入到文件中。
fos.write(byte[] bytes)。
☆☆☆•5.使用File类来读取SD卡文件。
•使用File类的构造函数设置SD卡文件,并指明路径和名称。
File readfile=new File(String dir, String filename)。
•创建FileInputStream类对象来绑定File对象。
FileInputStream fis= new FileOutputStream(readfile)。
•通过FileInputStream类对象将数据流写入到文件中。
定义一个byte[] 数组,用来存放读取的二进制数据流。
使用fis.read(byte[] bytes)的方法,从文件读取二进制数据流。
将二进制数据转化为原有的数据类型。
☆☆☆Android Studio实现SharedPreferences存储数据和文件File存储数据。
1.打开Android Studio,新建工程后,在activity_main.xml中,建立4个Button,2个Plain Text。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="lession.example.com.androidlession4_10_3.MainActivity">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:text="name"
android:ems="10"
android:id="@+id/editText" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:text="pwd"
android:ems="10"
android:id="@+id/editText2" />
<Button
android:text="sp_save"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/button" />
<Button
android:text="sp_load"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/button2" />
<Button
android:text="data_save"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/button3" />
<Button
android:text="data_load"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/button4" />
</LinearLayout>
</RelativeLayout>
2.在MainActivity.java中,编写相关代码。
package lession.example.com.androidlession4_10_3;
import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class MainActivity extends AppCompatActivity {
SharedPreferences msp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
msp = getSharedPreferences("myfile", Context.MODE_PRIVATE);
final EditText ed_name = (EditText) findViewById(R.id.editText);
final EditText ed_pwd = (EditText) findViewById(R.id.editText2);
Button bt_sps = (Button) findViewById(R.id.button);
Button bt_spl = (Button) findViewById(R.id.button2);
Button bt_datas = (Button) findViewById(R.id.button3);
Button bt_datal = (Button) findViewById(R.id.button4);
bt_sps.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor mEdt = msp.edit();
mEdt.putString("name",ed_name.getText().toString());
mEdt.putString("pwd",ed_pwd.getText().toString());
mEdt.commit();
}
});
bt_spl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ed_name.setText(msp.getString("name",null));
ed_pwd.setText(msp.getString("pwd",null));
}
});
bt_datas.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
FileOutputStream mfos = openFileOutput("datafile",MODE_PRIVATE);
String st = ed_name.getText().toString();
byte[ ] buffer = st.getBytes();
mfos.write(buffer);
mfos.flush();
mfos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
bt_datal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
FileInputStream mfis = openFileInput("datafile");
int len = mfis.available();
byte[ ] buffer = new byte[len];
mfis.read(buffer);
String st = new String(buffer);
ed_pwd.setText(st);
}catch (Exception e){
e.printStackTrace();
}
}
});
}
}
运行结果:
SharedPreferences存储数据:
输入任意姓名和密码,点击SP_SAVE,清除文本框中内容后,点击SP_LOAD,输入的姓名和学号又会显示出来。
打开Tools —> Android —> Android Device Monitor,找到myfile。
注:如果打开Android Device Monitor没有目录树,请参考我的另一篇博客,链接:https://blog.csdn.net/weixin_43468667/article/details/90214551
导出,打开内容如下:
文件File存储数据:
在第一个文本框输入任意字符,点击DATA_SAVE,点击DATA_LOAD,在第二个文本框显示出来。
打开Tools —> Android —> Android Device Monitor,找到datafile。
导出,打开内容如下:
☆☆☆Android Studio实现文件SDCard存储数据。
1.打开Android Studio,新建工程后,在AndroidMainfest.xml中添加权限。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="lession.example.com.androidlession417">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<!--在SDCard中读取/写入文件权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--在SDCard中创建与删除文件权限-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
</manifest>
2.在activity_main.xml中,建立3个Button,1个ListView。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="lession.example.com.androidlession417.MainActivity">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:text="sd_save"
android:textAllCaps="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/button" />
<Button
android:text="sd_load"
android:textAllCaps="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/button2" />
<Button
android:text="sd_dir"
android:textAllCaps="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/button3" />
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listView" />
</LinearLayout>
</RelativeLayout>
3.在MainActivity.java中,编写相关代码。
package lession.example.com.androidlession417;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class MainActivity extends AppCompatActivity {
// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE};
public static void verifyStoragePermissions(AppCompatActivity activity) {
int permission = ActivityCompat.checkSelfPermission(activity,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt_sdsave = (Button) findViewById(R.id.button);
Button bt_sdsload = (Button) findViewById(R.id.button2);
Button bt_sddir = (Button) findViewById(R.id.button3);
final ListView lv = (ListView) findViewById(R.id.listView);
verifyStoragePermissions(this);
bt_sdsave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File path = Environment.getExternalStorageDirectory();
String st = "我要写入的文件的内容!";
File saveFile = new File(path,"mySDfile");
try {
FileOutputStream mfos = new FileOutputStream(saveFile);
mfos.write(st.getBytes());
mfos.flush();
mfos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
bt_sdsload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File path = Environment.getExternalStorageDirectory();
String st;
File loadFile = new File(path,"mySDfile");
try{
FileInputStream mfis = new FileInputStream(loadFile);
int len = mfis.available();
byte[] buffer = new byte[len];
mfis.read(buffer);
st = new String(buffer);
Toast.makeText(MainActivity.this,
"文件内容:"+st,Toast.LENGTH_LONG).show();
}catch (Exception e){
e.printStackTrace();
}
}
});
/*遍历SD卡中目录及文件的方法:
通过创建File[]数组类型对象获取
File[] files=new File(filepath).listFiles();
使用ListView控件来显示目录
使用ArrayAdapter将目录中的信息,绑定到ListView中显示
使用ListView控件的点击事件,来进入选中的目录
主要函数实现:
获取选定文件夹中的文件列表
将文件列表显示到到ListView中*/
bt_sddir.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File path = Environment.getExternalStorageDirectory();
File[] mFs = new File(path.toString()).listFiles();
ArrayAdapter<File> mAda = new ArrayAdapter<File>
(MainActivity.this,android.R.layout.simple_list_item_1,mFs);
lv.setAdapter(mAda);
}
});
}
}
运行结果:
点击ALLOW
实现SD卡文件的读写:
点击sd_save,然后点击sd_load显示保存的内容
实现遍历SD卡中目录及文件:
点击sd_dir,ListView显示内容
打开Tools —> Android —> Android Device Monitor,找到对应文件。
导出,打开内容如下:
这就是SharedPreferences存储数据和文件存储数据的使用,如果转载以及CV操作,请务必注明出处,谢谢!
最后
以上就是虚心大树为你收集整理的Android学习之五种数据存储方式(一)的全部内容,希望文章能够帮你解决Android学习之五种数据存储方式(一)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复