安卓中的数据存取

引言:

在我们每天使用的手机设备中,无时无刻都在进行着数据的存和取。安卓作为一种手机操作系统,提供了如下方式的数据存取方式:Preference,File,Sqlite和网络,可以根据程序的实际需求选择合适的存取方式。

1、Preference

使用Preference方式来存取数据,用到了SharedPreferences接口和SharedPreferences.Editor,这连个接口在android.content中。下面以一个例子说明这两个接口的使用。我们经常会有这样的经历,正发短信了别人来了个电话,接了个电话,返回发信息窗口,前面编写的内容还在,本实例就模拟实现这个功能。

界面很简单,一个EditText,一个Button,详细代码如下:

<RelativeLayout 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: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=".MainActivity" >

    <EditText
        android:id="@+id/editTextMsg"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="textMultiLine" />

    <Button
        android:id="@+id/buttonSend"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/editTextMsg"
        android:layout_below="@+id/editTextMsg"
        android:text="发送" />

</RelativeLayout>

下面看看Activity的代码:

package com.lzugis.preferenctest;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {
	private EditText editTextMsg;
	private Button buttonSend;
	//定义临时信息
	private static final String Temp_Sms="Temp_Sms";
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		editTextMsg=(EditText)findViewById(R.id.editTextMsg);//实例化
		buttonSend=(Button)findViewById(R.id.buttonSend);
		
		SharedPreferences pre=getSharedPreferences(Temp_Sms,MODE_WORLD_READABLE);
		String content=pre.getString("sms_content", "");
		editTextMsg.setText(content);
		buttonSend.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent itent=new Intent();
                itent.setClass(MainActivity.this, RwActivity.class);
                startActivity(itent);//启动另一个Activity
			}			
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	protected void onStop(){
		super.onStop();
		SharedPreferences.Editor editor=getSharedPreferences(Temp_Sms,MODE_WORLD_READABLE).edit();
		editor.putString("sms_content",editTextMsg.getText().toString());
		editor.commit();
	};
}

说明:在OnStop方法中保存内容,使用getSharedPreferences().edit()方法获得SharedPreferences.Editor接口,调用getSharedPreferences().edit()的putstring()方法保存短信内容,调用commit提交内容。实现后结果如下图:

2、File 我们可以将一些数据直接以文件的形式保存在设备中,下面的例子分别举例说明了对文件的读取和从Sd卡中读写文件。Sd卡中操作,需要在AndroidManifest.xml文件中添加一下许可:

<!-- 在sd中创建和删除文件的权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 向SD卡中的写入权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

界面设计的很简单,一个EditText用来输入内容,一个EditText用来读取内容,两个Button,分别响应对应的事件,代码如下:

<RelativeLayout 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: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=".RwActivity" >

    <EditText
        android:id="@+id/editTextWrite"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:ems="10"
        android:inputType="textMultiLine" />

    <Button
        android:id="@+id/buttonWrite"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/editTextWrite"
        android:layout_below="@+id/editTextWrite"
        android:text="Write" />

    <EditText
        android:id="@+id/EditTextRead"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/buttonWrite"
        android:layout_below="@+id/buttonWrite"
        android:layout_marginTop="25dp"
        android:ems="10"
        android:inputType="textMultiLine" >
    </EditText>

    <Button
        android:id="@+id/ButtonRead"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/EditTextRead"
        android:layout_below="@+id/EditTextRead"
        android:text="Read" />

</RelativeLayout>

2.1 读写文件方法

写文件方法:

        /*
	 * 写文件方法
	 */
	private void write(String content)
	{
		try
		{
			FileOutputStream fos=openFileOutput(strFileName,MODE_APPEND);
			//写内容
			fos.write(content.getBytes());
			//关闭文件流
			fos.close();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}

读文件方法:

	/*
	 * 读文件方法
	 */
	private String read(){
		try
		{
			//实例化文件输出流对象
			FileInputStream fis=openFileInput(strFileName);
			//定义缓存数组
			byte[] buffer=new byte[fis.available()];
			//读到缓冲区
			fis.read(buffer);
			return new String(buffer);
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		return null;
	};

2.2 从Sd卡中读写文件

Sd卡写文件方法:

	/* 
	 * 写文件到Sd卡方法
	 */
	public void writeDataToSD(String strMsg)
	{
		try
		{
			// 获取File对象,确定数据文件的信息
			File file  = new File(Environment.getExternalStorageDirectory(),"f.txt");
			//判断sd的外部设置状态是否可以读写
			if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
			{				
				//流的对象
				FileOutputStream fos = new FileOutputStream(file);
				//将字符串转换成字节数组
				byte[] buffer = strMsg.getBytes();
				//开始写入数据
				fos.write(buffer);
				//关闭流的使用
				fos.close();
				Toast.makeText(RwActivity.this, "文件"+strMsg+"写入成功", 1000).show();
			}

		}
		catch(Exception ex)
		{
			Toast.makeText(RwActivity.this, "文件写入失败", 1000).show();
		}		
	}

SD卡读文件方法:

	/*
	 * 从SD卡读文件方法
	 */
	public void readDataFromSD()
	{
		try
		{			
			//创建File对象,确定需要读取文件的信息
			File file = new File(Environment.getExternalStorageDirectory(),"f.txt");			
			//FileInputSteam 输入流的对象
			FileInputStream fis = new FileInputStream(file);			
			//准备一个字节数组用户装即将读取的数据
			byte[] buffer = new byte[fis.available()];			
			//开始进行文件的读取
			fis.read(buffer);			
			//关闭流
			fis.close();			
			//将字节数组转换成字符创, 并转换编码的格式
			String strMsg = EncodingUtils.getString(buffer, "UTF-8");
			edtRead.setText(strMsg);
			Toast.makeText(RwActivity.this, "文件读取成功!", 1000).show();			
		}
		catch(Exception ex)
		{
			Toast.makeText(RwActivity.this, "文件读取失败!", 1000).show();
		}
	}

Oncreate()方法源码:

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_rw);
		edtWrite=(EditText)findViewById(R.id.editTextWrite);
		edtRead=(EditText)findViewById(R.id.EditTextRead);
		btnWrite=(Button)findViewById(R.id.buttonWrite);
		btnRead=(Button)findViewById(R.id.ButtonRead);
		//写内容
		btnWrite.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) 
			{	
//				write(edtWrite.getText().toString());
//				Toast.makeText(RwActivity.this, "文件写入成功", 1000).show();
				writeDataToSD(edtWrite.getText().toString());
			}		 
		});
		//读内容
		btnRead.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) 
			{	
//				edtRead.setText(read());
//				Toast.makeText(RwActivity.this, "文件读取成功", 1000).show();
				readDataFromSD();		
			}		 
		});
	}

完成后,软件的截图如下:

关于Android中从Sqlite和网络读写数据下面的博文中会陆续奉上,还望大家多多支持!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏james大数据架构

实例演示Android异步加载图片

本文给大家演示异步加载图片的分析过程。让大家了解异步加载图片的好处,以及如何更新UI。 首先给出main.xml布局文件: 简单来说就是 LinearLayou...

2125
来自专栏双十二技术哥

Android fragment 标签加载过程分析

在上一篇文章中我们介绍了 AsyncLayoutInflater 使用的注意事项及改进方案。

1421
来自专栏Fish

SharedPreferences存储数据

使用这个可以在不同的Activity中调用并获得里面保存的值。这个貌似是把里面的内容保存在了一个xml文件里。 Android应用开发SharedPrefe...

23410
来自专栏青蛙要fly的专栏

Android技能树 — LayoutInflater Factory小结

前段时间流行起来了突然不愿意写Shape,Selector文件的文章,然后各种方案,编写自定义View等。那时候大家应该都看到了一篇: 无需自定义View,彻底...

1563
来自专栏向治洪

android多线程下载3

今天跟大家一起分享下android开发中比较难的一个环节,可能很多人看到这个标题就会感觉头很大,的确如果没有良好的编码能力和逻辑思维,这块是很难搞明白的,前面2...

1925
来自专栏Android干货

安卓开发_数据存储技术_SharedPreferences类

3018
来自专栏Android干货

Android接口回调机制

1643
来自专栏Android干货园

Retrofit--记使用Retrofit时遇到的一个坑

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/52...

1021
来自专栏分享达人秀

自定义BaseAdapter

在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作。也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用...

2178
来自专栏小鄧子的技术博客专栏

【译】在列表视图中处理空值

本篇文章主要针对两类开发者。第一个是曾遇到过IllegalArgumentException: Path must not be empty问题的开发者。第二个...

863

扫码关注云+社区

领取腾讯云代金券