Android中,可供选择的存储方式有SharedPreferences、文件存储、SQLite数据库方式、内容提供器(Content provider)和网络。

一.SharedPreferences方式

Android提供用来存储一些简单的配置信息的一种机制,例如,一些默认欢迎语、登录的用户名和密码等。其以键值对的方式存储,使得我们可以很方便的读取和存入.

//保存数据
SharedPreferences settings = getSharedPreferences(SETTING_INFOS, 0); //首先获取一个SharedPreferences对象
settings.edit()
.putString(NAME, field_name.getText().toString())
.putString(PASSWORD, filed_pass.getText().toString())
.commit();
} //将用户名和密码保存进去
//取出数据
SharedPreferences settings = getSharedPreferences(SETTING_INFOS, 0); //获取一个SharedPreferences对象
String name = settings.getString(NAME, ""); //取出保存的NAME
String password = settings.getString(PASSWORD, ""); //取出保存的PASSWORD

SharedPreferences是以XML的格式以文件的方式自动保存的,在DDMS中的File Explorer中展开到/data/data/<packagename>/shared_prefs下。

    二.文件存储方式

在Android中,其提供了openFileInput 和 openFileOuput 方法读取设备上的文件: 
             String FILE_NAME = "tempfile.tmp";  //要操作文件的文件名

//创建文件读写流,后面进行读写操作
             FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_APPEND); 
             FileInputStream fis = openFileInput(FILE_NAME);

上述两方法只支持读取该应用目录下的文件,读取非其自身目录下的文件将会抛出异常。

    三.SQLite数据库方式

SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。

使用SQLite时,主要有两步:

1:继承SQLiteOpenHelper,创建一个SQLiteOpenHelper子类,并重写其onCreate()、onUpgrade()、onOpen()方法,在其构造函数中创建数据库并控制版本,在onCreate()生成一个数据库表。

2:在外部java代码中,通过

mOpenHelper = new DatabaseHelper(this);
SQLiteDatabase db = mOpenHelper.getWritableDatabase(); //当在程序通过mOpenHelper.getWritableDatabase()或者mOpenHelper.getReadableDatabase()方法的时候,如果当时没有数据库,那么Android系统就会自动生成一个数据库,如果有,则返回这个数据库实例。

获取到一个SQLiteDatabase实例,然后通过该实例来调用sqlite数据库的增删查改操作。

db.execSQL(sql);  //参数为sql操作语句
/*
* 什么是SQLiteDatabase?
* 一个SQLiteDatabase的实例代表了一个SQLite的数据库,通过SQLiteDatabase实例来执行SQL语句,对数据库进行增、删、查、改的操作。
*/ /*
* 什么是SQLiteOpenHelper ?
* 这个类主要生成一个数据库,并对数据库的版本进行管理。
* 当在程序当中调用这个类的方法getWritableDatabase()或者getReadableDatabase()方法的时候,如果当时没有数据库,那么Android系统就会自动生成一个数据库,如果有,则返回这个数据库实例。
* SQLiteOpenHelper 是一个抽象类,我们通常需要继承它,并且实现里边的3个函数,
* onCreate(SQLiteDatabase):在数据库第一次生成的时候会调用这个方法,一般我们在这个方法里边生成数据库表。
* onUpgrade(SQLiteDatabase, int, int):当数据库需要升级的时候,Android系统会主动的调用这个方法。一般我们在这个方法里边删除数据表,并建立新的数据表,当然是否还需要做其他的操作,完全取决于应用的需求。
* onOpen(SQLiteDatabase):这是当打开数据库时的回调函数,一般也不会用到。
*/

    四.内容提供器(Content provider)方式

1.什么是ContentProvider

一个Content Provider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。也就是说,一个程序可以通过实现一个Content Provider的抽象接口将自己的数据暴露出去。
      下边列举一些较常见的接口:
      query(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder):通过Uri进行查询,返回一个Cursor。 
      insert(Uri url, ContentValues values):将一组数据插入到Uri 指定的地方。 
      update(Uri uri, ContentValues values, String where, String[] selectionArgs):更新Uri指定位置的数据。 
      delete(Uri url, String where, String[] selectionArgs):删除指定Uri并且符合一定条件的数据。

2.什么是ContentResolver 
      外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activity当中通过getContentResolver()可以得到当前应用的ContentResolver实例。
      ContentResolver提供的接口和ContentProvider中需要实现的接口对应,主要有以下几个。 
      query(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder):通过Uri进行查询,返回一个Cursor。
      insert(Uri url, ContentValues values):将一组数据插入到Uri 指定的地方。
      update(Uri uri, ContentValues values, String where, String[] selectionArgs):更新Uri指定位置的数据。
      delete(Uri url, String where, String[] selectionArgs):删除指定Uri并且符合一定条件的数据。

      3.ContentProvider和ContentResolver中用到的Uri【Uri就是用来定位需要操作的数据的】 
      在ContentProvider和ContentResolver当中用到了Uri的形式通常有两种,一种是指定全部数据,另一种是指定某个ID的数据。
     我们看下面的例子。 
          content://contacts/people/  这个Uri指定的就是全部的联系人数据。
          content://contacts/people/1 这个Uri指定的是ID为1的联系人的数据。

在上边两个类中用到的Uri一般由两部分组成:一个是需要操作的ContentProvider,另一个就是对ContentProvider中的什么数据进行操作。
        scheme:content://表示,这个是android定义好的,不能改变的

主机名或者authority:contacts,唯一的,一般指的是包名。

路径:people,表示的是people这个表

ID:1,表示取表中的第几条记录,若不指定则取表中所有记录

由于URI通常比较长,而且有时候容易出错,且难以理解。所以,在Android当中定义了一些辅助类,并且定义了一些常量来代替这些长字符串的使用,例如下边的代码: Contacts.People.CONTENT_URI (联系人的URI)。

五. 网络存储方式

网络存储方式其实就是网络操作,把数据保存在服务器上,再android端通过网络请求来进行数据的交互传输。

具体操作后面再记录。

Android学习笔记七:五大存储的更多相关文章

  1. Android 学习笔记之数据存储SharePreferenced+File

    学习内容: Android的数据存储.... 1.使用SharedPreferences来保存和读取数据... 2.使用File中的I/O来完成对数据的存储和读取...   一个应用程序,经常需要与用 ...

  2. android学习笔记46——File存储

    File存储--IO操作文件 openFileOutput.openFileInput Context提供了如下两个方法来打开本应用程序的数据文件夹里面的文件IO流. 1.FileInputStrea ...

  3. MySQL学习笔记七:存储引擎

    1.MySQL存储引擎的设计采用“插件式”方案,用户可以很方便地选择使用哪种存储引擎,想使用mysql没有提供的引擎时,可以自己安装进去. 查看支持的存储引擎 mysql> show engin ...

  4. android学习笔记七——控件(DatePicker、TimePicker、ProgressBar)

    DatePicker.TimePicker ==> DatePicker,用于选择日期 TimePicker,用于选择时间 两者均派生与FrameLayout,两者在FrameLayout的基础 ...

  5. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

  6. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

  7. 【转】 Pro Android学习笔记(七八):服务(3):远程服务:AIDL文件

    目录(?)[-] 在AIDL中定义服务接口 根据AIDL文件自动生成接口代码 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.n ...

  8. 【转】 Pro Android学习笔记(七六):服务(1):local和remote

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ Android提供服务,服务是运行在后台的 ...

  9. 【转】 Pro Android学习笔记(七四):HTTP服务(8):使用后台线程AsyncTask

    目录(?)[-] 5秒超时异常 AsyncTask 实现AsyncTask抽象类 对AsyncTask的调用 在哪里运行 其他重要method 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注 ...

随机推荐

  1. 用开源项目RangBar来实现有范围的SeekBar

    RangeBar是一个可以有选择范围的Seekbar,用这个项目其实是很简单的.就是一个自定义控件~ 一.布局文件 这里可以看到有很多属性可以定制,除了通过xml来定义也可以再java代码中进行定义. ...

  2. 自定义的圆形ProgressBar

        之前已经详细讲解过自定义控件的使用方式了.这里我单独把定以好的控件列出来. 之前定义的各式各样的ProgressBar http://www.cnblogs.com/tianzhijiexia ...

  3. <A>标签锚标记

    链接到本页面 – 锚记标签用于使用户“跳”到文档的某个部分 – HTML 的NAME 属性用于创建锚标记 <A NAME = “marker”>主题名称</A> – 为达到这种 ...

  4. Windows Power Shell简介

    Windows PowerShell 是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能. 它引入了许多非常有用的新概念,从而进一步扩展了您在 W ...

  5. Android Studio导入项目的中文注释乱码解决方法

           在Android studio中,导入Android的项目后,容易出现项目文件的中文乱码,中文无法正常显示,变成了一些格子问号之类的,导致无法查看中文的注释,下面来看看导入项目和解决乱码 ...

  6. OC-字符串中大小写字母转换

    一般语言中的大小写转换都会提供的有默认的函数,不过闲来无事,简单的模仿实现了一下: 系统中默认的大小写转换: NSString *name=@"博客园-FlyElephant"; ...

  7. python对json的操作总结 zz

    Json简介:Json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式.Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式.现在也常用于h ...

  8. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十八):kafka0.10.1 内置性能测试API用法示例

    消费者测试: ./kafka-consumer-perf-test..com.cn:,vm10..com.cn:,vm10..com.cn: --group test-teg1 --messages ...

  9. 可以在任何时候attach一个shader到program对象

      可以在任何时候attach一个shader到program对象,不一定非要在指定source和编译以后,具体的描述如下: Once you have a program object create ...

  10. 轻松解决vuejs跨域

    Vuejs跨域问题实战 有时候,本地使用webpack开启一个node的dev端口,项目中使用vuejs去访问别人家的api,比如豆瓣或者其他的api,不使用jsonp肯定就会报跨域的问题. 如何让我 ...