Android系统中,应用数据基本都是私有的,存放于“data/data/程序包名”目录下
实现应用间数据共享,使用Content Provider
如果删除应用时选择清除数据 相关文件将被删除
1.SQLite: SQLite是一个轻量级的数据库,支持基本SQL语法,Android提供了一个SQLiteDatabase的类。
2.SharedPreference: 除SQLite数据库外,另一种常用的数据存储方式,其本质就是一个xml文件。
3.File: 即常说的文件(I/O)存储方法,常用语存储大数量的数据,但是缺点是更新数据将是一件困难的事情。
4.ContentProvider: Android系统中能实现所有应用程序共享的一种数据存储方式,由于数据通常在各应用间的是互相私密的,所以此存储方式较少使用,但是其又是必不可少的一种存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储。每个Content Provider都会对外提供一个公共的URI(包装成Uri对象),如果应用程序有数据需要共享时,就需要使用Content Provider为这些数据定义一个URI,然后其他的应用程序就通过Content Provider传入这个URI来对数据进行操作。
sqlite
创建表
方法1:db.openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory) ;//这是SQLiteDatabase类实现的;
方法2:新建DBOpenHelper继承自SQLiteOpenHelper,先定义表名称,创建表放在onCreate里 比如
db.execSQL("CREATE TABLE IF NOT EXISTS "+表名称+"("+字段1+"TEXT,"+字段2+"TEXT,".......");");//这是用sql语句实现的
之后增删改查之前先进行初始化 比如:
SQLiteDatabase db = DBOpenHelper.getInstance(context).getWritableDatabase();
插入
db.execSQL("insert into "+表名称+"("+字段1+"TEXT,"+字段2+"TEXT,".......")"+"values(?,?,?) ",new String[]{值1,值2,值3});
或者
db.insert(表名称, "字段名", 值);//同样是两种方法 不同场景灵活使用
查询
Cursor cursor = db.execSQL("select * from"+表名称+"order by"+需查询字段+"desc",new String[]{});
if(cursor != null){
list = new ArrayList<Test>();//new一个list用来塞值
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
Test item = new Test();//new一个Test表对象用来塞值
item.setRowId(cursor.getString(cursor.getColumnIndexOrThrow(字段名1)));
item.setRowId(cursor.getString(cursor.getColumnIndexOrThrow(字段名2)));
list.add(item);
cursor.moveToNext();
}
cursor.close();
}
删除字段
db.delete(表名,字段名1,String数组)
表对象及其字段定义放在公共类里 实现BaseColumns 字段名称同上
SharedPreference
一般通过SharedPreferences和Editor组合来实现
存储数据类型:boolean,int,float,long和String
存储目录在/data/data/<包名>/shared_prefs下 为XML文件
插入值
editor.putString(字段1,值1);
获取值
editor.getString(字段1,值1);
一般定义在项目的公共类里,在项目建立之初就考虑好
ContentProvider
通过Uri实现数据操作的方式。其步骤为:
1. 在当前应用中定义一个类继承自ContentProvider。
2. 在当前应用AndroidManifest.xml中注册此ContentProvider
3. 其他应用程序通过ContentResolver和Uri来获取此ContentProvider的数据。
URI格式由scheme/authority/path三部分构成 示例
content://me.abitno.vplayer.mediaprovider/media_scanner URI中经常用到MIME 这是android内部用来定义特定扩展名的数据类型 在intent时用到
ContentResolver经常和sqlite结合使用
同样通过insert(), delete(), query()和update()方法进行数据操作
file文件存储
无法更新数据 之前项目里用户名密码保存 应用更新后无法将保存的文件记录保留下来