您的位置:首页 > 移动开发 > Android开发

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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: