1>SharedPreferences
轻型的数据存储方式,本质是基于XML文件存储Key-value键值对数据。通常用来存储一些简单的配置信息。
1> SharedPreferences对象本身只能获取数据而不支持存储和修改数据。存储修改是通过Editor对象实现。
2> 实现SharedPreferences存储的步骤如下:
(1)。获得SharedPreferences对象。
(2)。获得SharedPreferences.Editor对象。
(3)。通过Editor接口的PutXxx方法保存Key-value对其中Xxx表示不同的数据类型。
//由系统指定SharedPreferences文件
//SharedPreferences preferences=PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
//自己指定SharedPreferences文件的名字以及权限。
SharedPreferences preferences=getSharedPreferences("SharedPreferences" , MODE_PRIVATE);
Editor editor=preferences.edit();
editor.putString( "key", "value" );
editor.commit();
editor.remove( "key");
editor.commit();
//取消息
preferences.getString("key", "");
preferences.getInt( "age", 0);
2>SQLite
SQLite支持的数据类型:NULLINTEGERTEXTBLOB。
动态数据类型(弱引用):当某个值插入到数据库是,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类型值
//创建数据库
SQLiteDatabase db=openOrCreateDatabase( "SQLite.db", MODE_PRIVATE , null);
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 )");
db.execSQL( "insert into usertb(name,sex,age) values('az','man','19')");
Cursor c=db.rawQuery( "select * from usertb", null );
if(c!=null ){
while(c.moveToNext()){
c.getInt(c.getColumnIndexOrThrow( "_id"));
}
c.close(); //释放游标
}
db.close(); //释放数据库对象
ContentValues
这个类是用来存储一组可以被ContextResolver处理的值。
ContentValues values=new ContentValues(); //类似hashMap key value 的形式
values.put("name","zhangsan");
//创建数据库
SQLiteDatabase db=openOrCreateDatabase( "SQLite.db", MODE_PRIVATE , null);
db.execSQL( "create table if not exists stutb (_id integer primary key autoincrement)");
ContentValues values= new ContentValues();
values.put( "name", "张三" );
long rowid=db.insert( TABLE_NAME, null , values); //返回插入的行数
values.clear(); //清空values
values.put( "name", "张三" );
db.insert( TABLE_NAME, null , values);
values.clear();
values.put( "name", "李四" );
db.update( TABLE_NAME, values, "_id>?" , new String[]{"3"}); //将所有ID大于三的name该成李四
db.delete( TABLE_NAME, "name like ?" , new String[]{"%四%"}); //删除所有name中带有“四”的人
Cursor c=db.query( TABLE_NAME,null , "name like ?" , new String[]{"0"}, null, null , "name" );
if(c!=null ){
String[] column=c.getColumnNames();
while (c.moveToNext()) {
}
c.close();
}
db.close();
}
SQLiteOpenHelper:
SQLiteDatabase的帮助类,用于管理数据库的创建和版本更新
一般是建立一个类继承它,并重新onCreate()和onUpgrade()方法
onCreate(SQLiteDatabase db); 创建数据库时调用
onUpgrade(SQLiteDatabase db,int oldVersion,int new Version); 版本更新是调用
getReadableDatabase(); //创建或打开一个只读数据库
getWritableDatabase(); //创建或打开一个读写数据库
public class SQLitedata extends SQLiteOpenHelper{
public SQLitedata(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
/**
* 首次创建数据库时调用,一般可以把建库、建表的操作
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL( "create table if not exists stutb(_id integer primary key autoincrement)");
}
/**
* 当数据库版本发生变化时会自动执行
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
public class MainActivity extends Activity {
public static final String TABLE_NAME= "stutb";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. activity_main);
SQLitedata litedata= new SQLitedata(MainActivity.this,"stu.db", null, 0);
litedata.getReadableDatabase(); //获取一个只读的数据库
SQLiteDatabase db=litedata.getWritableDatabase(); //获取一个可读可写的数据库
Cursor c=db.rawQuery( "select * from stutv", null );
c.close();
db.close();
}
}
3>Content Provider
如何实现ContentProvider
1.继承抽象类contentprovide实现一系列针对于数据的增、删、改、查等方法。
2.需在AndroidMainfest.xml中完成对contentprovider的注册。
<provider
android:name="com.az.MusicProvider"
android:name="com.provider.music"
></provider>
注册的authorities属性值是全局唯一的。
/**
* URI 通用资源标识符个
* content://packagename/music/#
* UriMatcher类
* Urimatcher matcher=new UriMarcher(UriMarcher.NO_MATCH);
* UriMatcher.NO_MATCH 表示不匹配任何路径的返回值
* marcher.addURI("com.az.provider","music",1);
* 往UriMarcher类里添加一个拼凑的 Uri
* UriMatcher为 Uri的容器,容器里面包含着我们即将可能要操作的 Uri
* 如果通过match()方法匹配成功就返回code值
* matcher.match(uri)
* 首先与找通过addURI()方法添加进来的 Uri匹配。
* 匹配成功则返回设置的code值,反之,返回一个UriMatcher.NO_MATCH 常量( -1)
*
* ContentResolver:
* 使用contentResolver操作 contentprovider中的数据:
* 当外部应用需要对 contentprovider中的数据进行添加、删除、修改和查询时
* 可以使用contentResolver类来完成
* 使用activity提供的getContentResover()方法获取ContentResover对象。
* ContentResolver类提供了与contentProvider相同签名的四个方法
* public Uri insert(Uri rui,ContentValues values)
* 该方法用于往 contentprovider添加数据
* public int delete(Uri uri,String selection,String[] selectionArgs)
* 该方法用于从contentProvider删除数据
* public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs)
* 该方法用户更新 contentprovier中的数据
* public Cursor query( Uri uri ,String[] projection,String selection,String[] selectionArgs,String sortOrder)
* 该方法用于从contentProvider中获取数据
* @author az
*
*/
public class MyContentProider extends ContentProvider{
/**
* 根据URI删除selection指定的条件所匹配的全部记录
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
/**
* 返回当前URI的MIME类型,
* 如果该URI对应的数据可能包含多条记录,那么MIME类型字符串就是以vnd.android.dir/开头
* 如果该URI对应的数据只包含一条记录,该MIME类型字符串就是以vnd.android.cursor。item/开头
*/
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null ;
}
/**
* 根据URI插入的values对应的数据
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
return null ;
}
/**
* 在 contentprovider创建后被调用
*/
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
return false ;
}
/**
* 根据URI查询出selection指定的条件所匹配的全部记录,并且可以指定查询那些列,以什么方式排序
*/
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
return null ;
}
/**
* 根据URI修改selection指定的条件所匹配的全部记录
*/
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
}
4>File
Android中文件存储的操作:
activity的openFileOutput()方法可以用于把数据输出到文件中
创建的文件保存在/data/data/<package name>/files目录
实现过程与在java中保存数据到文件中是一样的
File file=this.getFilesDir(); //这个目录是当前应用程序默认的数据存储目录
File file0= this.getCacheDir(); //这个目录是当前应用程序默认的缓存文件的存放位置 如果手机的内存不足时,系统会自动去删除APP的cache目录的数据
File file2= this.getDir("" , MODE_PRIVATE); //自定义目录
this.getExternalCacheDir();//外部缓存目录
this.getExternalFilesDir(type); //外置目录
写入文件
FileOutputStream fileOutputStream=openFileOutput( name, mode ); //打开一个文件
fileOutputStream.wait(); //写入
fileOutputStream.close(); //关闭
读取文件(以流的形式)
FileInputStream fileInputStream=openFileInput( name);
ByteArrayOutputStream byteArrayOutputStream= new ByteArrayOutputStream();