Android应用开发中,给咱们提供了5种数据的存储方式1 使用SharedPreferences存储数据2 文件存储数据3 SQLite数据库存储数据4 使用ContentProvider存储数据5 网络存储数据不一样的业务逻辑,或者需求,用不一样的实现方式如下是这几中数据存储方式的说明用及法,第一种: 使用SharedPreferences存储数据SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些经常使用的配置好比窗口状态,通常在Activity中 重载窗口状态onSaveInstanceState保存通常使用SharedPreferences完成,它提供了Android平台常规的Long长 整形、Int整形、String字符串型的保存。 它是什么样的处理方式呢? SharedPreferences相似过去Windows系统上的ini配置文件,可是它分为多种权限,能够全局共享访问,android123提示最终是以xml方式来保存,总体效率来看不是特别的高,对于常规的轻量级而言比SQLite要好很多,若是真的存储量不大能够考虑本身定义文件格式。xml 处理时Dalvik会经过自带底层的本地XML Parser解析,好比XMLpull方式,这样对于内存资源占用比较好。 它的本质是基于XML文件存储key-value键值对数据,一般用来存储一些简单的配置信息。其存储位置在/data/data/< >/shared_prefs目录下。SharedPreferences对象自己只能获取数据而不支持存储和修改,存储修改是经过Editor对象实现。 实现SharedPreferences存储的步骤以下:1、根据Context获取SharedPreferences对象2、利用edit()方法获取Editor对象。3、经过Editor对象存储key-value键值对数据。4、经过commit()方法提交数据。 下面是示例代码: public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //获取SharedPreferences对象 Context ctx = MainActivity.this; SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE); //存入数据 Editor editor = sp.edit(); editor.putString("STRING_KEY", "string"); editor.putInt("INT_KEY", 0); editor.putBoolean("BOOLEAN_KEY", true); editor.commit(); //返回STRING_KEY的值 Log.d("SP", sp.getString("STRING_KEY", "none")); //若是NOT_EXIST不存在,则返回值为"none" Log.d("SP", sp.getString("NOT_EXIST", "none")); } } 这段代码执行事后,即在/data/data/com.test/shared_prefs目录下生成了一个SP.xml文件,一个应用能够建立多个这样的xml文件。 SharedPreferences对象与SQLite数据库相比,免去了建立数据库,建立表,写SQL语句等诸多操做,相对而言更加方便,简洁。可是SharedPreferences也有其自身缺陷,好比其职能存储boolean,int,float,long和String五种简单的数据类型,好比其没法进行条件查询等。因此不论SharedPreferences的数据存储操做是如何简单,它也只能是存储方式的一种补充,而没法彻底替代如SQLite数据库这样的其余数据存储方式。第二种: 文件存储数据关于文件存储,Activity提供了openFileOutput()方法能够用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是同样的。文件可用来存放大量数据,如文本、图片、音频等。默认位置:/data/data/< >/files/***.***。 代码示例: public void save(){ try { FileOutputStream outStream=this.openFileOutput("a.txt",Context.MODE_WORLD_READABLE); outStream.write(text.getText().toString().getBytes()); outStream.close(); Toast.makeText(MyActivity.this,"Saved",Toast.LENGTH_LONG).show(); } catch (FileNotFoundException e) { return; } catch (IOException e){ return ; } } openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,若是文件不存在,Android 会自动建立它。建立的文件保存在/data/data//files目录,如: /data/data/cn.itcast.action/files/itcast.txt ,经过点击Eclipse菜单“Window”-“Show View”-“Other”,在对话窗口中展开android文件夹,选择下面的File Explorer视图,而后在File Explorer视图中展开/data/data//files目录就能够看到该文件。 openFileOutput()方法的第二参数用于指定操做模式,有四种模式,分别为:Context.MODE_PRIVATE = 0Context.MODE_APPEND = 32768Context.MODE_WORLD_READABLE = 1Context.MODE_WORLD_WRITEABLE = 2Context.MODE_PRIVATE:为默认操做模式,表明该文件是私有数据,只能被应用自己访问,在该模式下,写入的内容会覆盖原文件的内容,若是想把新写入的内容追加到原文件中。可使用Context.MODE_APPENDContext.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,不然就建立新文件。Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其余应用是否有权限读写该文件。MODE_WORLD_READABLE:表示当前文件能够被其余应用读取;MODE_WORLD_WRITEABLE:表示当前文件能够被其余应用写入。 若是但愿文件被其余应用读和写,能够传入: openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE); android有一套本身的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其余资源好比文件的时候,就须要userid匹配。默认状况下,任何应用建立的文件,sharedpreferences,数据库都应该是私有的(位于/data/data//files),其余程序没法访问。除非在建立时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有这样其余程序才能正确访问。 读取文件示例: public void load(){ try { FileInputStream inStream=this.openFileInput("a.txt"); ByteArrayOutputStream stream=new ByteArrayOutputStream(); byte[] buffer=new byte[1024]; int length=-1; while((length=inStream.read(buffer))!=-1) { stream.write(buffer,0,length); } stream.close(); inStream.close(); text.setText(stream.toString()); Toast.makeText(MyActivity.this,"Loaded",Toast.LENGTH_LONG).show(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e){ return ; } } 对于私有文件只能被建立该文件的应用访问,若是但愿文件能被其余应用读和写,能够在建立文件时,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。 Activity还提供了getCacheDir()和getFilesDir()方法: getCacheDir()方法用于获取/data/data//cache目录 getFilesDir()方法用于获取/data/data//files目录。 把文件存入SDCard:使用Activity的openFileOutput()方法保存文件,文件是存放在手机空间上,通常手机的存储空间不是很大,存放些小文件还行,若是要存放像视频这样的大文件,是不可行的。对于像视频这样的大文件,咱们能够把它存放在SDCard。SDCard是干什么的?你能够把它看做是移动硬盘或U盘。 在模拟器中使用SDCard,你须要先建立一张SDCard卡(固然不是真的SDCard,只是镜像文件)。 建立SDCard能够在Eclipse建立模拟器时随同建立,也可使用DOS命令进行建立,以下: 在Dos窗口中进入android SDK安装路径的tools目录,输入如下命令建立一张容量为2G的SDCard,文件后缀能够随便取,建议使用.img: mksdcard 2048M D:\AndroidTool\sdcard.img 在程序中访问SDCard,你须要申请访问SDCard的权限。 在AndroidManifest.xml中加入访问SDCard的权限以下:<!-- 在SDCard中建立与删除文件权限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!-- 往SDCard写入数据权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 要往SDCard存放文件,程序必须先判断手机是否装有SDCard,而且能够进行读写。注意:访问SDCard必须在AndroidManifest.xml中加入访问SDCard的权限。 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录 File saveFile = new File(sdCardDir, “a.txt”); FileOutputStream outStream = new FileOutputStream(saveFile); outStream.write("test".getBytes()); outStream.close(); } Environment.getExternalStorageState()方法用于获取SDCard的状态,若是手机装有SDCard,而且能够进行读写,那么方法返回的状态等于Environment.MEDIA_MOUNTED。 Environment.getExternalStorageDirectory()方法用于获取SDCard的目录,固然要获取SDCard的目录,你也能够这样写: File sdCardDir = new File("/sdcard"); //获取SDCard目录 File saveFile = new File(sdCardDir, "itcast.txt"); //上面两句代码能够合成一句: File saveFile = new File("/sdcard/a.txt"); FileOutputStream outStream = new FileOutputStream(saveFile); outStream.write("test".getBytes()); outStream.close();第三种: SQLite数据库存储数据 SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,而且只利用不多的内存就有很好的性能。此外它仍是开源的,任何人均可以使用它。许多开源项目((Mozilla, PHP, Python)都使用了 SQLiteSQLite 由如下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 经过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。 特色: 面向资源有限的设备, 没有服务器进程, 全部数据存放在同一文件中跨平台, 可自由复制。 SQLite 基本上符合 SQL-92 标准,和其余的主要 SQL 数据库没什么区别。它的优势就是高效,Android 运行时环境包含了完整的 SQLite。 SQLite 和其余数据库最大的不一样就是对数据类型的支持,建立一个表时,能够在 CREATE TABLE 语句中指定某列的数据类型,可是你能够把任何数据类型放入任何列中。当某个值插入数据库时,SQLite 将检查它的类型。若是该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成该列的类型。若是不能转换,则该值将做为其自己具备的类型存储。好比能够把一个字符串(String)放入 INTEGER 列。SQLite 称这为“弱类型”(manifest typing.)。 此外,SQLite 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 还有一些 ALTER TABLE 功能。 除了上述功能外,SQLite 是一个完整的 SQL 系统,拥有完整的触发器,交易等等。Android 集成了 SQLite 数据库 Android 在运行时(run-time)集成了 SQLite,因此每一个 Android 应用程序均可以使用 SQLite 数据库。 对于熟悉 SQL 的开发人员来时,在 Android 开发中使用 SQLite 至关简单。可是,因为 JDBC 会消耗太多的系统资源,因此 JDBC 对于手机这种内存受限设备来讲并不合适。所以,Android 提供了一些新的 API 来使用 SQLite 数据库,Android 开发中,程序员须要学使用这些 API。数据库存储在 data/< 项目文件夹 >/databases/ 下。 Android 开发中使用 SQLite 数据库 Activites 能够经过 Content Provider 或者 Service 访问一个数据库。下面会详细讲解若是建立数据库,添加数据和查询数据库。 建立数据库 Android 不自动提供数据库。在 Android 应用程序中使用 SQLite,必须本身建立数据库,而后建立表、索引,填充数据。 Android 提供了 SQLiteOpenHelper 帮助你建立一个数据库,你只要继承 SQLiteOpenHelper 类,就能够轻松的建立数据库。SQLiteOpenHelper 类根据开发应用程序的须要,封装了建立和更新数据库使用的逻辑。SQLiteOpenHelper 的子类,至少须要实现三个方法: 1 构造函数,调用父类 SQLiteOpenHelper 的构造函数。这个方法须要四个参数:上下文环境(例如,一个 Activity),数据库名字,一个可选的游标工厂(一般是 Null),一个表明你正在使用的数据库模型版本的整数。 2 onCreate()方法,它须要一个 SQLiteDatabase 对象做为参数,根据须要对这个对象填充表和初始化数据。 3 onUpgrage() 方法,它须要三个参数,一个 SQLiteDatabase 对象,一个旧的版本号和一个新的版本号,这样你就能够清楚如何把一个数据库从旧的模型转变到新的模型。第四种 使用ContentProvider存储数据 ContentProvider其实也是经过数据库的方式来存储数据的,所以这里再也不作详细介绍第五种 网络存储数据 也就是说将数据保存在服务器,android上只须要经过httpclient发起一个请求,向服务器获取数据便可