五个Android保存数据方法

1.SharePreferences

2.File

3.SQLite

4.Network通过网络来获取和保存数据资源,这个方法需要设备保持网络连接状态,所以相对存在一些限制。下面列出了两个用于相关操作的类:

.*  android.net.* 以上是四种Android保存数据的方法常用于针对Android平台来存储和读取数据的方法。

5.使用ContentProvider 存储数据;

Android数据存储之ContentProvider

一个应用程序通过ContentProvider以数据表的形式将数据暴漏出去,这个过程中,ContentProvider就像一个数据库,这个provider在系统启动时候就已经创建了,并采用URI表示外界需要访问的数据库;实现这个功能有两种方式:创建一个属于自己的Content provider(有相同数据类型,并且有写入Content provider的权限)或者将你的数据添加到一个已经存在的Content provider中。

一个应用程序通过ContentResolver接口访问另外一个应用程序暴露的ContentProvider提供的数据。即ContentProvider负责: 1. 组织应用程序的数据,向其他应用程序提供数据;ContentResolver负责: 1. 获取ContentProvider提供的数据,增删改查数据;

当数据需要在应用程序之间共享时,可以在某程序中使用 ContentProvider 定义  URI (网络资源)以使其它应用程序可以使用ContentResolver接口通过此 URI 访问指定的数据

URI :

例如:"content://com.example.transportationprovider/trains/122”

将其分为4个部分:

A("content://"):标准前缀,用来说明一个Content provider控制该数据,是无法改变的;
B("com.example.transportanitionprovider"):URI标识,定义了哪个Content provider提供该数
       据,是一个完整的,小写的类名。该标识在<provider>元素的authorities说明:
<provider  name=".TransportationProvider"  authorities= "com.example.transportationprovider/trains"/>
C("/trains") :路径,确定当前需要的数据类型,可多可一
D("/122"):要获取记录的ID,如果没有,返回全部

ContentResolver

采用类似数据库操作的方式从ContentProvider以类似数据库表形式暴露的数据中读取信息,使用ContentResolver cr= getContentResolver();得到ContentResolver

主要接口:

finalUri  insert(Uri uri, ContentValues values)    //插入一行到uri 指定的位置
finalint  delete(Uri uri, String where, String[]selectionArgs)     //删除uri 规定的行
final Cursorquery(Uri uri, String [] projection, String selection, String selectionArgs,String sortOrder)
final intupdate(Uri uri, ContentValues values, String where, String []selectionArgs) 
ContentProvider:

在提供数据时,URI中D部分可能包含一个_ID,SDK推荐在提供数据表字段中包含一个ID,在建表时用 INTEGER PRIMARYKEY AUTOINCREMENT标识此ID字段

提供接口:

query(Uri , String[],  String , String [] , String);
insert(Uri ,ContentValues);
update(Uri ,ContentValues , String , String []);
delete(Uri ,String , String [] );

关于存取数据同步问题: 在AndroidManifest.XML中定义ContentProvider时候,需要考虑<provider>元素multiprocess属性,而且在ContentResolver中,提供了notifyChange()接口,在数据改变时会通知其他ContentObserver,这个地方应用了观察者模式。

MyUser.java
packagecom.webabcd.contentprovider;
importandroid.net.Uri;
importandroid.provider.BaseColumns;
public class MyUser
{
       publicstatic final class User implements BaseColumns
       {
              publicstatic final Uri CONTENT_URI =Uri.parse("content://com.webabcd.MyContentProvider");
              publicstatic final String USER_NAME = "USER_NAME"
       }
}
MyContentProvider.java
packagecom.webabcd.contentprovider;
.File;
.FileInputStream;
.FileOutputStream;
importorg.apache.http.util.EncodingUtils;
importandroid.content.ContentProvider;
import android.content.ContentUris;
importandroid.content.ContentValues;
importandroid.database.Cursor;
importandroid.database.MatrixCursor;
importandroid.net.Uri;
public classMyContentProvider extends ContentProvider
{
       privateFile file;
       privateFileOutputStream out;
       privateFileInputStream in;
       @Override
       publicint delete(Uri uri,String selection,String [] selectionArgs)
       {
              return0;
       }
       @Override 
    publicString getType(Uri uri) {  
        returnnull;  
    }
       @Override
         publicUri insert(Uri uri,ContentValues values)
       {
              try
              {
                     out= new FileOutputStream(file);
                     out.write(values.getAsString(MyUser.user.USER_NAME).getBytes());
                     out.close();
                     introwId = 0;  
            UrirowUri = ContentUris.appendId(  
                    MyUser.User.CONTENT_URI.buildUpon(),rowId).build();  
            getContext().getContentResolver().notifyChange(rowUri,null);  
            returnrowUri;  
              }
              catch()
              {
                     returnnull;
              }
       }
       @Override
       publicboolean onCreate()
       {
              try{  
            file= new File("/data/data/com.webabcd.contentprovider/",  
                    "demo.txt");  
            if(!file.exists())  
                file.createNewFile();  
            returntrue;  
        }catch (Exception ex) {  
            returnfalse;  
        }
       }
    @Override 
    publicCursor query(Uri uri, String[] projection, String selection,  
            String[]selectionArgs, String sortOrder) {  
        Stringcontent;
        try{  
            in= new FileInputStream(file);  
            intlength = (int) file.length();  
            byte[]buffer = new byte[length];  
            in.read(buffer,0, length);  
            content= EncodingUtils.getString(buffer, "UTF-8");  
            in.close(); 
            String[]columns = new String[] { MyUser.User._ID, MyUser.User.USER_NAME };  
            MatrixCursorcur = new MatrixCursor(columns);  
            String[]values = new String[] { "0", content };  
            cur.moveToFirst();  
            cur.addRow(values);  
            returncur;  
        }catch (Exception e) {  
            returnnull;  
        }  
    }  
    @Override 
    publicint update(Uri uri, ContentValues values, String selection, 
            String[]selectionArgs) { 
        return0;  
    } 
}
/*
 * 几个常用的系统内置的ContentProvider如下:
 * content://media/internal/images 这个URI将返回设备上存贮的所有图片
 * content://contacts/people/  返回设备上所有的联系人信息
 * content://contacts/people/2  这个URI返回单个结果(联系人信息中ID为2的联系人记录)
 /* AndroidManifest.xml   
 <!--   配置一个自定义的Provide  -->   
 <providerandroid:name="MyContentProvider"android:authorities="com.webabcd.MyContentProvider"/>  
 <uses-permissionandroid:name="android.permission.WRITE_CONTACTS"></uses-permission>  
 <uses-permissionandroid:name="android.permission.READ_CONTACTS"></uses-permission>