五个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>
















