当前位置: 代码迷 >> Android >> Android中的数据存取跟IO <第一篇>
  详细解决方案

Android中的数据存取跟IO <第一篇>

热度:266   发布时间:2016-04-28 06:34:21.0
Android中的数据存取和IO <第一篇>

         应用程序都会涉及到数据的输入、输出,android应用也不例外。Android中应用程序存储数据通常有两种模式:1,数据量少,格式简单(例如,字符串、标量),使用普通文本就好,可以使用Android系统提供的SharedPreferences保存;2、需要大量的数据存储访问,可以借助数据库,android系统提供了内置SQLite数据库,而且为访问数据库提供了方便的API。本片文章将会详细讲述如何在Android中使用数据库。

         1、使用SharedPreferences访问key-value对和使用Editor写入数据

          在一些小应用中,比如游戏的玩家积分(飞机大战之类的)、应用程序的配置信息(是否打开音效、振动等),使用SharedPreferences保存,这个方法保存的数据主要是简单类型的key-value对。

         SharedPreferences提供的成员函数主要有三个:

       》boolean contians(String key)

       》abstract Map<String,?> getAll(); 获取SP数据里面的全部数据

       》boolean getXxx(String key,xxx defVlaue)  :获取key的值。

           SharedPreferences并没有写入数据的能力,需要调用edit()方法来获取对应的Editor()。

         》SharedPreferences.Editor clear()  :清空SharedPreferences里面所有的额数据

         》SharedPreferences.Editor putXxx(String key, xxx value):向SharedPreferences存入key值

         》boolean 层哦秘密他() :当完成editot编译,提交改方法,通常写在末尾。

        SharedPreferences是一个接口,程序无法直接创建SharedPreferences实例,需要通过Context提供getSharedPreferences(Stirng name,int  mode)来创建实例。

         第二个参数如下:

          》Context.MODE_PRIVATE   :指定改数据只能被本程序读写

          》Context.MODE_WORLD_READABLE:可以被其他程序读,但不能写

          》Context.MODE_WORLD_WRITEABLE:课被其他读写。

  例程如下:提供两个按钮,一个写入数据,另一个读取写入的数据。

1、activity下的.java文件如下:

package org.crazyit.io;import java.text.SimpleDateFormat;import java.util.Date;import android.app.Activity;import android.content.SharedPreferences;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;/** * Description: * <br/>site: <a href="http://www.crazyit.org">crazyit.org</a>  * <br/>Copyright (C), 2001-2012, Yeeku.H.Lee * <br/>This program is protected by copyright laws. * <br/>Program Name: * <br/>Date: * @author  Yeeku.H.Lee [email protected] * @version  1.0 */public class SharedPreferencesTest extends Activity{	SharedPreferences preferences;	SharedPreferences.Editor editor;	@Override	public void onCreate(Bundle savedInstanceState)	{		super.onCreate(savedInstanceState);		setContentView(R.layout.main);		// 创建SharedPreferences实例,名字、可读		preferences = getSharedPreferences("crazyit", MODE_WORLD_READABLE);		editor = preferences.edit();		Button read = (Button) findViewById(R.id.read);		Button write = (Button) findViewById(R.id.write);		read.setOnClickListener(new OnClickListener()		{			@Override			public void onClick(View arg0)			{				//获取time的字符串				String time = preferences.getString("time", null);				//读取int的随机数				int randNum = preferences.getInt("random", 0);				String result = time == null ?   //?判断				"您暂时还未写入数据": "写入时间:" + time + "\n上次随机生成的随机数为:" + randNum;				//toast提示				Toast.makeText(SharedPreferencesTest.this , result ,  Toast.LENGTH_LONG).show();			}		});				write.setOnClickListener(new OnClickListener()		{			@Override			public void onClick(View arg0)			{				SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 "					+ "hh:mm:ss");				// 存入当前时间				editor.putString("time", sdf.format(new Date()));				// 存入随机数				editor.putInt("random", (int) (Math.random() * 100));				// 提交数据				editor.commit();			}		});	}}

   2、res下面的布局文件:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"	android:orientation="horizontal"	android:layout_width="fill_parent"	android:layout_height="fill_parent"	android:gravity="center_horizontal"	><Button 	android:id="@+id/write"	android:layout_width="wrap_content" 	android:layout_height="wrap_content" 	android:text="@string/write"	/><Button 	android:id="@+id/read"	android:layout_width="wrap_content" 	android:layout_height="wrap_content" 	android:text="@string/read"	/>	</LinearLayout>

3、AVD调试结果如下:

   打开DDMS调试可以知道,sharedpreferences数据总是保存在/data/data/<package name>/shared_prefs目录下面以.xml形式保存。

         2、File存储

         Java提供了一套完整的IO流体系,包括FileInPutSream、FileOutPutStream,通过这些IO流来访问磁盘文件,android同样支持以这种方式来访问手机存储器的文件。

     Context提供了两种方法来打开文件应用程序下的数据文件IO流:

     》   public FileInputStream openFileInput (String name)    :打开输入流文件name

     》   public  FileOutputStream openFileOutput (String name, int mode)            :打开输出流文件name

   这里解释一下输入流和输出流:输入流指的是从硬盘等存储器中读数据到内存中,软件在内存中运行;输出流指的是从内存中读数据到外部存储器中。

      mode参数主要有:

          》MODE_PRIVATE   :指定改数据只能被本程序读写

          》MODE_APPEND  :以追加方式打开,可向该文件夹中追加内容

          》MODE_WORLD_READABLE:可以被其他程序读,但不能写

          》MODE_WORLD_WRITEABLE:可被其他读写。

       除此之外,Context还提供了如下方法来访问应用程序的文件夹。
         》getDir(String name, int mode)  :  在应用程序的数据文件下获取或创建name对于的子文件夹
         》File getFileDir()  :获取应用程序的数据文件的绝对路径
         》String fileList()  :返回文件文件夹list
         》deleteFile(String name)  :删除name文件
    下面根据例程来分析:两个文本框,两个按钮,第一组用于写入文件名字和存入;第二组用于读取文件,并显示。

1、activity下的.java

package wqt.list.filereadwrite;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.PrintStream;import android.os.Bundle;import android.app.Activity;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;public class MainActivity extends Activity {		final String File_name="Read_Write";		@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);				Button read=(Button)findViewById(R.id.read);		Button write=(Button)findViewById(R.id.write);				final EditText edit1=(EditText) findViewById(R.id.edit1);		final EditText edit2=(EditText) findViewById(R.id.edit2);		write.setOnClickListener(new OnClickListener() 		{						@Override			public void onClick(View v) {				// TODO Auto-generated method stub				//将wdit1中的内容写入到文件中				write(edit1.getText().toString());  //write函数在下面需要定义				edit1.setText("");			}		});				read.setOnClickListener(new OnClickListener() 		{						@Override			public void onClick(View v) {				// TODO Auto-generated method stub				edit2.setText(read());         //read函数需要在下面定义			}		});			}		private String read()	{		try		{			//打开文件输入流			FileInputStream fis =openFileInput(File_name );			byte[] buff = new byte[1024];			int hadRead =0;			StringBuilder sb = new StringBuilder("");			while( (hadRead = fis.read(buff)) > 0)			{				sb.append(new String(buff,0,hadRead));			}		    return sb.toString();		}		catch(Exception e)		{			e.printStackTrace();		}		return null;	}		private void write(String content)	{		try		{			//使用追加模式打开文件输出流			FileOutputStream fos = openFileOutput(File_name, MODE_APPEND);			PrintStream ps=new PrintStream(fos);			ps.println(content);			ps.close();							}		catch(Exception e)		{			e.printStackTrace();		}	}}
2.res下的layout文件.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"	android:orientation="vertical"	android:layout_width="fill_parent"	android:layout_height="fill_parent">    <Button         android:id="@+id/write"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/write"/>    <EditText         android:id="@+id/edit1"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:lines="4"/>    <Button         android:id="@+id/read"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/read"/>    <EditText                 android:id="@+id/edit2"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:lines="4"        android:editable="false"        android:cursorVisible="false"/></LinearLayout>

   3、AVD调试:



  相关解决方案