Android 数据存储
2015-09-28 15:49
459 查看
1>SharedPreferences
轻型的数据存储方式,本质是基于XML文件存储Key-value键值对数据。通常用来存储一些简单的配置信息。
1> SharedPreferences对象本身只能获取数据而不支持存储和修改数据。存储修改是通过Editor对象实现。
2> 实现SharedPreferences存储的步骤如下:
(1)。获得SharedPreferences对象。
(2)。获得SharedPreferences.Editor对象。
(3)。通过Editor接口的PutXxx方法保存Key-value对其中Xxx表示不同的数据类型。
[align=left] //由系统指定SharedPreferences文件[/align]
[align=left] //SharedPreferences preferences=PreferenceManager.getDefaultSharedPreferences(MainActivity.this);[/align]
[align=left] //自己指定SharedPreferences文件的名字以及权限。[/align]
[align=left] SharedPreferences preferences=getSharedPreferences("SharedPreferences" , MODE_PRIVATE);[/align]
[align=left] Editor editor=preferences.edit();[/align]
[align=left] editor.putString( "key", "value" );[/align]
[align=left] editor.commit();[/align]
[align=left] editor.remove( "key");[/align]
[align=left] editor.commit();[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] //取消息[/align]
[align=left] preferences.getString("key", "");[/align]
[align=left] preferences.getInt( "age", 0);[/align]
2>SQLite
SQLite支持的数据类型:NULL\INTEGER\TEXT\BLOB。
动态数据类型(弱引用):当某个值插入到数据库是,SQLite将会检查它的类型,如果该类型与关联的不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储。
SQLiteDatabase:
提供一些管理SQLite数据库的类。
提供创建、删除、执行SQL命令,并执行其他常见的数据库管理任务的方法。
程序的数据库名字是唯一的。
db.execSQL(sql); //执行任何SQL语句
db.insert(table,nullColumnHack,values);
db.delete(table,whereClause,whereArgs);
db.update(table,values,whereClause,whereArgs);
db.query(table,columns,selection,selectionArgs,groupBy,having,orderBy);
db.rawQuery(sql,selectionArgs);
Cursor是Android查询数据后得到的一个管理数据集合的类,正常情况下,如果查询得到的数据量小时不会存在内存问题,而且虚拟机能保证Cusor最终被释放。
如果cursor的数据量特表大,特别是如果里面有blob信息时,应该保证Crusor占用的内存被及时释放掉,而不是等待GC来处理,并且Android明显是倾向于编程者手动将cursor close掉的,因为在源代码中我们发现,如果等到GC来回收是,也就是如果不手动关闭,系统会报错,会给用户以错误提示。
Cursor:游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等常用方法。
getCount() 总记录数
isFirst(); 判断是否第一条记录
isLast(); 判断是否最后一条记录
moveToFirst(); 移动到第一条记录
moveToLast(); 移动到最后一条记录
move(int offset); 移动到指定记录
moveToNext(); 移动到下一条记录
moveToPrevious(); 移动到上一条记录
getColumnIndexOrThrow(String columnName); 据列名获得列索引
getInt(int columnIndex); 获得指定列索引的INT类型值
getString(int columnIndex); 获得指定列索引的String类型值
[align=left] //创建数据库[/align]
[align=left] SQLiteDatabase db=openOrCreateDatabase( "SQLite.db", MODE_PRIVATE , null);[/align]
[align=left] db.execSQL( "create table if not exists usertb(_id integer primary key autoincrement,name text not null,age integer not null,sex text not null )");[/align]
[align=left] db.execSQL( "insert into usertb(name,sex,age) values('az','man','19')");[/align]
[align=left] Cursor c=db.rawQuery( "select * from usertb", null );[/align]
[align=left] if(c!=null ){[/align]
[align=left] while(c.moveToNext()){[/align]
[align=left] c.getInt(c.getColumnIndexOrThrow( "_id"));[/align]
[align=left] }[/align]
[align=left] c.close(); //释放游标[/align]
[align=left] }[/align]
[align=left] db.close(); //释放数据库对象[/align]
ContentValues
这个类是用来存储一组可以被ContextResolver处理的值。
ContentValues values=new ContentValues(); //类似hashMap key value 的形式
values.put("name","zhangsan");
[align=left] //创建数据库[/align]
[align=left] SQLiteDatabase db=openOrCreateDatabase( "SQLite.db", MODE_PRIVATE , null);[/align]
[align=left] db.execSQL( "create table if not exists stutb (_id integer primary key autoincrement)");[/align]
[align=left] ContentValues values= new ContentValues();[/align]
[align=left] values.put( "name", "张三" );[/align]
[align=left] long rowid=db.insert( TABLE_NAME, null , values); //返回插入的行数[/align]
[align=left] values.clear(); //清空values[/align]
[align=left] values.put( "name", "张三" );[/align]
[align=left] db.insert( TABLE_NAME, null , values); [/align]
[align=left] values.clear();[/align]
[align=left] values.put( "name", "李四" );[/align]
[align=left] db.update( TABLE_NAME, values, "_id>?" , new String[]{"3"}); //将所有ID大于三的name该成李四[/align]
[align=left] db.delete( TABLE_NAME, "name like ?" , new String[]{"%四%"}); //删除所有name中带有“四”的人[/align]
[align=left] Cursor c=db.query( TABLE_NAME,null , "name like ?" , new String[]{"0"}, null, null , "name" );[/align]
[align=left] if(c!=null ){[/align]
[align=left] String[] column=c.getColumnNames();[/align]
[align=left] while (c.moveToNext()) {[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] c.close();[/align]
[align=left] }[/align]
[align=left] db.close();[/align]
[align=left] }[/align]
SQLiteOpenHelper:
SQLiteDatabase的帮助类,用于管理数据库的创建和版本更新
一般是建立一个类继承它,并重新onCreate()和onUpgrade()方法
onCreate(SQLiteDatabase db); 创建数据库时调用
onUpgrade(SQLiteDatabase db,int oldVersion,int new Version); 版本更新是调用
getReadableDatabase(); //创建或打开一个只读数据库
getWritableDatabase(); //创建或打开一个读写数据库
[align=left]public class SQLitedata extends SQLiteOpenHelper{[/align]
[align=left] [/align]
[align=left] public SQLitedata(Context context, String name, CursorFactory factory,[/align]
[align=left] int version) {[/align]
[align=left] super(context, name, factory, version);[/align]
[align=left] // TODO Auto-generated constructor stub[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 首次创建数据库时调用,一般可以把建库、建表的操作[/align]
[align=left] */[/align]
[align=left] @Override[/align]
[align=left] public void onCreate(SQLiteDatabase db) {[/align]
[align=left] db.execSQL( "create table if not exists stutb(_id integer primary key autoincrement)");[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 当数据库版本发生变化时会自动执行[/align]
[align=left] */[/align]
[align=left] @Override[/align]
[align=left] public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]public class MainActivity extends Activity {[/align]
[align=left] [/align]
[align=left] public static final String TABLE_NAME= "stutb";[/align]
[align=left] [/align]
[align=left] @Override[/align]
[align=left] protected void onCreate(Bundle savedInstanceState) {[/align]
[align=left] super.onCreate(savedInstanceState);[/align]
[align=left] setContentView(R.layout. activity_main);[/align]
[align=left] SQLitedata litedata= new SQLitedata(MainActivity.this,"stu.db", null, 0);[/align]
[align=left] litedata.getReadableDatabase(); //获取一个只读的数据库[/align]
[align=left] SQLiteDatabase db=litedata.getWritableDatabase(); //获取一个可读可写的数据库[/align]
[align=left] Cursor c=db.rawQuery( "select * from stutv", null );[/align]
[align=left] c.close();[/align]
[align=left] db.close();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]}[/align]
3>Content Provider
如何实现ContentProvider
1.继承抽象类contentprovide实现一系列针对于数据的增、删、改、查等方法。
2.需在AndroidMainfest.xml中完成对contentprovider的注册。
<provider
android:name="com.az.MusicProvider"
android:name="com.provider.music"
></provider>
注册的authorities属性值是全局唯一的。
[align=left] [/align]
[align=left]/**[/align]
[align=left] * URI 通用资源标识符个[/align]
[align=left] * content://packagename/music/#[/align]
[align=left] * UriMatcher类[/align]
[align=left] * Urimatcher matcher=new UriMarcher(UriMarcher.NO_MATCH);[/align]
[align=left] * UriMatcher.NO_MATCH 表示不匹配任何路径的返回值[/align]
[align=left] * marcher.addURI("com.az.provider","music",1);[/align]
[align=left] * 往UriMarcher类里添加一个拼凑的 Uri[/align]
[align=left] * UriMatcher为 Uri的容器,容器里面包含着我们即将可能要操作的 Uri[/align]
[align=left] * 如果通过match()方法匹配成功就返回code值[/align]
[align=left] * matcher.match(uri)[/align]
[align=left] * 首先与找通过addURI()方法添加进来的 Uri匹配。[/align]
[align=left] * 匹配成功则返回设置的code值,反之,返回一个UriMatcher.NO_MATCH 常量( -1)[/align]
[align=left] *[/align]
[align=left] * ContentResolver:[/align]
[align=left] * 使用contentResolver操作 contentprovider中的数据:[/align]
[align=left] * 当外部应用需要对 contentprovider中的数据进行添加、删除、修改和查询时[/align]
[align=left] * 可以使用contentResolver类来完成[/align]
[align=left] * 使用activity提供的getContentResover()方法获取ContentResover对象。[/align]
[align=left] * ContentResolver类提供了与contentProvider相同签名的四个方法[/align]
[align=left] * public Uri insert(Uri rui,ContentValues values)[/align]
[align=left] * 该方法用于往 contentprovider添加数据[/align]
[align=left] * public int delete(Uri uri,String selection,String[] selectionArgs)[/align]
[align=left] * 该方法用于从contentProvider删除数据[/align]
[align=left] * public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs)[/align]
[align=left] * 该方法用户更新 contentprovier中的数据[/align]
[align=left] * public Cursor query( Uri uri ,String[] projection,String selection,String[] selectionArgs,String sortOrder)[/align]
[align=left] * 该方法用于从contentProvider中获取数据[/align]
[align=left] * @author az[/align]
[align=left] *[/align]
[align=left] */[/align]
[align=left]public class MyContentProider extends ContentProvider{[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 根据URI删除selection指定的条件所匹配的全部记录[/align]
[align=left] */[/align]
[align=left] @Override[/align]
[align=left] public int delete(Uri uri, String selection, String[] selectionArgs) {[/align]
[align=left] // TODO Auto-generated method stub[/align]
[align=left] return 0;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 返回当前URI的MIME类型,[/align]
[align=left] * 如果该URI对应的数据可能包含多条记录,那么MIME类型字符串就是以vnd.android.dir/开头[/align]
[align=left] * 如果该URI对应的数据只包含一条记录,该MIME类型字符串就是以vnd.android.cursor。item/开头[/align]
[align=left] */[/align]
[align=left] @Override[/align]
[align=left] public String getType(Uri uri) {[/align]
[align=left] // TODO Auto-generated method stub[/align]
[align=left] return null ;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 根据URI插入的values对应的数据[/align]
[align=left] */[/align]
[align=left] @Override[/align]
[align=left] public Uri insert(Uri uri, ContentValues values) {[/align]
[align=left] // TODO Auto-generated method stub[/align]
[align=left] return null ;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 在 contentprovider创建后被调用[/align]
[align=left] */[/align]
[align=left] @Override[/align]
[align=left] public boolean onCreate() {[/align]
[align=left] // TODO Auto-generated method stub[/align]
[align=left] return false ;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 根据URI查询出selection指定的条件所匹配的全部记录,并且可以指定查询那些列,以什么方式排序
[/align]
[align=left] */[/align]
[align=left] @Override[/align]
[align=left] public Cursor query(Uri uri, String[] projection, String selection,[/align]
[align=left] String[] selectionArgs, String sortOrder) {[/align]
[align=left] // TODO Auto-generated method stub[/align]
[align=left] return null ;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 根据URI修改selection指定的条件所匹配的全部记录[/align]
[align=left] */[/align]
[align=left] @Override[/align]
[align=left] public int update(Uri uri, ContentValues values, String selection,[/align]
[align=left] String[] selectionArgs) {[/align]
[align=left] // TODO Auto-generated method stub[/align]
[align=left] return 0;[/align]
[align=left] }[/align]
[align=left]}[/align]
4>File
Android中文件存储的操作:
activity的openFileOutput()方法可以用于把数据输出到文件中
创建的文件保存在/data/data/<package name>/files目录
实现过程与在java中保存数据到文件中是一样的
[align=left] File file=this.getFilesDir(); //这个目录是当前应用程序默认的数据存储目录[/align]
[align=left] File file0= this.getCacheDir(); //这个目录是当前应用程序默认的缓存文件的存放位置 如果手机的内存不足时,系统会自动去删除APP的cache目录的数据[/align]
[align=left] File file2= this.getDir("" , MODE_PRIVATE); //自定义目录[/align]
[align=left] this.getExternalCacheDir();//外部缓存目录[/align]
[align=left] this.getExternalFilesDir(type); //外置目录[/align]
[align=left] [/align]
[align=left]写入文件[/align]
[align=left] FileOutputStream fileOutputStream=openFileOutput( name, mode ); //打开一个文件[/align]
[align=left] fileOutputStream.wait(); //写入[/align]
[align=left] fileOutputStream.close(); //关闭[/align]
[align=left] [/align]
[align=left]读取文件(以流的形式)[/align]
[align=left] FileInputStream fileInputStream=openFileInput( name);[/align]
[align=left] ByteArrayOutputStream byteArrayOutputStream= new ByteArrayOutputStream();[/align]
轻型的数据存储方式,本质是基于XML文件存储Key-value键值对数据。通常用来存储一些简单的配置信息。
1> SharedPreferences对象本身只能获取数据而不支持存储和修改数据。存储修改是通过Editor对象实现。
2> 实现SharedPreferences存储的步骤如下:
(1)。获得SharedPreferences对象。
(2)。获得SharedPreferences.Editor对象。
(3)。通过Editor接口的PutXxx方法保存Key-value对其中Xxx表示不同的数据类型。
[align=left] //由系统指定SharedPreferences文件[/align]
[align=left] //SharedPreferences preferences=PreferenceManager.getDefaultSharedPreferences(MainActivity.this);[/align]
[align=left] //自己指定SharedPreferences文件的名字以及权限。[/align]
[align=left] SharedPreferences preferences=getSharedPreferences("SharedPreferences" , MODE_PRIVATE);[/align]
[align=left] Editor editor=preferences.edit();[/align]
[align=left] editor.putString( "key", "value" );[/align]
[align=left] editor.commit();[/align]
[align=left] editor.remove( "key");[/align]
[align=left] editor.commit();[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] //取消息[/align]
[align=left] preferences.getString("key", "");[/align]
[align=left] preferences.getInt( "age", 0);[/align]
2>SQLite
SQLite支持的数据类型:NULL\INTEGER\TEXT\BLOB。
动态数据类型(弱引用):当某个值插入到数据库是,SQLite将会检查它的类型,如果该类型与关联的不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储。
SQLiteDatabase:
提供一些管理SQLite数据库的类。
提供创建、删除、执行SQL命令,并执行其他常见的数据库管理任务的方法。
程序的数据库名字是唯一的。
db.execSQL(sql); //执行任何SQL语句
db.insert(table,nullColumnHack,values);
db.delete(table,whereClause,whereArgs);
db.update(table,values,whereClause,whereArgs);
db.query(table,columns,selection,selectionArgs,groupBy,having,orderBy);
db.rawQuery(sql,selectionArgs);
Cursor是Android查询数据后得到的一个管理数据集合的类,正常情况下,如果查询得到的数据量小时不会存在内存问题,而且虚拟机能保证Cusor最终被释放。
如果cursor的数据量特表大,特别是如果里面有blob信息时,应该保证Crusor占用的内存被及时释放掉,而不是等待GC来处理,并且Android明显是倾向于编程者手动将cursor close掉的,因为在源代码中我们发现,如果等到GC来回收是,也就是如果不手动关闭,系统会报错,会给用户以错误提示。
Cursor:游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等常用方法。
getCount() 总记录数
isFirst(); 判断是否第一条记录
isLast(); 判断是否最后一条记录
moveToFirst(); 移动到第一条记录
moveToLast(); 移动到最后一条记录
move(int offset); 移动到指定记录
moveToNext(); 移动到下一条记录
moveToPrevious(); 移动到上一条记录
getColumnIndexOrThrow(String columnName); 据列名获得列索引
getInt(int columnIndex); 获得指定列索引的INT类型值
getString(int columnIndex); 获得指定列索引的String类型值
[align=left] //创建数据库[/align]
[align=left] SQLiteDatabase db=openOrCreateDatabase( "SQLite.db", MODE_PRIVATE , null);[/align]
[align=left] db.execSQL( "create table if not exists usertb(_id integer primary key autoincrement,name text not null,age integer not null,sex text not null )");[/align]
[align=left] db.execSQL( "insert into usertb(name,sex,age) values('az','man','19')");[/align]
[align=left] Cursor c=db.rawQuery( "select * from usertb", null );[/align]
[align=left] if(c!=null ){[/align]
[align=left] while(c.moveToNext()){[/align]
[align=left] c.getInt(c.getColumnIndexOrThrow( "_id"));[/align]
[align=left] }[/align]
[align=left] c.close(); //释放游标[/align]
[align=left] }[/align]
[align=left] db.close(); //释放数据库对象[/align]
ContentValues
这个类是用来存储一组可以被ContextResolver处理的值。
ContentValues values=new ContentValues(); //类似hashMap key value 的形式
values.put("name","zhangsan");
[align=left] //创建数据库[/align]
[align=left] SQLiteDatabase db=openOrCreateDatabase( "SQLite.db", MODE_PRIVATE , null);[/align]
[align=left] db.execSQL( "create table if not exists stutb (_id integer primary key autoincrement)");[/align]
[align=left] ContentValues values= new ContentValues();[/align]
[align=left] values.put( "name", "张三" );[/align]
[align=left] long rowid=db.insert( TABLE_NAME, null , values); //返回插入的行数[/align]
[align=left] values.clear(); //清空values[/align]
[align=left] values.put( "name", "张三" );[/align]
[align=left] db.insert( TABLE_NAME, null , values); [/align]
[align=left] values.clear();[/align]
[align=left] values.put( "name", "李四" );[/align]
[align=left] db.update( TABLE_NAME, values, "_id>?" , new String[]{"3"}); //将所有ID大于三的name该成李四[/align]
[align=left] db.delete( TABLE_NAME, "name like ?" , new String[]{"%四%"}); //删除所有name中带有“四”的人[/align]
[align=left] Cursor c=db.query( TABLE_NAME,null , "name like ?" , new String[]{"0"}, null, null , "name" );[/align]
[align=left] if(c!=null ){[/align]
[align=left] String[] column=c.getColumnNames();[/align]
[align=left] while (c.moveToNext()) {[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] c.close();[/align]
[align=left] }[/align]
[align=left] db.close();[/align]
[align=left] }[/align]
SQLiteOpenHelper:
SQLiteDatabase的帮助类,用于管理数据库的创建和版本更新
一般是建立一个类继承它,并重新onCreate()和onUpgrade()方法
onCreate(SQLiteDatabase db); 创建数据库时调用
onUpgrade(SQLiteDatabase db,int oldVersion,int new Version); 版本更新是调用
getReadableDatabase(); //创建或打开一个只读数据库
getWritableDatabase(); //创建或打开一个读写数据库
[align=left]public class SQLitedata extends SQLiteOpenHelper{[/align]
[align=left] [/align]
[align=left] public SQLitedata(Context context, String name, CursorFactory factory,[/align]
[align=left] int version) {[/align]
[align=left] super(context, name, factory, version);[/align]
[align=left] // TODO Auto-generated constructor stub[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 首次创建数据库时调用,一般可以把建库、建表的操作[/align]
[align=left] */[/align]
[align=left] @Override[/align]
[align=left] public void onCreate(SQLiteDatabase db) {[/align]
[align=left] db.execSQL( "create table if not exists stutb(_id integer primary key autoincrement)");[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 当数据库版本发生变化时会自动执行[/align]
[align=left] */[/align]
[align=left] @Override[/align]
[align=left] public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]public class MainActivity extends Activity {[/align]
[align=left] [/align]
[align=left] public static final String TABLE_NAME= "stutb";[/align]
[align=left] [/align]
[align=left] @Override[/align]
[align=left] protected void onCreate(Bundle savedInstanceState) {[/align]
[align=left] super.onCreate(savedInstanceState);[/align]
[align=left] setContentView(R.layout. activity_main);[/align]
[align=left] SQLitedata litedata= new SQLitedata(MainActivity.this,"stu.db", null, 0);[/align]
[align=left] litedata.getReadableDatabase(); //获取一个只读的数据库[/align]
[align=left] SQLiteDatabase db=litedata.getWritableDatabase(); //获取一个可读可写的数据库[/align]
[align=left] Cursor c=db.rawQuery( "select * from stutv", null );[/align]
[align=left] c.close();[/align]
[align=left] db.close();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]}[/align]
3>Content Provider
如何实现ContentProvider
1.继承抽象类contentprovide实现一系列针对于数据的增、删、改、查等方法。
2.需在AndroidMainfest.xml中完成对contentprovider的注册。
<provider
android:name="com.az.MusicProvider"
android:name="com.provider.music"
></provider>
注册的authorities属性值是全局唯一的。
[align=left] [/align]
[align=left]/**[/align]
[align=left] * URI 通用资源标识符个[/align]
[align=left] * content://packagename/music/#[/align]
[align=left] * UriMatcher类[/align]
[align=left] * Urimatcher matcher=new UriMarcher(UriMarcher.NO_MATCH);[/align]
[align=left] * UriMatcher.NO_MATCH 表示不匹配任何路径的返回值[/align]
[align=left] * marcher.addURI("com.az.provider","music",1);[/align]
[align=left] * 往UriMarcher类里添加一个拼凑的 Uri[/align]
[align=left] * UriMatcher为 Uri的容器,容器里面包含着我们即将可能要操作的 Uri[/align]
[align=left] * 如果通过match()方法匹配成功就返回code值[/align]
[align=left] * matcher.match(uri)[/align]
[align=left] * 首先与找通过addURI()方法添加进来的 Uri匹配。[/align]
[align=left] * 匹配成功则返回设置的code值,反之,返回一个UriMatcher.NO_MATCH 常量( -1)[/align]
[align=left] *[/align]
[align=left] * ContentResolver:[/align]
[align=left] * 使用contentResolver操作 contentprovider中的数据:[/align]
[align=left] * 当外部应用需要对 contentprovider中的数据进行添加、删除、修改和查询时[/align]
[align=left] * 可以使用contentResolver类来完成[/align]
[align=left] * 使用activity提供的getContentResover()方法获取ContentResover对象。[/align]
[align=left] * ContentResolver类提供了与contentProvider相同签名的四个方法[/align]
[align=left] * public Uri insert(Uri rui,ContentValues values)[/align]
[align=left] * 该方法用于往 contentprovider添加数据[/align]
[align=left] * public int delete(Uri uri,String selection,String[] selectionArgs)[/align]
[align=left] * 该方法用于从contentProvider删除数据[/align]
[align=left] * public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs)[/align]
[align=left] * 该方法用户更新 contentprovier中的数据[/align]
[align=left] * public Cursor query( Uri uri ,String[] projection,String selection,String[] selectionArgs,String sortOrder)[/align]
[align=left] * 该方法用于从contentProvider中获取数据[/align]
[align=left] * @author az[/align]
[align=left] *[/align]
[align=left] */[/align]
[align=left]public class MyContentProider extends ContentProvider{[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 根据URI删除selection指定的条件所匹配的全部记录[/align]
[align=left] */[/align]
[align=left] @Override[/align]
[align=left] public int delete(Uri uri, String selection, String[] selectionArgs) {[/align]
[align=left] // TODO Auto-generated method stub[/align]
[align=left] return 0;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 返回当前URI的MIME类型,[/align]
[align=left] * 如果该URI对应的数据可能包含多条记录,那么MIME类型字符串就是以vnd.android.dir/开头[/align]
[align=left] * 如果该URI对应的数据只包含一条记录,该MIME类型字符串就是以vnd.android.cursor。item/开头[/align]
[align=left] */[/align]
[align=left] @Override[/align]
[align=left] public String getType(Uri uri) {[/align]
[align=left] // TODO Auto-generated method stub[/align]
[align=left] return null ;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 根据URI插入的values对应的数据[/align]
[align=left] */[/align]
[align=left] @Override[/align]
[align=left] public Uri insert(Uri uri, ContentValues values) {[/align]
[align=left] // TODO Auto-generated method stub[/align]
[align=left] return null ;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 在 contentprovider创建后被调用[/align]
[align=left] */[/align]
[align=left] @Override[/align]
[align=left] public boolean onCreate() {[/align]
[align=left] // TODO Auto-generated method stub[/align]
[align=left] return false ;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 根据URI查询出selection指定的条件所匹配的全部记录,并且可以指定查询那些列,以什么方式排序
[/align]
[align=left] */[/align]
[align=left] @Override[/align]
[align=left] public Cursor query(Uri uri, String[] projection, String selection,[/align]
[align=left] String[] selectionArgs, String sortOrder) {[/align]
[align=left] // TODO Auto-generated method stub[/align]
[align=left] return null ;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 根据URI修改selection指定的条件所匹配的全部记录[/align]
[align=left] */[/align]
[align=left] @Override[/align]
[align=left] public int update(Uri uri, ContentValues values, String selection,[/align]
[align=left] String[] selectionArgs) {[/align]
[align=left] // TODO Auto-generated method stub[/align]
[align=left] return 0;[/align]
[align=left] }[/align]
[align=left]}[/align]
4>File
Android中文件存储的操作:
activity的openFileOutput()方法可以用于把数据输出到文件中
创建的文件保存在/data/data/<package name>/files目录
实现过程与在java中保存数据到文件中是一样的
[align=left] File file=this.getFilesDir(); //这个目录是当前应用程序默认的数据存储目录[/align]
[align=left] File file0= this.getCacheDir(); //这个目录是当前应用程序默认的缓存文件的存放位置 如果手机的内存不足时,系统会自动去删除APP的cache目录的数据[/align]
[align=left] File file2= this.getDir("" , MODE_PRIVATE); //自定义目录[/align]
[align=left] this.getExternalCacheDir();//外部缓存目录[/align]
[align=left] this.getExternalFilesDir(type); //外置目录[/align]
[align=left] [/align]
[align=left]写入文件[/align]
[align=left] FileOutputStream fileOutputStream=openFileOutput( name, mode ); //打开一个文件[/align]
[align=left] fileOutputStream.wait(); //写入[/align]
[align=left] fileOutputStream.close(); //关闭[/align]
[align=left] [/align]
[align=left]读取文件(以流的形式)[/align]
[align=left] FileInputStream fileInputStream=openFileInput( name);[/align]
[align=left] ByteArrayOutputStream byteArrayOutputStream= new ByteArrayOutputStream();[/align]
相关文章推荐
- Android BaseAdapter
- Android手机连接蓝牙打印机连接不上的问题
- Android开发读取assert下的txt文件
- Android studio 怎么设置Live Template
- 【Android】Spinner使用
- android中的栈,Task
- android的性能优化和应用体验改善
- Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面
- 利用gdb 调试android jni c动态库
- ImageView的属性android:scaleType
- Android_Studio常用插件
- Android学习笔记-junit测试
- Android中弹出对话框,AlertDialog关键代码
- Android中万能适配器
- 关于android中调用系统拍照,返回图片是旋转90度...
- android项目之间的相互引用出现的问题
- Android应用方法数查看,查看size是否超过65k
- Android View研究
- Android Android Studio 快捷键整理分享,IntelliJ IDEA使用技巧一览表
- Android事件处理机制研究