Android数据存储的5中方式总结:
A:使用SharedPreferences存储方式
B:文件存储数据
C:SQLite数据库存储数据
D:使用ContentProvider存储数据
E:网络存储数据
1.sharepreferences是Android平台的一个轻量级的存储类,只能保存少量数据,且这些数据的格式非常简单:字符串、基本类型的值。主要用于保存一些常用的配置:比如窗口状态,是否打开音乐、是否震动。解锁密码口令等等。
核心原理:保存基于XML文件存储的key-value键值对数据,通常用来存储一些简单地配置信息。它对象本身只能获取数据而不支持存储和修改,存储和修改是通过sharepreference.edit()获取内部接口editor对象实现。他本是一个接口,程序无法直接创建他的实例,只能通过context提供getsharepreference(String name,int mode)方法获取它name表示操作的xml文件名。第二个参数具体如下:
class ViewOcl implements View.OnClickListener{
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.btnSet:
//步骤1:获取输入值
String code = txtCode.getText().toString().trim();
//步骤2-1:创建一个SharedPreferences.Editor接口对象,lock表示要写入的XML文件名,MODE_WORLD_WRITEABLE写操作
SharedPreferences.Editor editor = getSharedPreferences("lock", MODE_WORLD_WRITEABLE).edit();
//步骤2-2:将获取过来的值放入文件
editor.putString("code", code);
//步骤3:提交
editor.commit();
Toast.makeText(getApplicationContext(), "口令设置成功", Toast.LENGTH_LONG).show();
break;
case R.id.btnGet:
//步骤1:创建一个SharedPreferences接口对象
SharedPreferences read = getSharedPreferences("lock", MODE_WORLD_READABLE);
//步骤2:获取文件中的值
String value = read.getString("code", "");
Toast.makeText(getApplicationContext(), "口令为:"+value, Toast.LENGTH_LONG).show();
break;
}}}}
2.文件存储数据
核心原理:Context提供了两个方法来打开数据文件里的文件IO流
FileInputStream openFileInput(String name);
FileOutputStream(String name , int mode),
这两个方法第一个参数用于指定文件名,第二个参数指定打开文件的模式。
具体有以下值可选:
MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可 以使用Context.MODE_APPEND
MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
除此之外,Context还提供了如下几个重要的方法:
getDir(String name , int mode):在应用程序的数据文件夹下获取或者创建name对应的子目录
File getFilesDir():获取该应用程序的数据文件夹得绝对路径
String[] fileList():返回该应用数据文件夹的全部文件 。
如果要对SD卡进行操作则:
读写sdcard上的文件
其中读写步骤按如下进行:
1、调用Environment的getExternalStorageState()方法判断手机上是否插了sd卡,且应用程序具有读写SD卡的权限,如下代码将返回true
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
2、调用Environment.getExternalStorageDirectory()方法来获取外部存储器,也就是SD卡的目录,或者使用"/mnt/sdcard/"目录
3、使用IO流操作SD卡上的文件
注意点:手机应该已插入SD卡,对于模拟器而言,可通过mksdcard命令来创建虚拟存储卡
必须在AndroidManifest.xml上配置读写SD卡的权限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
第三种:SQLite存储数据
SQLite是轻量级嵌入式数据库引擎,它支持sql语言,并且只利用很少的内存就有很好的性能。主流的移动设备都以它作为复杂数据的储存引擎。我们常用的方法不外乎添加,更新和删除,也就是常说的增删改查。
数据的添加
1.使用insert方法
1 ContentValues cv = new ContentValues();//实例化一个ContentValues用来装载待插入的数据 2 cv.put("title","you are beautiful");//添加title 3 cv.put("weather","sun"); //添加weather 4 cv.put("context","xxxx"); //添加context 5 String publish = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") 6 .format(new Date()); 7 cv.put("publish ",publish); //添加publish 8 db.insert("diary",null,cv);//执行插入操作
2.使用execsql方式实现
String sql = "insert into user(username,password) values ('jack Johnson','muisc' )"//插入语句
db.execSQL(sql);//执行sql语句
数据的删除
同样有2种方式可以实现
String whereClause = "username=?";//删除的条件 String[] whereArgs = {"Jack Johnson"};//删除的条件参数 db.delete("user",whereClause,whereArgs);//执行删除
使用execsql方式实现
String sql = "delete from user where username= 'jack Johnson' ";//删除操作
db.execSQL(sql);//执行删除操作
数据修改
仍是2种方式
ContentValues cv = new ContentValues();//实例化ContentValues cv.put("password","iHatePopMusic");//添加要更改的字段及内容 String whereClause = "username=?";//修改条件 String[] whereArgs = {"Jack Johnson"};//修改条件的参数 db.update("user",cv,whereClause,whereArgs);//执行修改
String sql = "update user set password = 'music' where name = 'jack johnson'";修改内容
db.execSQL(sql);//执行修改
数据查询
1 db.rawQuery(String sql, String[] selectionArgs); 2 db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy); 3 db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit); 4 db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);其中:
- table:表名称
- colums:表示要查询的列所有名称集
- selection:表示WHERE之后的条件语句,可以使用占位符
- selectionArgs:条件语句的参数数组
- groupBy:指定分组的列名
- having:指定分组条件,配合groupBy使用
- orderBy:y指定排序的列名
- limit:指定分页参数
- distinct:指定“true”或“false”表示要不要过滤重复值
- Cursor:返回值,相当于结果集ResultSet
最后,他们同时返回一个Cursor对象,代表数据集的游标,有点类似于JavaSE中的ResultSet。下面是Cursor对象的常用方法:
1 c.move(int offset); //以当前位置为参考,移动到指定行 2 c.moveToFirst(); //移动到第一行 3 c.moveToLast(); //移动到最后一行 4 c.moveToPosition(int position); //移动到指定行 5 c.moveToPrevious(); //移动到前一行 6 c.moveToNext(); //移动到下一行 7 c.isFirst(); //是否指向第一条 8 c.isLast(); //是否指向最后一条 9 c.isBeforeFirst(); //是否指向第一条之前 10 c.isAfterLast(); //是否指向最后一条之后 11 c.isNull(int columnIndex); //指定列是否为空(列基数为0) 12 c.isClosed(); //游标是否已关闭 13 c.getCount(); //总数据项数 14 c.getPosition(); //返回当前游标所指向的行数 15 c.getColumnIndex(String columnName);//返回某列名对应的列索引值 16 c.getString(int columnIndex); //返回当前行指定列的值
实现代码
String[] params = {12345,123456};
Cursor cursor = db.query("user",columns,"ID=?",params,null,null,null);//查询并获得游标 if(cursor.moveToFirst()){//判断游标是否为空 for(int i=0;i<cursor.getCount();i++){ cursor.move(i);//移动到指定记录 String username = cursor.getString(cursor.getColumnIndex("username"); String password = cursor.getString(cursor.getColumnIndex("password")); } }
通过rawQuery实现的带参数查询
Cursor result=db.rawQuery("SELECT ID, name, inventory FROM mytable"); //Cursor c = db.rawQuery("s name, inventory FROM mytable where ID=?",new Stirng[]{"123456"}); result.moveToFirst(); while (!result.isAfterLast()) { int id=result.getInt(0); String name=result.getString(1); int inventory=result.getInt(2); // do something useful with these result.moveToNext(); } result.close();
Content Provider为存储数据和获取数据提供了统一的接口,它可以完成在不同应用程序下的数据共享,而SQLite只能在同一个程序中共享数据。另外android为一些常见的数据,比如说音频,视频,图片,通讯录等提供了Content Provider,这样我们就可以很方便的对这些类型的数据操作了。
使用ContentProvider的好处是开发人员不需要考虑数据内部是怎么存储的,比如说如果我们想利用ContenProvider来存数据,只需告诉insert函数该ContentProvider的uri和想存入的数据(包括列名和数值),查询时也是一样,只需输入Uri和查询的表,列名和查询条件,至于ContentProvider里面是怎么进行这些操作的我们不需要知道。
5.网络存储数据
通过网络来获取和保存数据资源,前提是需要设备保持网络连接状态。例子通过URL获取文件的信息
- public class Activity01 extendsActivity
- {
- /** Called when the activity is first created. */
- @Override
- publicvoid onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- TextView tv =new TextView(this);
- String myString =null;
- try
- {
- /* 定义我们要访问的地址url */
- URL uri = new URL("http://192.168.1.110:8080/android.txt");
- /* 打开这个url连接 */
- URLConnection ucon = uri.openConnection();
- /* 从上面的链接中取得InputStream */
- InputStream is = ucon.getInputStream();
- BufferedInputStream bis = new BufferedInputStream(is);
- ByteArrayBuffer baf = new ByteArrayBuffer(100);
- int current = 0;
- /* 一直读到文件结束 */
- while ((current = bis.read()) != -1)
- {
- baf.append((byte) current);
- }
- myString = new String(baf.toByteArray());
- }
- catch (Exception e)
- {
- myString = e.getMessage();
- }
- /* 将信息设置到TextView */
- tv.setText(myString);
- /* 将TextView显示到屏幕上 */
- this.setContentView(tv);
- }
- }
- <uses-permission android:name="android.permission.INTERNET"/>