Android数据存储五种方式

339 阅读6分钟

1. 使用SharedPreferences存储数据

适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),解锁口 令密码等 核心原理:保存基于XML文件存储的key-value键值对数据,通常用来存储一些简单的配置信息。通过DDMS的File Explorer面板,展开文件浏览树,很明显SharedPreferences数据总是存储在/data/data//shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接口Editor对象实现。 SharedPreferences本身是一 个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences实例,该方法中name表示要操作的xml文件名,第二个参数具体如下:

             Context.MODE_PRIVATE: 指定该SharedPreferences数据只能被本应用程序读、写。
             Context.MODE_WORLD_READABLE:  指定该SharedPreferences数据能被其他应用程序读,但不能写。
             Context.MODE_WORLD_WRITEABLE:  指定该SharedPreferences数据能被其他应用程序读,写

Editor有如下主要重要方法:

             SharedPreferences.Editor clear():清空SharedPreferences里所有数据
             SharedPreferences.Editor putXxx(String key , xxx value): 向SharedPreferences存入指定key对应的数据,其中xxx 可以是boolean,float,int等各种基本类型据
             SharedPreferences.Editor remove(): 删除SharedPreferences中指定key对应的数据项
             boolean commit(): 当Editor编辑完成后,使用该方法提交修改

程序核心代码如下: class ViewOcl implements View.OnClickListener{

    @Override
    public void onClick(View v) {

        switch(v.getId()){
        case R.id.btnSet:
            //步骤1:获取输入值
            String code = txtCode.getText().toString().trim();
            //步骤2-1:创建一个SharedPreferences.Editor接口对象,lock表示要写入的XML文件名,MODE_WORLD_WRITEABLE写操作
            SharedPreferences.Editor editor = getSharedPreferences("lock", MODE_WORLD_WRITEABLE).edit();
            //步骤2-2:将获取过来的值放入文件
            editor.putString("code", code);
            //步骤3:提交
            editor.commit();
            Toast.makeText(getApplicationContext(), "口令设置成功", Toast.LENGTH_LONG).show();
            break;
        case R.id.btnGet:
            //步骤1:创建一个SharedPreferences接口对象
            SharedPreferences read = getSharedPreferences("lock", MODE_WORLD_READABLE);
            //步骤2:获取文件中的值
            String value = read.getString("code", "");
            Toast.makeText(getApplicationContext(), "口令为:"+value, Toast.LENGTH_LONG).show();
            
            break;
            
        }
    }
    
}

2. 文件存储数据

核心原理: Context提供了两个方法来打开数据文件里的文件IO流 FileInputStream openFileInput(String name); FileOutputStream(String name , int mode),这两个方法第一个参数 用于指定文件名,第二个参数指定打开文件的模式。具体有以下值可选:

         MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可   以使用Context.MODE_APPEND
         MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
         MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;
         MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。

除此之外,Context还提供了如下几个重要的方法:

         getDir(String name , int mode):在应用程序的数据文件夹下获取或者创建name对应的子目录
         File getFilesDir():获取该应用程序的数据文件夹得绝对路径
         String[] fileList():返回该应用数据文件夹的全部文件               

核心代码如下:

public String read() {
    try {
        FileInputStream inStream = this.openFileInput("message.txt");
        byte[] buffer = new byte[1024];
        int hasRead = 0;
        StringBuilder sb = new StringBuilder();
        while ((hasRead = inStream.read(buffer)) != -1) {
            sb.append(new String(buffer, 0, hasRead));
        }

        inStream.close();
        return sb.toString();
    } catch (Exception e) {
        e.printStackTrace();
    } 
    return null;
}

public void write(String msg){
    // 步骤1:获取输入值
    if(msg == null) return;
    try {
        // 步骤2:创建一个FileOutputStream对象,MODE_APPEND追加模式
        FileOutputStream fos = openFileOutput("message.txt",
                MODE_APPEND);
        // 步骤3:将获取过来的值放入文件
        fos.write(msg.getBytes());
        // 步骤4:关闭数据流
        fos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

3.SQLite存储数据

SQLite是一个轻量级的嵌入式数据库,是Andriod所带的一个标准的数据库,只有五种数据类型,分别是:NULL(空值)、INTEGER(整数)、REAL(浮点数)、TEXT(字符串)、BLOB(二进制数据)。其支持统一的SQL语句,可以利用SQL语句对数据进行增、删、改、查。 使用DatabaseHelper类继承SQliteOpenHelper类,并重写onCreate和onUpgrade方法。在onCreate()方法中首先构造一条SQL语句,然后调用db.execSQL(sql)执行SQL语句。SQliteOpenHelper是一个辅助类,此类主要用于生成一个数据库,并对数据库的版本进行管理。当调用这个类的方法getWritableDatabase()或getReadableDatabasw()方法时,如果当时没有数据,那么Android系统就会自动生成一个数据库。

4. 使用ContentProvider存储数据

Android中的两个程序之间进行数据交换就是通过ContentProvider实现的。ContentProvider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。在程序内可以通过实现Content Provider的抽象接口将自己的数据显示出来。外界可以通过这套标准、统一的接口和程序中的数据实现交互,既可以读取程序中的数据,也可以删除程序中的数据。 比较常见的接口是ContentResolver,外部程序可以通过ContentResolver接口访问ContentProvider提供的数据。在Activity中可以通过getContentResolver()得到当前应用的ContentResolver实例。ContentResolver提供的接口需要和ContentProvider中需要实现的接口相对应,常用的接口主要有以下几个: query(Uri uri, String[] projection, String selection, String[] selectionArgs,StringsortOrder):通过Uri进行查询,返回一个Cursor; insert(Uri url, ContentValues values):将一组数据插入到Uri指定的地方 updata(Uri uri, ContentValues values, String where, String[] selectionArgs):更新Uri指定位置的数据 delete(Uri url, String where, String[] selectionArgs):删除指定Uri且符合一定条件的数据。

5. 网络存储数据

前面介绍的几种存储都是将数据存储在本地设备上,除此之外,还有一种存储(获取)数据的方式,通过网络来实现数据的存储和获取。 我们可以调用WebService返回的数据或是解析HTTP协议实现网络数据交互。 具体需要熟悉java.net.*,Android.net.*这两个包的内容,在这就不赘述了,请大家参阅相关文档。 下面是一个通过地区名称查询该地区的天气预报,以POST发送的方式发送请求到webservicex.net站点,访问WebService.webservicex.net站点上提供查询天气预报的服务。 代码如下:

package com.android.weather;  

import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 
import org.apache.http.protocol.HTTP; 
import org.apache.http.util.EntityUtils; 

import android.app.Activity; 
import android.os.Bundle; 

public class MyAndroidWeatherActivity extends Activity { 
//定义需要获取的内容来源地址 
private static final String SERVER_URL =  
    "http://www.webservicex.net/WeatherForecast.asmx/GetWeatherByPlaceName";  

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    HttpPost request = new HttpPost(SERVER_URL); //根据内容来源地址创建一个Http请求 
    // 添加一个变量  
    List<NameValuePair> params = new ArrayList<NameValuePair>();  
    // 设置一个地区名称 
    params.add(new BasicNameValuePair("PlaceName", "NewYork"));  //添加必须的参数 

    try {  
        //设置参数的编码 
        request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));  
        //发送请求并获取反馈 
        HttpResponse httpResponse = new DefaultHttpClient().execute(request); 

        // 解析返回的内容 
        if(httpResponse.getStatusLine().getStatusCode() != 404){  
           String result = EntityUtils.toString(httpResponse.getEntity());  
           System.out.println(result); 
        } 
    } catch (Exception e) { 
        e.printStackTrace(); 
   }  
}