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. setContentView(R.layout.main);
  9. TextView tv =new TextView(this);
  10. String myString =null;
  11. try
  12. {
  13. /* 定义我们要访问的地址url */
  14. URL uri = new URL("http://192.168.1.110:8080/android.txt");
  15. /* 打开这个url连接 */
  16. URLConnection ucon = uri.openConnection();
  17. /* 从上面的链接中取得InputStream */
  18. InputStream is = ucon.getInputStream();
  19. BufferedInputStream bis = new BufferedInputStream(is);
  20. ByteArrayBuffer baf = new ByteArrayBuffer(100);
  21. int current = 0;
  22. /* 一直读到文件结束 */
  23. while ((current = bis.read()) != -1)
  24. {
  25. baf.append((byte) current);
  26. }
  27. myString = new String(baf.toByteArray());
  28. }
  29. catch (Exception e)
  30. {
  31. myString = e.getMessage();
  32. }
  33. /* 将信息设置到TextView */
  34. tv.setText(myString);
  35. /* 将TextView显示到屏幕上 */
  36. this.setContentView(tv);
  37. }
  38. }

用到网络的时候我们需要在xml里面加入权限


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

Android中的数据存储方式相关推荐

  1. Android中的数据存储

    Android中的数据存储 1.SharedPreference存储(共享参数) 1.1.使用SharedPreferences存储和读取数据的步骤 存储数据 保存数据一般分为四个步骤: 使用Acti ...

  2. android 存储方式简书,Android的多种数据存储方式

    1. 简介 作为一个完整的应用程序,数据存储操作是必不可少的.现在Android的离线缓存就是通过网络良好状态时将从服务器收到的数据保存到本地.Android系统中主要提供了3种方式进行数据存储,分别 ...

  3. [ Android 五种数据存储方式之一 ] —— SharedPreferences存储数据

    SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数. 主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstanceS ...

  4. [ Android 五种数据存储方式之二 ] —— 文件存储数据

    关于文件存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的. 文件可用来存放大量数据,如文本.图片.音 ...

  5. 消失的字符串——c语言函数中的数据存储方式以及字符串实现

    2019独角兽企业重金招聘Python工程师标准>>> 事情是这样的,最近在学习翁老师的Mooc之C语言程序设计,插一句,真的是好老师,讲的真的太好了,在c里的字符串这里,翁老师演示 ...

  6. C语言中的数据存储方式

    这篇文章主要是关于C语言中整形.字符型的变量是如何存储整形数字.是如何.何时发生整形提升,以及还有打印方式的不同打印的数字也不同的知识补充. int与unsigned int: int是在内存中是4个 ...

  7. java存储数据_Java中六种数据存储方式

    存储数据 1.寄存器(register).这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配.你不能直接控制,也不能在程序中 ...

  8. Android笔记(四十七) Android中的数据存储——XML(三)SAX解析

    SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SA ...

  9. 1._请写出5种以上的android中界面常用布局方式,跳槽季“充电宝”Android面试题(一)...

    1.请介绍下Android中常用的5种布局 Android中常用的5种布局分别为:FrameLaout(框架布局).LinearLayout(线性布局).AbsoluteLayout(绝对布局).Re ...

最新文章

  1. android---am命令
  2. Yaas上传附件的技术实现
  3. hive mysql5.7_安装并使用mysql5.7作为hive的metastore
  4. 面对1.3 亿用户数据泄露,企业如何围绕核心数据构建安全管理体系?
  5. android自动播放mp3,audio标签移动端(微信)实现自动播放
  6. JZOJ 6290. 倾斜的线
  7. 求n的阶乘java_Java 求n的阶乘
  8. 奇门遁甲鸣法 第五章 辅格
  9. Java基本类型占用字节数(或 bit数)
  10. jq禁用html标签
  11. 汇编程序编译连接过程
  12. win7误删文件怎么恢复?
  13. Linux在线词典问题,linux中goldendict发声词典播放报错问题解决方案
  14. mysql数据库select语句用法_mysql数据库select查询语句简单用法
  15. 快速学习-RocketMQ-“Request-Reply”特性
  16. 读书笔记013:《伤寒论》- 足少阳胆经
  17. 记录调整CentOS的分区大小
  18. windows下ipython notebook搭建、安装常见问题及Python模块安装
  19. 循环practice
  20. 【C++】STL(标准模板库)简介

热门文章

  1. Maven本地库在哪?
  2. 学习率对神经网络的影响-乙烷,乙烯,乙炔的分子模型试验数据对比
  3. java 正则表达式 demo_JAVA正则表达式语法
  4. python 股票指标库talib_股票指标库 TA-Lib 安装方法
  5. 【控制】遗传算法(GA,Genetic Algorithm)及 Matlab 实现 代码详细版
  6. 【Matlab】求解积分方程的数值解
  7. 【控制】《复杂运动体系统的分布式协同控制与优化》-方浩老师-第10章-基于模型预测控制的人机协同控制
  8. STM32 进阶教程 8 - 位带操作
  9. modelsim的工程仿真流程--2
  10. Android开机画面~(自己还没试验)