专栏首页GIS讲堂安卓中的数据存取

安卓中的数据存取

引言:

在我们每天使用的手机设备中,无时无刻都在进行着数据的存和取。安卓作为一种手机操作系统,提供了如下方式的数据存取方式: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 条评论
登录 后参与评论

相关文章

  • Android数据读取之Sqlite数据库操作

    咱们书接上文,继续来说说Android数据读取,这回,我们要讲的是Sqlite数据库的相关操作。以一个实例开始吧:

    lzugis
  • Arcgis andoid开发之应用百度地图接口实现精准定位与显示

    怀着激动、兴奋的心情,在这个漫天柳絮的季节写下了这片博文,为什么呢,因为困扰我很久的一个技术性的问题得到了解决,发次博文,供大家参观、学习,同时,也以慰藉我长期...

    lzugis
  • 用百度地图API打造方便自己使用的手机地图

    有钱人咱就不说了,因为偶是个穷银……因为穷,所以去年买的Huawei C8650+到现在还在上岗,对于没有钱买好的配置的手机的童鞋来说,类似于百度,谷歌,高德等...

    lzugis
  • Kotlin与Databinding(一)简介封装

    code_horse
  • 拖动条SeekBar及星级评分条

    1.布局 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"...

    欢醉
  • SQLite的增删改查

    Dream城堡
  • 体验活动的生命周期

    当窗口处于停止状态的时候,我们需要保存一部分销毁前的值,可以使用bundle,如下:

    Dream城堡
  • kotlin如何使用MVVM的开发模式

    互联网开发模式经历了MVC、MVP。Android本身的开发模式为MVC,前些年MVP大行其道,这两年MVVM逐渐开始流行,最近准备用kotlin开发一个项目,...

    大话swift
  • 六大布局之RelativeLayout

    上一期我们给大家讲解了FrameLayout的使用,这一期我们为大家讲解一下RelativeLayout(相对布局)的使用,RelativeLayout是And...

    下码看花
  • Android布局练习—计算器

    用户1515472

扫码关注云+社区

领取腾讯云代金券