android数据存储
第4章 Android中的数据存储
第4章Android中的数据存取程序是数据的输入、处理、输出的过程,不管是操作系统还是应用程序,都不可避免要用到大量的数据。
由于内存容量有限,且一旦关机,内存中的信息都消失,因此,一般把需要下次使用的数据保存在磁盘(对于手机来说SD卡)中。
操作系统一般以文件的形式来保存数据,而应用程序更喜欢使用数据库来保存。
在手机中,也有许多需要保存的数据,如音频文件、视频、图片、通讯录、短信、游戏中的设置等数据。
Android作为一种手机上的操作系统,提供了以下几种数据存取方式:Preference(配置)、File(文件)、SQLite(数据库)、网络等。
另外,在Android中,各个应用程序组件之间是相互独立的,彼此的数据一般不能共享,为了实现数据的共享,Android提供Content Provider组件来实现应用程序之间的数据共享(最典型的共享就如通讯录)。
4.1 PreferencePreference提供了一种轻量级的数据存取方法,应用场合主要是数据比较少的配置信息。
它以“键-值”(是一个Map)对的方式将数据保存在一个XML配置文件中。
4.1.1 Preference简介使用Preference方式来存取数据,要用到SharedPreferences接口和SharedPreferences的一个内部接口SharedPreferences.Editor,这两个接口在android.content包中。
调用Context.getSharedPreferences( String name, int mode)方法可得到SharedPreferences接口,该方法的第一个参数是文件名称,第二个参数是操作模式。
操作模式有三种:MODE_PRIV ATE(私有)、MODE_WORLD_READABLE (可读)和MODE_WORLD_WRITEABLE(可写)。
SharedPreferences提供了获得数据的方法,如:getString、getInt等。
Android数据存储框架GreenDao 3.0使用详解
Android数据存储框架GreenDao 3.0使用详解GreenDao 3.0 的使用1.简介简单的讲,GreenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM 解决方案。
(GreenDaois a light & fast ORM solution that maps objects to SQLite databases.)2.使用2-1.导入相关的包compile 'org.greenrobot:greendao:3.2.0'2.2.配置(Module)greendao {schemaVersion 1 //数据库版本daoPackage 'com.lee.codeplus.db' //默认生成的包名targetGenDir 'src/main/java' //根目录}2.3.在build.gradle(Project)中进行配置buildscript {repositories {jcenter()}dependencies {classpath 'com.android.tools.build:gradle:2.3.3'classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'}}3.使用3.1 实体类的创建@Entitypublic class ArticleFile {@Idprivate Long id;private String Category;private String author;private String createdAt;private String objectId;private String postType;private String textContent;private String updatedAt;private String webUrl;}注:(一) @Entity 定义实体@nameInDb在数据库中的名字,如不写则为实体中类名@indexes 索引@createInDb是否创建表,默认为true,false时不创建@schema 指定架构名称为实体@active 无论是更新生成都刷新(二) @Id(三) @NotNull不为null(四) @Unique 唯一约束(五) @ToMany一对多(六) @OrderBy排序(七) @ToOne一对一(八) @Transient 不存储在数据库中(九) @generated 由greendao产生的构造函数或方法3.2 Make Project自动生成Dao类等图上3个选中的类就是生成的。
android-数据存储之外部file存储(sdcard)
android-数据存储之外部file存储(sdcard)⼀、基础概要 1、说明: 1>应⽤程序运⾏⽤到的数据⽂件可以保存到sd卡中 2>⽂件类型:任意 3>数据保存路径: 路径1:/storage/sdcard/Android/data/packageName/files 其它应⽤可以访问,应⽤卸载时删除 路径2:/storage/sdcard/xxx/ (表⽰⾃⼰创建的⽂件--xxx) 其它应⽤可以访问,应⽤卸载时不会被删除 2、相关API Environment 操作sd卡⼯具类: ---得到sd卡状态:Environment.getExternalStorageState() sd卡可读写的挂载状态值:Environment.MEDIA_MOUNTED ---得到sd卡路径:Environment.getExternalStorageDirectory() context.getExternalFilesDir(): ---得到 /mnt/sdcard/Android/data/package_name/files/xxx.txt 操作sd卡的权限: ---android.permission.WRITE_EXTERNAL_STORAGE 属于写的权限,但加上后也可读。
⼆、开发步骤(路径1)1、写数据 1>判断sd卡状态,如果是挂载的状态继续 2>获取输⼊⽂件名/内容 3>得到指定⽂件的OutputStream: .得到sd卡下的files路径 .组成完整路径 .创建FileOutputStream 4>写数据if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {String fileName="xrk";String fileContent="我不是向⽇葵";String filesPath=getExternalFilesDir(null).getAbsolutePath();String filePath=filesPath+"/"+fileName;FileOutputStream fos=new FileOutputStream(filePath);fos.write(fileContent.getBytes("utf-8"));fos.close();Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();}else{Toast.makeText(MainActivity.this, "保存是啊⽐", Toast.LENGTH_SHORT).show();}2、读数据:if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {String fileName="xrk";String filesPath=getExternalFilesDir(null).getAbsolutePath();System.out.println("iueiudshcs"+filesPath);String filePath=filesPath+"/"+fileName;FileInputStream fis=new FileInputStream(filePath);ByteArrayOutputStream baos=new ByteArrayOutputStream();byte[] buffer=new byte[1024];int len=-1;while((len=fis.read(buffer))!=-1){baos.write(buffer, 0, len);}String content=baos.toString();Toast.makeText(MainActivity.this, "读取成功"+content, Toast.LENGTH_SHORT).show(); }else{Toast.makeText(MainActivity.this, "读取失败", Toast.LENGTH_SHORT).show();}三、开发步骤(路径2) 1、写数据if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {String fileName="谢荣康.txt";String fileContent="我不是向⽇葵";//得到指定⽂件的输出流String sdPath=Environment.getExternalStorageDirectory().getAbsolutePath();File file=new File(sdPath+"/atguigu");if (!file.exists()) {file.mkdirs();//创建⽂件夹}String filePath=sdPath+"/atguigu/"+fileName;String filesPath=getExternalFilesDir(null).getAbsolutePath();System.out.println("iueiudshcs"+filesPath);FileOutputStream fos=new FileOutputStream(filePath);fos.write(fileContent.getBytes("utf-8"));fos.close();Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();}else{Toast.makeText(MainActivity.this, "保存是啊⽐", Toast.LENGTH_SHORT).show();} 2、读数据:if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {String fileName="谢荣康.txt";String sdPath=Environment.getExternalStorageDirectory().getAbsolutePath();String filePath=sdPath+"/atguigu/"+fileName;FileInputStream fis=new FileInputStream(filePath);ByteArrayOutputStream baos=new ByteArrayOutputStream();byte[] buffer=new byte[1024];int len=-1;while((len=fis.read(buffer))!=-1){baos.write(buffer, 0, len);}String content=baos.toString();fis.close();Toast.makeText(MainActivity.this, "读取成功"+content, Toast.LENGTH_SHORT).show(); }else{Toast.makeText(MainActivity.this, "读取失败", Toast.LENGTH_SHORT).show();。
《Android应用开发》课件——第5章 数据存储
File SDPath = Environment.getExternalStorageDirectory();
File file = new File(SDPath, "data.txt");获取SD卡目录
String data = "HelloWorld";
FileOutputStream fos = new FileOutputStream(file);
注意:Android系统有一套自己的安全模型,默认情况下任何应用创 建的文件都是私有的,其他程序无法访问。
✎
5.2.1 将数据存入到文件中
内部存储
String fileName = "data.txt";
// 文件名称
String content = "helloworld";
// 保存数据
FileOutputStream fos = openFileOutput(fileName, MODE_PRIVATE);
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
动态申请权限的方法
外部存储 ✓ 存储位置
将数据以文件的形式存储到外部设备上。
✓ 存储位置
mnt/sdcard/目录下。
✓ 其它应用操作该文件时
不用设置权限,会被其它应用共享
✓ 删除文件
该文件可在本应用外删除,使用前需要 确认外部设备是否可用
✓ 删除文件
直接使用FileOutputStream和 FileInputStream操作对象
Android操作系统与应用开发第5章
第5章 Android数据存储
实际上SharedPreferences是采用xml文件格式将数据存储
到设备中的,文件存放在File Explorer中的
/data/data/<package name>/shares_prefs目录下。如果希望
SharedPreferences使用的xml文件能被其他应用读和写,则可 以指定Context.MODE_WORLD_READABLE和 Context.MODE_WORLD_WRITEABLE权限。
第5章 Android数据存储
button.setOnClickListener(new Button.OnClickListener()
{ @Override public void onClick(View v) { //这部分是自动产生方法桩 try {
//写入数据
第5章 Android数据存储
第5章 Android数据存储
一个实现SharedPreferences存储的实例代码如下:
//获取SharedPreferences对象 SharedPreferences user = getSharedPreferences(“user_info”, MODE_PRIVATE); //存入数据 Editor editor = user.edit(); editor.putString(“NAME”, “hello”);
(当然不是真的SD卡,只是镜像文件)。创建SD卡可以在
Eclipse创建模拟器时随同创建,也可以使用DOS命令进行创
建,操作方法如下: 在DOS窗口中进入Android SDK安装路径的tools目录, 输入以下命令创建一张容量为2 GB的SD卡(文件后缀可以随 便取,建议使用.img): mksdcard 2048M D:\AndroidTool\sdcard.img
简述android中的5种数据存储方式
简述android中的5种数据存储方式Android作为一款广泛使用的移动操作系统,其数据存储方式也日益多样化。
目前,Android中主要有5种数据存储方式,分别是Shared Preferences、SQLite数据库、文件存储、网络存储和Content Provider。
一、Shared PreferencesShared Preferences是一种轻量级的数据存储方式,适用于保存应用程序的一些配置信息和用户偏好设置等简单数据。
其本质上是一个键值对(key-value)形式的数据存储,通过SharedPreferences类进行操作。
该类提供了putXXX()和getXXX()等方法来实现对数据的读写操作。
其中,XXX代表不同类型的数据,包括Boolean、Int、Float、Long和String等。
二、SQLite数据库SQLite数据库是Android中最常用的关系型数据库之一,适用于存储结构化数据。
它提供了SQL语言来进行查询和操作数据库,并且支持事务处理。
在Android中使用SQLite数据库需要先创建一个继承自SQLiteOpenHelper类的帮助类,在该类中实现onCreate()和onUpgrade()方法来创建和升级数据库表格。
然后通过SQLiteDatabase类进行增删改查等操作。
三、文件存储文件存储是指将数据以文件形式保存在设备本地或外部存储器中。
它适用于大量非结构化或自定义格式的数据,例如图片、音频、视频等多媒体文件。
在Android中可以通过FileInputStream和FileOutputStream类来读写文件,同时也可以使用BufferedInputStream和BufferedOutputStream等类来提高读写效率。
四、网络存储网络存储是指将数据保存在远程服务器上,通过网络传输获取数据。
它适用于需要与服务器进行交互的应用程序,例如社交媒体、电子商务等应用。
Android数据存储(Data Storage)
Android提供几种保存持久化应用程序数据的选择。
依赖具体的需求来选择解决适合的方案,如数据应该是应用程序私有的还是共享的,以及数据所需要的存储空间等。
以下是可选择的数据存储方案:共享偏好(Shared Preferences)用键---值对的形式保存私有的原始数据。
内部存储(Internal Storage)在设备的内存上保存私有的数据。
外部存储(External Storage)在共享的外部存储器上保存公共的数据。
SQLite数据库在私有的数据库中保存结构化的数据。
网络连接(Network Connection)把数据保存在自己的互联网服务器上。
Android提供了内容提供器(content provider),能够你的私有数据公开给其他应用程序。
内容提供器是一种公开应用程序数据的读写访问权限的可选组件,这种读写访问会受到你所施加的任何限制的影响。
使用共享偏好SharedPreference类提供了一个一般性的框架,它允许用原始类型数据的键---值对的形式来保存和获取持久化的数据。
使用SharedPreference能够保存任意类型的原始类型数据:布尔型、浮点型、整数型、以及字符串。
这种数据会跨越用户的会话周期被持久化保存(即使是应用程序进程被杀死)。
有两种方法来为应用程序获取SharedPreferences对象:1.getSharedPreferences()方法---如果需要多个用名称来标识的偏好文件,就要使用这个方法,它的第一个参数要指定偏好文件的名称。
2.getPreferences()方法---如果仅需要针对Activity的一个偏好文件,就使用这个方法。
因为这个方法仅返回当前Activity的偏好文件,不需要提供偏好文件的名称。
以下是向偏好文件中写入数据的方法:1.调用edit()方法来获取一个SharedPreferences.Editor对象;2.调用诸如putBoolean()和putString()等方法来添加要保存的值;3.调用commit()方法来提交要保存的新值。
Android数据存储操作
Android数据存储-概述
概述 ∟典型的桌面操作系统提供一种公共文件系统---任何应用软件都 可以使用它来存储和读取文件,该文件也可以被其他的应用软 件所读取(会有一些权限控制设定); ∟Android采用了一种不同的系统,所有的应用软件数据(包括文 件)为该应用软件所私有;而Android同样也提供了一种标准方 式供应用软件将私有数据开放给其他应用软件; ∟在Android中,可供选择的存储方式有SharedPreference、文件 存储、SQLite数据库方式、内容提供器(Content provider)和网 络,本次课将描述一个应用软件存储和获取数据、开放数据给 其他应用软件、从其他应用软件请求数据并且开放他们的多种 方式。
Android数据存储方式
文件存储
∟ SharedPreferences存储方式非常方便,但只适合存储比较简 单的数据,如果需要存储更多的数据,可行的方式有好几种, 下面先介绍文件存储的方法; ∟文件存储方式是一种较常用的方法,在Android中读取/写入文件 的方法,与Java中实现I/O的程序是完全一样的,提供了 openFileI上的文件; Note: 默认情况下,使用openFileOutput方法创建的文件只能被其调 用的应用使用,其他应用无法去读这个文件,如果需要在不同 的应用中共享数据,可以使用ContentProvider实现;
∟query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):通过Uri进行查询,返回一个 Cursor; ∟insert(Uri uri, ContentValues values):将一组数据插入到Uri指定的 地方; ∟update(Uri uri, ContentValues values, String where, String[] selectionArgs):更新Uri指定位置的数据; ∟delete(Uri uri, String where, String[] selectionArgs):删除指定Uri并 且符合一定条件的数据。
Android的数据存储报告
{ 项目名称} Android的数据存储报告XXXXXXX信息工程中心嵌入式与RFID实验室版本历史目录0. 文档介绍 (4)0.1文档目的 (4)0.2文档范围 (4)0.3读者对象 (4)0.4参考文献 (4)0.5术语与缩写解释 (4)1. 系统环境 (5)2. ANDROID的数据存储 (5)2.1A NDROID的数据存储方式 (5)2.2使用S HARED P REFERENCES存储数据; (5)2.3文件存储数据 (7)2.4网络存储数据 (9)3. SQLITE数据库存储存储 (9)3.1SQ LITE的特点 (9)3.2与其相关的函数 (10)3.3对数据库进行操作的方法 (11)3.4对数据库进行操作的例子 (14)4. 使用CONTENTPROVIDER 存储数据 (18)4.1C ONTENT P ROVIDER简介 (18)4.2U RI类简介 (18)4.3U RI M ATCHER、C ONTENT U RIST和C ONTENT R ESOLVER简介 (18)4.4C ONTENT P ROVIDER示例程序 (19)5. 总结 (23)0. 文档介绍0.1 文档目的本文档主要是介绍Android的数据存储,作者希望通过本文档的介绍能使读者对Android 的数据存储有所了解,并通过详尽实例的讲解,使读者加深对数据存储的理解和运用。
0.2 文档范围本文档主要用于Android的数据存储,本文主要从以下几个方面来介绍:什么是数据的存储、数据存储的分类以及各个分类的详细介绍,还有一些简单的实例等。
0.3 读者对象本文适合于对And发有兴趣的读者,还有想要研究Android系统下数据存储的读者,文档涉及到Android系统,因此还是要求读者对其具有一些roid系统开基本概念,例如,关于JAVA API中关于数据库概念的理解和关于Android中有关数据存储等的理解等。
Android五种数据存储方式
Android五种数据存储⽅式android 五种数据存储:SharePreferences、SQLite、Contert Provider、File、⽹络存储Android系统提供了四种存储数据⽅式。
分别为:SharePreference、SQLite、Content Provider和File。
但由于Android系统中,数据基本是私有的,都是存放于”data/data”程序包名⽬录下,所以要实现数据共享,正确⽅式是使⽤Content ProviderSQLite:SQLite是⼀个轻量级的数据库,⽀持基本的SQL语法,是常被采⽤的⼀种数据存储⽅式。
Android为此数据库提供了⼀个名为SQLiteDatabase的类,封装了⼀些操作数据库的apiSharedPreference:除SQLite数据库外,另⼀种常⽤的数据存储⽅式,其本质就是⼀个xml⽂件,常⽤于存储较简单的参数设置。
File:即常说的⽂件(I/O)存储⽅法,常⽤语存储⼤数量的数据,但是缺点是更新数据将是⼀件困难的事情。
ContentProvider: Android系统中能实现所有应⽤程序共享的⼀种数据存储⽅式,由于数据通常在各应⽤间的是互相私密的,所以此存储⽅式较少使⽤,但是其⼜是必不可少的⼀种存储⽅式。
例如⾳频,视频,图⽚和通讯录,⼀般都可以采⽤此种⽅式进⾏存储。
每个Content Provider都会对外提供⼀个公共的URI(包装成Uri对象),如果应⽤程序有数据需要共享时,就需要使⽤Content Provider为这些数据定义⼀个URI,然后其他的应⽤程序就通过Content Provider传⼊这个URI来对数据进⾏操作。
URI由3个部分组成:"content://"、数据的路径、标识ID(可选)。
1)SQLite数据存储======================================================================SQLite是⼀种转为嵌⼊式设备设计的轻型数据库,其只有五种数据类型,分别为:NULL:空值INTEGER:整数REAL:浮点数TEXT:字符串BLOB:⼤数据在SQLite中,并没有专门设计BOOLEAN和DATE类型,因为BOOLEAN型可以⽤INTEGER的0和1代替true和false,⽽DATE类型则可以拥有特定格式的TEXT、REAL和INTEGER的值来代替显⽰,为了能⽅便的操作DATE类型,SQLite提供了⼀组函数,在Android系统中提供了anroid.database.sqlite包,⽤于进⾏SQLite数据库的增,删,改,查⼯作,其主要⽅法如下: beginTransaction(): 开始⼀个事务。
Android数据存储方式有哪几种
Android数据存储⽅式有哪⼏种以下内容给⼤家介绍Android数据存储提供了五种⽅式:1、SharedPreferences2、⽂件存储3、SQLite数据库4、ContentProvider5、⽹络存储 本⽂主要介绍如何使⽤⽂件来存储数据。
Android⽂件操作⽤到的是Java.IO中的FileOutputStream和FileInputStream类。
⼀、存储⽂件 ⾸先实例化⼀个FileOutputStream。
FileOutputStream foStream = openFileOutput(fileName, MODE_PRIVATE);// fileName: 要写⼊⽂件的名称// MODE_PRIVATE: 为默认操作模式,代表该⽂件是私有数据,只能被应⽤本⾝访问,在该模式下,写⼊的内容会覆盖原⽂件的内容// MODE_APPEND: 模式会检查⽂件是否存在,存在就往⽂件追加内容,否则就创建新⽂件.// MODE_WORLD_READABLE: 表⽰当前⽂件可以被其他应⽤读取,不推荐使⽤// MODE_WORLD_WRITEABLE: 表⽰当前⽂件可以被其他应⽤写⼊,不推荐使⽤ 然后调⽤foStream.write()即可完成写⼊。
byte[] buffer = fileContent.getBytes();foStream.write(buffer);Toast.makeText(MainActivity.this, "写⼊成功",Toast.LENGTH_SHORT).show(); 最后进⾏⼀些清理⼯作,刷新写出流和关闭流。
foStream.flush();foStream.close();⼆、读取⽂件 同样的,⾸先实例化⼀个FileInputStream。
FileInputStream fiStream = openFileInput(fileName) 然后调⽤fiStream.read()即可int len = fiStream.available();byte[] buffer = new byte[len];fiStream.read(buffer) 最后,将⽂本显⽰并关闭读⽂件流etContent.setText(new String(buffer));Toast.makeText(MainActivity.this, "读取成功",Toast.LENGTH_SHORT).show();fiStream.close();三、完整代码import android.support.v.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;import java.io.FileInputStream;import java.io.FileOutputStream;public class MainActivity extends AppCompatActivity {private EditText etName;private EditText etContent;private Button btnWrite;private Button btnRead;private String fileName = "";private String fileContent = "";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);etName = (EditText)findViewById(R.id.etName);etContent = (EditText)findViewById(R.id.etContent);btnWrite = (Button)findViewById(R.id.btnWrite);btnRead = (Button)findViewById(R.id.btnRead);btnWrite.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {fileName = etName.getText().toString();fileContent = etContent.getText().toString();try {FileOutputStream foStream = openFileOutput(fileName, MODE_PRIVATE);byte[] buffer = fileContent.getBytes();foStream.write(buffer);Toast.makeText(MainActivity.this, "写⼊成功",Toast.LENGTH_SHORT).show();foStream.flush();foStream.close();}catch(Exception e){e.printStackTrace();}}});btnRead.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {fileName = etName.getText().toString();try{FileInputStream fiStream = openFileInput(fileName);int len = fiStream.available();byte[] buffer = new byte[len];fiStream.read(buffer);etContent.setText(new String(buffer));Toast.makeText(MainActivity.this, "读取成功",Toast.LENGTH_SHORT).show();fiStream.close();}catch(Exception e){e.printStackTrace();}}});}}<RelativeLayout xmlns:android="/apk/res/android"xmlns:tools="/tools" android:layout_width="match_parent"android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"><EditTextandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/etName"android:layout_alignParentTop="true"android:layout_alignParentLeft="true"android:layout_alignParentStart="true"android:layout_alignParentRight="true"android:layout_alignParentEnd="true"android:text="⽂件名" /><EditTextandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/etContent"android:layout_below="@+id/etName"android:layout_alignParentLeft="true"android:layout_alignParentStart="true"android:layout_alignParentRight="true"android:layout_alignParentEnd="true"android:text="⽂件内容" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="保存"android:id="@+id/btnWrite"android:layout_alignTop="@+id/btnRead"android:layout_toLeftOf="@+id/btnRead"android:layout_toStartOf="@+id/btnRead" /> <Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="读取"android:id="@+id/btnRead"android:layout_below="@+id/etContent"android:layout_alignParentRight="true"android:layout_alignParentEnd="true" /></RelativeLayout>。
Android实用教程 第6章 Android数据存储与共享
SharedPreferences举例
(1)设计页面 用第3章学过的表格布局设计注册页面register.xml,代码。 其中: (a)android:inputType="numberPassword" android:hint="必须全部为数字":文本编辑框输入 内容均显示“.”,初始提示信息为“必须全部为数字”。 (b)<ToggleButton...android:checked="true" />:开关按钮控件属性checked="true"(默认), 显示“男”;属性checked="false",显示“女”。 (c)android:inputType="date":文本显示内容为日期。 (d)<SpinnerSpinner android:id="@+id/mySpinnerDegree"/>:控件选择输入内容,选择项目 “博士、硕士、学士”在findViews()中添加。 (e)android:text="已阅读并接受\n网站服务条款" android:layout_gravity="center|right" androi d:onClick="onCheckBoxClick":提示信息包含“\n”表示换行;上下对中水平右对齐;单击按钮,执行on CheckBoxClick()方法。 (f)style="?android:attr/buttonStyleSmall" android:enabled="false":命令按钮采用buttonStyle Small风格,初始状态不可用。在myCheckBoxAccept控件的单击事件中判断若两次密码相同,使该命令 按钮可用。
Android本地存储
使用SQLite数据库进行结构化数据存储。适用于需要高效查询和检索的数据,如应用程序 设置、用户信息等。
SharedPreferences存储
使用Android的SharedPreferences类进行轻量级数据存储。适用于存储较小的数据,如 应用程序配置、用户状态等。
本地存储的重要性
用户体验
SQLite与Java的关系
Android开发中,SQLite数据库的创建、升级、查询等操作通常使用Java语言实现。 Java提供了SQLite的API接口,开发者可以通过Java来操作SQLite数据库。 在Android应用开发中,SQLite数据库的交互通常通过Java代码实现。
04
Content Provider
获取文件目录。
可以设置访问权限,使得其他 应用可以访问。
SharedPreferences
01
轻量级的数据存储方式,主要 用于存储一些基本类型的数据 。
02
数据以键值对形式存储,只能 存储基本类rences.Editor对 象进行数据的读取和写入操作 。
由于数据存储在本地,读取和写入数据的速度会 更快。
不受网络限制
在没有网络的情况下,本地存储的数据仍然可以 访问,而云端存储则需要网络连接。
本地存储的缺点
空间限制
本地存储空间有限,不能像云存储一样无限扩展。
数据难以共享
本地存储的数据难以与他人共享,而云端存储则可以通过链接、 共享等方式方便地共享数据。
Content Provider的创建
01
创建步骤
02
1. 定义数据模型:确定要共享的数据类型和结构。
03
2. 实现 Content Provider:继承 Android 的 ContentProvider 类,并重写其 中的方法,包括 insert、delete、update、query 等。
android数据存储实验总结
android数据存储实验总结一、实验介绍Android数据存储实验是在Android Studio开发环境下,利用SharedPreferences,SQLite和File三种API实现Android应用程序的数据存储,实现具有添加、查询、删除等功能的Android应用程序。
实验帮助了解Android中三种数据存储:SharedPreferences、SQLite 以及File三种存储方式的实际应用。
二、实验步骤1、创建Android工程使用Android Studio创建一个新的Android工程,并命名为MyDataStorage。
2、编写布局文件编写主页面的布局文件,通过ListView展示数据,添加EditText 用于输入数据,以及添加Button用于添加数据。
3、实现SharedPreferences存储创建一个SharedPreferences对象,调用edit()方法获得一个Editor对象,用来向SharedPreferences写入数据,通过getString()方法从SharedPreferences中读取数据。
4、实现SQLite数据库存储使用SQLiteOpenHelper类创建、管理数据库,调用SQLiteDatabase对象的execSQL()方法创建表格,调用SQLiteDatabase对象的insert()方法向表格插入数据;调用SQLiteDatabase对象的query()方法查询数据,调用SQLiteDatabase 对象的delete()方法删除数据。
5、实现文件存储创建一个文件对象,打开文件,使用PrintWriter写数据,使用BufferedReader读取数据。
三、实验结果通过本次实验,我学习了三种Android数据存储的方式:SharedPreferences、SQLite和File,并使用这三种方式实现了一个Android应用程序的数据存储。
AndroidApp将数据写入内部存储和外部存储的示例
AndroidApp将数据写⼊内部存储和外部存储的⽰例File存储(内部存储)⼀旦程序在设备安装后,data/data/包名/ 即为内部存储空间,对外保密。
Context提供了2个⽅法来打开输⼊、输出流FileInputStream openFileInput(String name)FileOutputStream openFileOutput(String name, int mode)public class MainActivity extends Activity {private TextView show;private EditText et;private String filename = "test";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);show = (TextView) findViewById(R.id.show);et = (EditText) findViewById(R.id.et);findViewById(R.id.write).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE);//FileOutputStream是字节流,如果是写⽂本的话,需要进⼀步把FileOutputStream包装 UTF-8是编码OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");//写osw.write(et.getText().toString());osw.flush();fos.flush();osw.close();fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});findViewById(R.id.read).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {FileInputStream fis = openFileInput(filename);//当输⼊输出都指定字符集编码的时候,就不会出现乱码的情况InputStreamReader isr = new InputStreamReader(fis, "UTF-8");//获取⽂件的可⽤长度,构建⼀个字符数组char[] input = new char[fis.available()];isr.read(input);isr.close();fis.close();String readed = new String(input);show.setText(readed);} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});}}data/data/packagename/files/test就是我们写⼊的⽂件。
详解Android数据存储之SQLCipher数据库加密
详解Android数据存储之SQLCipher数据库加密前⾔:最近研究了Android Sqlite数据库以及ContentProvider程序间数据共享,我们清晰的知道Sqlite数据库默认存放位置data/data/pakage/database⽬录下,对于已经ROOT的⼿机来说的没有任何安全性可以,⼀旦被利⽤将会导致数据库数据的泄漏,所以我们该如何避免这种事情的发⽣呢?我们尝试这对数据库进⾏加密。
选择加密⽅案:1.)第⼀种⽅案我们可以对数据的数据库名,表名,列名就⾏md5,对存储的数据进⾏加密,例如进⾏aes加密(Android数据加密之Aes加密),查询的时候再对数据进⾏解密,这种⽅式不能说不好,但是使⽤起来可以想象⼀下其带来的⿇烦程度。
2.)第⼆种⽅案采⽤第三⽅加密开源库,查找了很多种Android 数据库加密⽅案,最终选定SQLCipher这个开源框架,接下来看下SqlCipher 如何使⽤。
SQLCipher简介:SQLCipher是⼀个在SQLite基础之上进⾏扩展的开源数据库,SQLCipher具有占地⾯积⼩、性能因此它⾮常适合嵌⼊式应⽤的数据库保护,⾮常适合于移动开发。
优势:加密性能⾼、开销⼩,只要5-15%的开销⽤于加密完全做到数据库100%加密采⽤良好的加密⽅式(CBC加密模式)使⽤⽅便,做到应⽤级别加密采⽤OpenSSL加密库提供的算法SQLCipher使⽤⽅式:1.)在build.gradle⽂中添加如下代码,当前使⽤的是最新版本3.4.0dependencies {compile 'net.zetetic:android-database-sqlcipher:3.4.0'}2.)创建⼀个SQLiteOpenHelper 注意接下来所以有关Sqlite相关类全部引⽤net.sqlcipher.database的类import android.content.Context;import android.util.Log;import net.sqlcipher.SQLException;import net.sqlcipher.database.SQLiteDatabase;import net.sqlcipher.database.SQLiteOpenHelper;public class DBCipherHelper extends SQLiteOpenHelper {private static final String TAG = "DatabaseHelper";private static final String DB_NAME = "test_cipher_db";//数据库名字public static final String DB_PWD="whoislcj";//数据库密码public static String TABLE_NAME = "person";// 表名public static String FIELD_ID = "id";// 列名public static String FIELD_NAME= "name";// 列名private static final int DB_VERSION = 1; // 数据库版本public DBCipherHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);//不可忽略的进⾏so库加载SQLiteDatabase.loadLibs(context);}public DBCipherHelper(Context context) {this(context, DB_NAME, null, DB_VERSION);}/*** 创建数据库* @param db*/@Overridepublic void onCreate(SQLiteDatabase db) {//创建表createTable(db);}private void createTable(SQLiteDatabase db){String sql = "CREATE TABLE " + TABLE_NAME + "(" + FIELD_ID + " integer primary key autoincrement , " + FIELD_NAME + " text not null);"; try {db.execSQL(sql);} catch (SQLException e) {Log.e(TAG, "onCreate " + TABLE_NAME + "Error" + e.toString());return;}}/*** 数据库升级* @param db* @param oldVersion* @param newVersion*/@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}注意:SQLiteDatabase.loadLibs(context);这个千万别忘记调⽤3.)创建⼀个DBCipherManager数据库管理具体实现传统的SQLiteOpenHelper都是完全相同的,不同的地⽅在获取数据库句柄的地⽅传统⽅式://获取可写数据库SQLiteDatabase db = dbHelper.getWritableDatabase();//获取可读数据库SQLiteDatabase db = dbHelper.getReadableDatabase();现在的⽅式:需要传⼊⼀个password,这个password就是⽤于加密的秘钥//获取写数据库SQLiteDatabase db = dbHelper.getWritableDatabase(DBCipherHelper.DB_PWD);//获取可读数据库SQLiteDatabase db = dbHelper.getReadableDatabase(DBCipherHelper.DB_PWD);接下来就是具体实现:import android.content.ContentValues;import android.content.Context;import android.util.Log;import net.sqlcipher.Cursor;import net.sqlcipher.SQLException;import net.sqlcipher.database.SQLiteDatabase;/*** 数据库管理者 - 提供数据库封装**/public class DBCipherManager {private static final String TAG = "DatabaseManager";// 静态引⽤private volatile static DBCipherManager mInstance;// DatabaseHelperprivate DBCipherHelper dbHelper;private DBCipherManager(Context context) {dbHelper = new DBCipherHelper(context.getApplicationContext());}/*** 获取单例引⽤** @param context* @return*/public static DBCipherManager getInstance(Context context) {DBCipherManager inst = mInstance;if (inst == null) {synchronized (DBCipherManager.class) {inst = mInstance;if (inst == null) {inst = new DBCipherManager(context);mInstance = inst;}}}return inst;}/*** 插⼊数据*/public void insertData(String name) {//获取写数据库SQLiteDatabase db = dbHelper.getWritableDatabase(DBCipherHelper.DB_PWD); //⽣成要修改或者插⼊的键值ContentValues cv = new ContentValues();cv.put(DBCipherHelper.FIELD_NAME, name);// insert 操作db.insert(DBCipherHelper.TABLE_NAME, null, cv);//关闭数据库db.close();}/*** 未开启事务批量插⼊* @param testCount*/public void insertDatasByNomarl(int testCount){//获取写数据库SQLiteDatabase db = dbHelper.getWritableDatabase(DBCipherHelper.DB_PWD); for(int i =0;i<testCount;i++ ){//⽣成要修改或者插⼊的键值ContentValues cv = new ContentValues();cv.put(DBCipherHelper.FIELD_NAME, String.valueOf(i));// insert 操作db.insert(DBCipherHelper.TABLE_NAME, null, cv);Log.e(TAG, "insertDatasByNomarl");}//关闭数据库db.close();}/*** 测试开启事务批量插⼊* @param testCount*/public void insertDatasByTransaction(int testCount){//获取写数据库SQLiteDatabase db = dbHelper.getWritableDatabase(DBCipherHelper.DB_PWD); db.beginTransaction(); //⼿动设置开始事务try{//批量处理操作for(int i =0;i<testCount;i++ ){//⽣成要修改或者插⼊的键值ContentValues cv = new ContentValues();cv.put(DBCipherHelper.FIELD_NAME, String.valueOf(i));// insert 操作db.insert(DBCipherHelper.TABLE_NAME, null, cv);Log.e(TAG, "insertDatasByTransaction");db.setTransactionSuccessful(); //设置事务处理成功,不设置会⾃动回滚不提交}catch(Exception e){}finally{db.endTransaction(); //处理完成//关闭数据库db.close();}}/*** 删除数据*/public void deleteData(String name) {//⽣成条件语句StringBuffer whereBuffer = new StringBuffer();whereBuffer.append(DBCipherHelper.FIELD_NAME).append(" = ").append("'").append(name).append("'"); //获取写数据库SQLiteDatabase db = dbHelper.getWritableDatabase(DBCipherHelper.DB_PWD);// delete 操作db.delete(DBCipherHelper.TABLE_NAME, whereBuffer.toString(), null);//关闭数据库db.close();}/*** 删除所有数据*/public void deleteDatas(){String sql="delete from "+ DBCipherHelper.TABLE_NAME;execSQL(sql);}/*** 更新数据*/public void updateData(String name) {//⽣成条件语句StringBuffer whereBuffer = new StringBuffer();whereBuffer.append(DBCipherHelper.FIELD_NAME).append(" = ").append("'").append(name).append("'"); //⽣成要修改或者插⼊的键值ContentValues cv = new ContentValues();cv.put(DBCipherHelper.FIELD_NAME, name+name);//获取写数据库SQLiteDatabase db = dbHelper.getWritableDatabase(DBCipherHelper.DB_PWD);// update 操作db.update(DBCipherHelper.TABLE_NAME, cv, whereBuffer.toString(), null);//关闭数据库db.close();}/*** 指定条件查询数据*/public void queryDatas(String name){//⽣成条件语句StringBuffer whereBuffer = new StringBuffer();whereBuffer.append(DBCipherHelper.FIELD_NAME).append(" = ").append("'").append(name).append("'"); //指定要查询的是哪⼏列数据String[] columns = {DBCipherHelper.FIELD_NAME};//获取可读数据库SQLiteDatabase db = dbHelper.getReadableDatabase(DBCipherHelper.DB_PWD);//查询数据库Cursor cursor = null;try {cursor = db.query(DBCipherHelper.TABLE_NAME, columns, whereBuffer.toString(), null, null, null, null); while (cursor.moveToNext()) {int count = cursor.getColumnCount();String columName = cursor.getColumnName(0);String tname = cursor.getString(0);Log.e(TAG, "count = " + count + " columName = " + columName + " name = " +tname);}if (cursor != null) {cursor.close();} catch (SQLException e) {Log.e(TAG, "queryDatas" + e.toString());}//关闭数据库db.close();}/*** 查询全部数据*/public void queryDatas(){//指定要查询的是哪⼏列数据String[] columns = {DBCipherHelper.FIELD_NAME};//获取可读数据库SQLiteDatabase db = dbHelper.getReadableDatabase(DBCipherHelper.DB_PWD);//查询数据库Cursor cursor = null;try {cursor = db.query(DBCipherHelper.TABLE_NAME, columns, null, null, null, null, null);//获取数据游标 while (cursor.moveToNext()) {int count = cursor.getColumnCount();String columeName = cursor.getColumnName(0);//获取表结构列名String name = cursor.getString(0);//获取表结构列数据Log.e(TAG, "count = " + count + " columName = " + columeName + " name = " +name);}//关闭游标防⽌内存泄漏if (cursor != null) {cursor.close();}} catch (SQLException e) {Log.e(TAG, "queryDatas" + e.toString());}//关闭数据库db.close();}/*** 执⾏sql语句*/private void execSQL(String sql){//获取写数据库SQLiteDatabase db = dbHelper.getWritableDatabase(DBCipherHelper.DB_PWD);//直接执⾏sql语句db.execSQL(sql);//或者//关闭数据库db.close();}}4.)具体怎么调⽤//清空数据DBCipherManager.getInstance(MainActivity.this).deleteDatas();//插⼊数据for (int i = 0; i < 10; i++) {DBCipherManager.getInstance(MainActivity.this).insertData(String.valueOf(i));}//删除数据DBCipherManager.getInstance(MainActivity.this).deleteData(String.valueOf(5));//更新数据DBCipherManager.getInstance(MainActivity.this).updateData(String.valueOf(3));//查询数据DBCipherManager.getInstance(MainActivity.this).queryDatas();5.)事务⽀持和传统⽅式⼀样//获取写数据库SQLiteDatabase db = dbHelper.getWritableDatabase();db.beginTransaction(); //⼿动设置开始事务try{//在此处理批量操作for(int i =0;i<testCount;i++ ){//⽣成要修改或者插⼊的键值ContentValues cv = new ContentValues();cv.put(DBHelper.FIELD_NAME, String.valueOf(i));// insert 操作db.insert(DBHelper.TABLE_NAME, null, cv);}db.setTransactionSuccessful(); //设置事务处理成功,不设置会⾃动回滚不提交}catch(Exception e){}finally{db.endTransaction(); //处理完成//关闭数据库db.close();}总结:SQLCipher使⽤总结到此结束。
AndroidStudioAndroid数据存储五种方式总结
AndroidStudioAndroid数据存储五种方式总结本文介绍Android平台进行数据存储的五大方式,分别如下:1 使用SharedPreferences存储数据2 文件存储数据3 SQLite数据库存储数据4 使用ContentProvider存储数据5 网络存储数据第一种:使用SharedPreferences存储数据SharedPreferencese的使用:https:///augfun/article/details/54563808 适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。
比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),解锁口令密码等。
核心原理:保存基于XML文件存储的key-value键值对数据,通常用来存储一些简单的配置信息。
通过DDMS的File Explorer面板,展开文件浏览树,很明显SharedPreferences数据总是存储在/data/data//shared_prefs目录下。
SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接口Editor对象实现。
SharedPreferences本身是一个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences实例class ViewOcl implements View.OnClickListener{undefined @Overridepublic 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("lo ck", MODE_WORLD_WRITEABLE).edit();//步骤2-2:将获取过来的值放入文件editor.putString("code", code);//步骤3:提交mit();Toast.makeText(getApplicationContext(), "口令设置成功", Toast.LENGTH_LONG).show();break;case R.id.btnGet://步骤1:创建一个SharedPreferences接口对象SharedPreferences read = getSharedPreferences("lock", MO DE_WORLD_READABLE);//步骤2:获取文件中的值String value = read.getString("code", "");Toast.makeText(getApplicationContext(), "口令为:"+value, Toast.LENGTH_LONG).show();break;}12345678910111213141516171819202122232425第二种:文件存储数据核心原理: Context提供了两个方法来打开数据文件里的文件IO流FileInputStream openFileInput(String name); FileOutputStream(String name , int mode),这两个方法第一个参数用于指定文件名,第二个参数指定打开文件的模式。
Android-14-数据存储(1)—Preference存储数据(参考模板)
第14讲数据存储(1)—Preference存储数据Android中有三种持久化数据的方法:SQLite数据库、文件存储、Preference。
三种方法各有专攻,而其中Preference是以类似Map的键值对形式存储的,最适合用来保存用户个人设置之类的信息,比如是否打开音效,音量大小、界面颜色等等。
比用文件来保存方便读取。
而SQLite数据库用来保存大量的数据。
基础知识讲解:SharedPreferences与Editor简介---SharedPreferences主要用来保存类似配置信息格式的数据,它保存的数据是key-value对。
它主要负责读取应用的Preference数据。
查看SharedPreference类的源码,重要的方法有:boolean contains(String key)String getString(String key, String defValue)float getFloat(String key, float defValue)……可以返回各种基本类型getAll():获取SharedPreference中的所有的key value对Editor edit():得到一个Editor对象---Editor类SharedPreferences接口本身并没有提供写入数据的能力,而是通过SharedPreference的内部接口,即Editor对象所提供的写入方法来向SharedPreferences中写入数据,重要的方法有:Editor putString(String key, String value);Editor putInt(String key, int value);……可以写入各种基本类型boolean commit(); 当Editor编辑完成时,提交修改,类似于事务Editor remove(String key);Editor clear(); 清空所有已有的SharedPreference数据---得到SharedPreferences的实例Context(Activity类的父类)类提供的方法:preferences= this.getSharedPreferences("setting", Context.MODE_PRIVATE);第一个参数表示在手机内存中所写入的持久化文件为setting.xml,位置如下第二个参数表示权限,控制所写的配置文件是否能由其他的程序所读取或修改例:对前例所开发的记事本程序进行界面颜色的设定。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在Android中,提供了三种数据存储的途径,和两种存储方式。
三种途径:l 系统配置(Shared Preferences):这类应用主要是系统的配置信息的保存,比如我给程序界面设置了颜色,我想在下一次启动时还是能够保留上次设置的颜色。
由于Android系统的界面是采用Activity栈的形式,在系统资源不足时,会收回一些界面,那么,我想有些操作也是需要在不活动时保留下来的,等再次激活时能够显示出来。
l 文件(Files)Android是一个操作系统,自然而然对存储系统会有一个管理,因为采用提Linux核心,所有在Andorid系统中,文件也是Linux的形式。
当然我们的应用程序也就可以把数据以文件的形式记录下来咯。
l 数据库(SQLite Databases)在Andriod系统中,也少不了一个数据库管理,但考虑到系统资源(内存,硬盘),选择了轻便型的数据库SQLite,这是一个开源的关系型数据库,与普通关系型数据库一样,也具有ACID的特性。
两种存储方式:主要是根据数据库共享方式来分l 程序内自用:通常我们程序中需要的数据一般都是为本程序来用,所以我们用上面三种途径来创建的程序都是默认为本程序使用,其他程序无法获取操作。
我们ADB插件功能在命令行下输入:adb shell 来进入手机的文件系统,进入CD /data/data 目录。
然后ls查看,我们发现,我们在系统中安装的每个程序在这里都有一个文件夹,再次进入我们的程序后ls查看,会出现几个目录:shared_prefs、files、databases,这几个目录其实就是存的我们程序内自用的数据,内容分别就是由上面三种途径创建的,当然如果没有创建过,这个目录可能不存在。
l 数据需要共享:这类数据通常是我们的一些共用数据,很多程序都会来调用,比如电话薄数据,就不可能存为私有的了。
当然,这种方式的话,上面三种途径中的系统配置就不适用了,“系统配置”只能由本程序访问。
也就是说,只有文件和数据库可以共享。
具体用没我们下面依次试一下:(一)系统配置这类数据存储形式是NVP形式即,name和value的映射map。
存:// 取得活动的preferences对象.SharedPreferences uiState = getPreferences(0);// 取得编辑对象SharedPreferences.Editor editor = uiState.edit();// 添加值editor.putString(KEY, value);editor.putBoolean(KEY, value);mit();//提交保存.取://取得活动的preferences对象.SharedPreferences settings = getPreferences(Activity.MODE_PRIV A TE);// 取得值.String value = settings.getString(KEY, "默认值");Boolean value = settings.getBoolean(KEY, false);存取时间:有了存取的方法后,我们就要想在什么时候来存取:protected void onPause()//系统通知暂停,可以保存设置public void onDestroy()//系统通知关闭,可以保存设置public void onCreate(Bundle savedInstanceState) //系统启动,可以打开设置同样还有其他状态,我们可以根据实际情况来处理(二)文件操作l 打开文件并可操作,如果文件不存在会自动创建:FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_PRIVA TE);//操作时,在fos里写入值即可l 读文件:FileInputStream fis = openFileInput(FILE_NAME);l 取得当前活动创建的文件列表:String[] lst =fileList()l 删除文件:super.deleteFile(FILE_NAME);(三)SQLite数据库操作数据库操作无非是建库、建表、增、删、改、查的一些常用功能。
在Android系统中封装了一个SQLiteDatabase类,用于这些操作。
l 建库创建数据库,是由SQLiteOpenHelper类自动完成,同时,创建后,会返回一个SQLiteDatabase 类:try {SQLiteOpenHelper dbHelper= new SQLiteOpenHelper(context,DBName,null,1);db = dbHelper.getWritableDatabase();} catch (SQLiteException ex) {db = dbHelper.getReadableDatabase();}其中参数DBName就是数据库的名称。
getWritableDatabase(),这方法就会获取数据库对象,如果库不存在就会新建,但这里为什么还要包一层catch呢,主要考虑到,手机的资源有限,有时空间不足了,就无法再写入数据,但这里我们可以读啊,所以在catch中调用了getReadableDatabase。
l 建表_db.execSQL(“create table tableName (id integer primary key autoincrement,name text not null);”);看到,这个建表其实跟我们写的SQL很类似,只是可能一些语法细节不同,具体这个就不写了,google一下会N多了。
l 增当然我们可以执行一条SQL语句来插入,我们也可以这样来:ContentV alues newTaskV alues = new ContentValues();// Assign values for each row.newTaskValues.put(KEY_TASK, value);newTaskValues.put(KEY_CREATION_DATE, value);// Insert the row.db.insert(DATABASE_TABLE, null, newTaskValues);我们可以将值依次放入一个Hash表中,然后直接存入。
l 删db.delete(tableName, "id=" + _rowIndex, null)输入表名,以及条件,当然,直接拼成一条标准SQL也是可以的。
l 改ContentV alues newV alue = new ContentValues();newValue.put(KEY_TASK, _task);db.update(DATABASE_TABLE, newValue, KEY_ID + "=" + _rowIndex, null 将值存于Hash表中,再直接调用l 查Cursor result =db.query(DATABASE_TABLE,new String[] { KEY_ID, KEY_TASK, KEY_CREATION_DA TE},null, 条件, null, null, null)这里,查询后返回的是一个游标,我们可以通过这游标来获取数据,使用方法跟java通用程序一样。
还有更多的用法,只有边用边再搜Google了(四)Content Providers共享数据在前面界面交互中,我们也学习到了,Android系统的界面互相调用时,传值是采用Uri的方式进行的。
表面上看,Uri不就是一个字符串吗,能传多少值啊,其实不然,在Uri中格式:(1)://(2)/(3),这第一段我们不管,这第二段,其实在系统中是可以定义到我们的Content Providers的,我们可以写一个类,比如这个用来管理电话薄信息,如:public class MyProvider extends ContentProvider {private static final String myURI ="content://com.zjf.MyProvider/items";public static final Uri CONTENT_URI = Uri.parse(myURI);…}在这里MyProvider继承了ContentProvider类,然后我们在系统中注册一下(在manifext.xml 中):<provider android:name=”MyProvider”android:authorities=” com.zjf.MyProvider”/>然后我们在传值时使用:content://com.zjf.MyProvider/1来通过这个Uri我想得到电话薄中第一个人的信息,我们分析一下,这个最后一段“1”,就是第一个记录咯,“com.zjf.MyProvider”这个就是标记我用哪一套程序来取数据,所以说,我们写的MyProvider就可以根据传入的“1”这个参数来进行数据的操作,这里你可以保存到文件中,也可以保存到数据库中,但对使用者来说是透明的,不需要知道内部细节。
这就是我们说的数据共享模型。
我们进一步看MyProvider继承处理了哪些类:@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs)@Overridepublic Uri insert(Uri uri, ContentValues values)@Overridepublic int update(Uri uri, ContentV alues values, String selection,String[] selectionArgs)看到这些大家可能就更家明白了MyProvider就是一个数据的封装,它按照统一的接口来提供共享的数据,每一个Provider就是处理一类共享数据。
当然系统中其实己经供了这样的一些Provider供我们来使用,比如:Browser记录了用户浏览记录;CallLog记录系统日志;Contacts电话薄;Settings系统设置等。