Android中的数据存储方式

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);//执行修改
使用execSQL方式的实现

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();
4.content provider存储方式

 Content Provider为存储数据和获取数据提供了统一的接口,它可以完成在不同应用程序下的数据共享,而SQLite只能在同一个程序中共享数据。另外android为一些常见的数据,比如说音频,视频,图片,通讯录等提供了Content Provider,这样我们就可以很方便的对这些类型的数据操作了。

      使用ContentProvider的好处是开发人员不需要考虑数据内部是怎么存储的,比如说如果我们想利用ContenProvider来存数据,只需告诉insert函数该ContentProvider的uri和想存入的数据(包括列名和数值),查询时也是一样,只需输入Uri和查询的表,列名和查询条件,至于ContentProvider里面是怎么进行这些操作的我们不需要知道。


5.网络存储数据

通过网络来获取和保存数据资源,前提是需要设备保持网络连接状态。例子通过URL获取文件的信息

  1. public class Activity01 extendsActivity  
  2. {  
  3.     /** Called when the activity is first created. */  
  4.     @Override  
  5.     publicvoid onCreate(Bundle savedInstanceState)  
  6.     {  
  7.         super.onCreate(savedInstanceState);  
  8.            
  9.         setContentView(R.layout.main);  
  10.    
  11.         TextView tv =new TextView(this);  
  12.            
  13.         String myString =null;  
  14.            
  15.         try  
  16.         {  
  17.             /* 定义我们要访问的地址url */  
  18.             URL uri = new URL("http://192.168.1.110:8080/android.txt");  
  19.                
  20.             /* 打开这个url连接 */  
  21.             URLConnection ucon = uri.openConnection();  
  22.                
  23.             /* 从上面的链接中取得InputStream */  
  24.             InputStream is = ucon.getInputStream();  
  25.                
  26.             BufferedInputStream bis = new BufferedInputStream(is);  
  27.             ByteArrayBuffer baf = new ByteArrayBuffer(100);  
  28.             int current = 0;  
  29.             /* 一直读到文件结束 */  
  30.             while ((current = bis.read()) != -1)  
  31.             {  
  32.                 baf.append((byte) current);  
  33.             }  
  34.             myString = new String(baf.toByteArray());  
  35.         }  
  36.         catch (Exception e)  
  37.         {  
  38.    
  39.             myString = e.getMessage();  
  40.         }  
  41.         /* 将信息设置到TextView */  
  42.         tv.setText(myString);  
  43.            
  44.         /* 将TextView显示到屏幕上 */  
  45.         this.setContentView(tv);  
  46.    
  47.     }  
  48. }  
用到网络的时候我们需要在xml里面加入权限


  1. <uses-permission android:name="android.permission.INTERNET"/>  










  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值