`
xidajiancun
  • 浏览: 454446 次
文章分类
社区版块
存档分类
最新评论

Android入门之数据存储那么几种方式

 
阅读更多

在实际的开发中,Android提供了5种数据存储的方式:

1)文件存储数据

2)使用SharedPreferences存储数据

3)使用SQLite数据库存储数据

4)使用ContentProvide存储数据

5)网络存储数据

一、文件存储数据到内部存储器

1)为了保存文本到文件中,需要FileOutputStream类,openFileOutput方法用指定的模式打开一个指定的文件夹来写入:

FileOutputStreamfileOut = openFileOutput(“hello.txt”, Context.MODE_WORLD_WRITEABLE);

其中,有三种模式提供选择:

Context.MODE_PRIVATE: 创建的文件只能被该应用程序读写

Context.MODE_WORLD_READABLE:允许其他应用程序读取文件

Context.MODE_WORLD_WRITEABLE: 允许其他应用程序修改文件


2)为了将字符流转换为字节流,需要OutputStreamWriter类的对象,并传入FileOutputStream类的实例作为参数:

OutputStreamWriter osw = newOutputStreamWriter(fileOut);


3)而读取文件则需要用到FileInputStream类和InputStreamReader类:

FileInputStreamfileInput = openFileInput(“hello.txt”);

InputStreamReaderisr = new InputStreamReader(fileInput);


4)新建一个字符数组作为缓冲器,把文件内容读到缓冲器中,然后将其复制到String对象中

char[] inputBuffer = new char[READ_BLOCK_SIZE];

String s = “”;

int charRead;

while((charRead = isr.read(inputBuffer)>0){

StringreadString = String.copyValueOf(inputBuffer, 0, charRead);

s +=readString;

inputBuffer= new char[READ_BLOCK_SIZE];

}

public class FilesActivity extends Activity {
	EditText textBox;
	static final int READ_BLOCK_SIZE = 100;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.textBox = (EditText)findViewById(R.id.txtText);
	}
	
	public void onClickSave(View v){
		String str = textBox.getText().toString();
		try {
			FileOutputStream fileOut = openFileOutput("hello.txt", MODE_WORLD_READABLE);
			OutputStreamWriter osw = new OutputStreamWriter(fileOut);			
			osw.write(str);
			osw.flush();
			osw.close();
			Toast.makeText(getBaseContext(), "File saved successfully!", 
					Toast.LENGTH_SHORT).show();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	public void onClickLoad(View v){	
		try {
			FileInputStream fileInput = openFileInput("hello.txt");
			InputStreamReader isr = new InputStreamReader(fileInput);
			
			char[] inputBuffer = new char[READ_BLOCK_SIZE];
			String s = "";
			
			int charRead;
			while((charRead = isr.read(inputBuffer)) > 0){
				String readString = String.copyValueOf(inputBuffer, 0, charRead);
				s += readString;
				inputBuffer = new char[READ_BLOCK_SIZE];
			}
			textBox.setText(s);
			Toast.makeText(getBaseContext(), "File loaded successfully", 
					Toast.LENGTH_SHORT).show();			
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}

二、文件存储数据到SD卡

返回sd卡的完整路径:

File sdCard = Environment.getExternalStorageDirectory();

在SD卡中创建一个名问MyFiles的目录,最终文件将会保存到这里:

File directory = new File(sdCard.getAbsolutePath()+"/MyFiles");

directory.mkdir();

读取SD卡需要在AndroidMinifest.xml文件中添加权限:

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

</uses-permission>

其他的跟上面的一样,下面看代码:

public class FilesActivity extends Activity {
	EditText textBox;
	static final int READ_BLOCK_SIZE = 100;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.textBox = (EditText)findViewById(R.id.txtText);
	}
	
	public void onClickSave(View v){
		String str = textBox.getText().toString();
		try {
			File sdCard = Environment.getExternalStorageDirectory();//返回sd卡的路径
			File directory = new File(sdCard.getAbsolutePath()+"/MyFiles");
			directory.mkdir();
			File file = new File(directory, "textfile.txt");
			FileOutputStream fileOut = new FileOutputStream(file);
			OutputStreamWriter osw = new OutputStreamWriter(fileOut);			
			osw.write(str);
			osw.flush();
			osw.close();
			Toast.makeText(getBaseContext(), "File saved successfully!", 
					Toast.LENGTH_SHORT).show();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
	
	public void onClickLoad(View v){		
		try {
			File sdCard = Environment.getExternalStorageDirectory();
			File directory = new File(sdCard.getAbsolutePath()+"/MyFiles");
			File file = new File(directory, "textfile.txt");
			FileInputStream fileIn;
			fileIn = new FileInputStream(file);
			InputStreamReader isr = new InputStreamReader(fileIn);
			char[] inputBuffer = new char[READ_BLOCK_SIZE];
			String s = "";
			
			int charRead;
			while((charRead = isr.read(inputBuffer)) > 0){
				String readString = String.copyValueOf(inputBuffer, 0, charRead);
				s += readString;
				inputBuffer = new char[READ_BLOCK_SIZE];
			}
			textBox.setText(s);
			Toast.makeText(getBaseContext(), "File loaded successfully", 
					Toast.LENGTH_SHORT).show();	
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}
}

二、使用SharedPreferences存储数据

【存】

创建对象:

SharedPreferences sp = getSharedPreferences("FILE_NAME",MODE_PRIVATE);

创建编辑器:

SharedPreferences.Editor editor = sp.edit();

往编辑器存入int、boolean、String等类型的数据分别使用对应的方法:

editor.putBoolean("flag", true);

editor.putInt("age", 40);

editor.putString("你好啊,请多多指教","message");

编辑器必须发送出去才能生效:

editor.commit();

【取】

还是需要SharedPreferences 对象:

SharedPreferences sp =getSharedPreferences("FILE_NAME",MODE_PRIVATE);

与set对应,取出对应的数据是get,如getBoolean、getString等:

booleanflag = sp.getBoolean("flag",false);

int age =sp.getInt("age", 0);

String mess = sp.getString("message","No message");


public class MainActivity extends Activity {
	private Button send,look;
	private EditText input;
	private TextView msg;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.msg = (TextView)findViewById(R.id.msg);		
		this.send = (Button)findViewById(R.id.send);
		this.look = (Button)findViewById(R.id.look);
		this.input = (EditText)findViewById(R.id.input);
		send.setOnClickListener(new View.OnClickListener() {			
			@Override
			public void onClick(View v) {
				SharedPreferences sp = getSharedPreferences("FILE_NAME", MODE_PRIVATE);	
				SharedPreferences.Editor editor = sp.edit();
				editor.putString("message",input.getText().toString());
				editor.commit();
				msg.setText("你有新的消息,请注意查收"); 
			}
		});
		look.setOnClickListener(new View.OnClickListener() {		
			@Override
			public void onClick(View v) {
				SharedPreferences sp = getSharedPreferences("FILE_NAME", MODE_PRIVATE);
				String mess = sp.getString("message", "No message");
				msg.setText(mess);
			}
		});
				
	}
}


三、使用静态资源

也就是使用在res/raw文件夹下的文件。使用Activity类的getResources方法返回一个Resources对象,然后使用其openRawResource方法打开包含在res/raw文件夹下的文件。

public void onClickGetSources(View v){
		InputStream is = getBaseContext().getResources().openRawResource(R.raw.text);
		BufferedReader br = new BufferedReader(new InputStreamReader(is));
		String str = null;
		try {
			while((str = br.readLine())!=null){
				Toast.makeText(getBaseContext(), str, Toast.LENGTH_SHORT).show();
			}
			is.close();
			br.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}




分享到:
评论

相关推荐

    Google Android开发入门实战 pdf 和 实例代码.part3

    介绍了Android上可以使用的几种存储方式以及每种方式适应的场景,使得读者可以很快掌握数据存储操作。通过本章学习,将学会何时需要存储数据,采用哪种存储方式,以及如何实现存储。 第9章 我来“广播”你的“意图”...

    Google Android开发入门实战 pdf 和 实例代码.part2

    介绍了Android上可以使用的几种存储方式以及每种方式适应的场景,使得读者可以很快掌握数据存储操作。通过本章学习,将学会何时需要存储数据,采用哪种存储方式,以及如何实现存储。 第9章 我来“广播”你的“意图”...

    Google Android开发入门实战 pdf 和 实例代码.part1

    介绍了Android上可以使用的几种存储方式以及每种方式适应的场景,使得读者可以很快掌握数据存储操作。通过本章学习,将学会何时需要存储数据,采用哪种存储方式,以及如何实现存储。 第9章 我来“广播”你的“意图”...

    新版Android开发教程.rar

    Android Android Android Android 开发入门 System System System System Requirements Requirements Requirements Requirements The sections below describe the system and software requirements for developing...

    airwallex-payment-android:Airwallex Android SDK

    Airwallex Android SDK EN |该库可让您轻松快捷地在Android... 以下是几种联系方式: 对于一般适用的问题和反馈,请在此存储库中创建一个问题。 在集成的任何阶段提供个人支持变更日志此项目的所有显着更改将记录在。

    Android的可自定义进度条,允许添加图像,图标,文本,圆弧,圆。-Android开发

    入门《拱形图像进度条》很容易通过几种方法进行自定义,并且可以有不同的用法。 要求Android 4.2 JellyBean(API lv 17)或更高版本您最喜欢的IDE安装Gradle您应遵循以下两个步骤。 将其添加到存储库末尾的root ...

    spiration_ftc:FTC团队灵感#11128的代码的主要存储库

    注意该存储库包含用于最终目标...下载项目如果您是Android Studio程序员,则有几种方法可以下载此存储库。 请注意,如果您使用Blocks或OnBot Java Tool对机器人进行编程,则无需下载此存储库。 如果您是git用户,则可以

    FTC-12956:第一名技术挑战小组#12956的GitHub存储库

    注意该存储库包含用于最终...下载项目如果您是Android Studio程序员,则有几种方法可以下载此存储库。 请注意,如果您使用Blocks或OnBot Java Tool对机器人进行编程,则无需下载此存储库。 如果您是git用户,则可以克隆

    CtRW_Code_2020:FTC机器人团队6078的代码存储库切断了红线

    注意该存储库包含用于最终目标...下载项目如果您是Android Studio程序员,则有几种方法可以下载此存储库。 请注意,如果您使用Blocks或OnBot Java Tool对机器人进行编程,则无需下载此存储库。 如果您是git用户,则可以

    2017java源码-FTC-SKYSTONE-TEAM-DARK-ANGELS-ROMANIA-2020:注意此存储库包含SKYSTONE(

    Studio程序员,则有几种方法可以下载此存储库。 请注意,如果您使用Blocks或OnBot Java Tool对机器人进行编程,则无需下载此存储库。 如果您是git用户,则可以克隆存储库的最新版本: git克隆 或者,您也可以根据...

    SkyStone:FTC SDK

    如果您是Android Studio程序员,则有几种方法可以下载此存储库。 请注意,如果您使用Blocks或OnBot Java Tool对机器人进行编程,则无需下载此存储库。 如果您是git用户,则可以克隆存储库的最新版本: git

    纪念FTC图书馆

    如果您是Android Studio程序员,则有几种方法可以下载此存储库。 请注意,如果您使用Blocks或OnBot Java Tool对机器人进行编程,则无需下载此存储库。 如果您是git用户,则可以克隆存储库的最新版本: git

    Master-Repository

    下载项目如果您是Android Studio程序员,则有几种方法可以下载此存储库。 请注意,如果您使用Blocks或OnBot Java Tool对机器人进行编程,则无需下载此存储库。 如果您是git用户,则可以克隆存储库的最新版本: git

    503RoadJopper

    下载项目如果您是Android Studio程序员,则有几种方法可以下载此存储库。请注意,如果您使用Blocks或OnBot Java Tool对机器人进行编程,则无需下载此存储库。如果您是git用户,则可以克隆存储库的最新

    FtcRobotController-2021:您见过的最伟大的FRC代码

    注意 ...如果您是Android Studio程序员,则有几种方法可以下载此存储库。请注意,如果您使用Blocks或OnBot Java Tool对机器人进行编程,则无需下载此存储库。 如果您是git用户,则可以克隆存储库的最新

    RogueResistanceUG

    下载项目如果您是Android Studio程序员,则有几种方法可以下载此存储库。请注意,如果您使用Blocks或OnBot Java Tool对机器人进行编程,则无需下载此存储库。如果您是git用户,则可以克隆存储库的最新

    FTC-XBOT-SAMPLE-2020

    注意该存储库包含SKYSTONE...下载项目如果您是Android Studio程序员,则有几种方法可以下载此存储库。 请注意,如果您使用Blocks或OnBot Java Tool对机器人进行编程,则无需下载此存储库。 如果您是git用户,则可以

    SkyStone-master-4

    注意 该存储库包含SKYSTONE(2019-...如果您是Android Studio程序员,则有几种方法可以下载此存储库。 请注意,如果您使用Blocks或OnBot Java Tool对机器人进行编程,则无需下载此存储库。 如果您是git用户,则可以

    UltimateGoal_RO_025

    注意 该存储库包含SKYSTONE(2019-2020)...如果您是Android Studio程序员,则有几种方法可以下载此存储库。 请注意,如果使用Blocks或OnBot Java Tool对机器人进行编程,则无需下载此存储库。 如果您是git用户,则

Global site tag (gtag.js) - Google Analytics