Android数据存储
本章学习内容
1.Android的SharedPreferences
2.Android的文件读写
3.Android的SQLite数据库
本章学习目标
1.了解Android数据存储方式
2.掌握SharedPreferences的使用
3.掌握文件读写的使用
4.掌握SQLite数据库的使用
1.1Android数据存储
任何应用软件都可以使用由典型桌面操作系统提供的公共文件系统来存储和读取文件,且文件可以被其他应用软件读取(存在权限控制设定)。Android中采用了一种不同的系统,其中所有的应用软件数据(包括文件)由该应用软件私有。同时,Android为应用软件提供了一种向其他应用软件开放私有数据的标准方式。Android数据存储描述了应用软件存储和获取数据、向其他应用软件开放数据、从其他应用软件请求数据并将其开放的方式,分为SharedPreferences存储、文件(Files)存储、数据库(SQLite Databases)存储和网络存储4种。
1.SharedPreferences存储
SharedPreferences是一个轻量级的键值存储机制,使用key-value方式存储基本数据类型,主要应用于保存系统配置信息。例如,在为程序界面设置颜色后再次启动时保留之前设置的颜色。Android系统的界面采用了Activity栈的形式,当系统资源不足时回收部分界面。那么,我想有些操作也需要在不活动时保留下来的,等再次激活时能够显示出来。
2.文件(Files)存储
Android操作系统中存在管理存储系统的方式,由于采用Linux核心,因此系统中的文件是Linux形式。应用程序可以将数据以文件形式记录。在Android中,Application不能读写其他Application的文件,而是通过FileInputStream和FileOutputStream操作文件。
3.数据库(SQLite Databases)存储
Android系统也不能缺少数据库管理,综合考虑系统资源因素(如内存、硬盘),Android选择轻便型的数
据库SQLite,它是一个开源的关系型数据库,与普通关系型数据库类似,也具有ACID的特性。
4.网络存储
网络存储需要与Android网络数据包打交道。
1.2Android数据存储——Preferences
SharedPreferences是Android提供的一种用于存储部分简单配置信息(如默认的欢迎语、登录用户名和密码等)的机制,以键值对方式存储,便于读取和存入。
使用SharedPreferences存储登录的用户名和密码,见示例1.1。
示例1.1
用户登录的布局文件:
android:orientation="vertical"android:layout_width="fill_parent" android:layout_height="wrap_content"> xmlns:android="https://www.wendangku.net/doc/b011480039.html,/apk/res/android" android:orientation="horizontal"android:layout_width="fill_parent" android:layout_height="fill_parent"android:layout_marginLeft="20dp" android:layout_marginRight="20dp"> android:textSize="20dp"android:layout_height="wrap_content"/> android:layout_width="fill_parent" android:layout_height="wrap_content"/> xmlns:android="https://www.wendangku.net/doc/b011480039.html,/apk/res/android" android:orientation="horizontal"android:layout_width="fill_parent" android:layout_height="fill_parent"android:layout_marginLeft="20dp" android:layout_marginRight="20dp"> android:layout_height="wrap_content"android:text="密码:" android:textSize="20dp"/> android:layout_width="fill_parent" android:layout_height="wrap_content"/> android:layout_width="fill_parent"android:layout_height="fill_parent" android:layout_marginTop="10dp">
使用SharedPreferences存储数据的Activity类:
public class SharedPreferencesActivity extends Activity implements OnClickListener{ /**Called when the activity is first created.*/
private SharedPreferences mySharedPreferences;//定义SharedPreferences对象
//定义用户的两个EditText
private EditText userName;
private EditText password;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(https://www.wendangku.net/doc/b011480039.html,yout.main);
Button btnSave=(Button)findViewById(R.id.btnSave);
//获得用户的两个EditText
userName=(EditText)findViewById(https://www.wendangku.net/doc/b011480039.html,erName);
password=(EditText)findViewById(R.id.password);
//获得一个SharedPreferences对象
mySharedPreferences=getSharedPreferences("SETTING_INFOS",0);
//取出保存的产品信息
String userNameStr=mySharedPreferences.getString("userName","");
String passwordStr=mySharedPreferences.getString("password","");
userName.setText(userNameStr);
password.setText(passwordStr);
btnSave.setOnClickListener(this);
}
@Override
public void onClick(View v){
mySharedPreferences=getSharedPreferences("SETTING_INFOS",0);
//使SharedPreferences处于编辑状态
SharedPreferences.Editor editor=mySharedPreferences.edit();
editor.putString("userName",userName.getText().toString())
.putString("password",password.getText().toString());
//使用commit方法提交修改的数据
https://www.wendangku.net/doc/b011480039.html,mit();
new AlertDialog.Builder(this).setTitle("登录成功.")
.setPositiveButton("确定",null).show();
}
}
运行示例1.1,在登录框中输入信息后登录,如图1.1.1所示。
图1.1.1用户登录
SharedPreferences会存储登录框中的数据,程序退出后重新启动,运行效果如图1.1.2所示。
图1.1.2使用SharedPreferences存储登录框中的数据
示例1.1中使用按钮的监听事件实现SharedPreferences数据存储,SharedPreferences数据存储的时间
点也可以通过以下方式存储:
protected void onPause()//系统通知暂停,可以保存设置
public void onDestroy()//系统通知关闭,可以保存设置
修改示例1.1中的onClick方法,实现效果与通过事件监听方式相同,代码如下:
@Override
protected void onStop(){
//TODO Auto-generated method stub
super.onStop();
mySharedPreferences=getSharedPreferences("SETTING_INFOS",0);
//使SharedPreferences处于编辑状态
SharedPreferences.Editor editor=mySharedPreferences.edit();
editor.putString("userName",userName.getText().toString())
.putString("password",userName.getText().toString());
//使用commit方法提交修改的数据
https://www.wendangku.net/doc/b011480039.html,mit();
}
在Eclipse中切换到DDMS视图的File Explorer标签,找到/data/data目录中对应项目下的shared_prefs 文件夹,SharedPreferences存储的数据即存放在此文件夹中,如图1.1.3所示。
图1.1.3SharedPreferences数据存储的目录
1.3Android数据存储——文件
SharedPreferences存储方式简单易行,只适合存储较简单的数据,需要存储更多的数据时可以选择文件存储方式。文件存储是一种较常用的方法,Android中读取/写入文件的方法与Java中实现I/O的程序相同,使用openFileInput()和openFileOutput()方法读取设备中的文件。
使用文件的存储方式保存搜索产品的信息,见示例1.2。
示例1.2
搜索产品的布局文件:
android:orientation="vertical"android:layout_width="fill_parent" android:layout_height="wrap_content"> xmlns:android="https://www.wendangku.net/doc/b011480039.html,/apk/res/android" android:orientation="horizontal"android:layout_width="fill_parent" android:layout_height="fill_parent"android:layout_marginLeft="20dp" android:layout_marginRight="20dp"> android:layout_height="wrap_content"android:text="产品名称:" android:textSize="20dp"/> android:layout_width="fill_parent" android:layout_height="wrap_content"/> android:layout_width="fill_parent"android:layout_height="fill_parent" android:layout_marginTop="10dp">
实现文件存储的Activity类:
public class FileActivity extends Activity implements OnClickListener{ /**Called when the activity is first created.*/
//定义产品名称的EditText
private EditText productName;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(https://www.wendangku.net/doc/b011480039.html,yout.main);
Button btnSave=(Button)findViewById(R.id.btnSave);
//获得产品的EditText
productName=(EditText)findViewById(R.id.productName);
try{
//读取文件的内容
InputStream is=openFileInput("file.txt");
byte[]buffer=new byte[100];
int byteCount=is.read(buffer);
String productNameStr=new String(buffer,0,byteCount,"utf-8");
productName.setText(productNameStr);
is.close();
}catch(Exception e){
e.printStackTrace();
}
//设置监听
btnSave.setOnClickListener(this);
}
@Override
public void onClick(View arg0){
//向文件写入内容
try{
OutputStream os=openFileOutput("file.txt",Activity.MODE_PRIVATE);
String productNameStr=productName.getText().toString();
os.write(productNameStr.getBytes("utf-8"));
os.close();
}
catch(Exception e){
e.printStackTrace();
}
new AlertDialog.Builder(this).setTitle("搜索成功.").setPositiveButton("确定",null).show();
}
}
运行示例1.2,输入产品名称“LG tv”后点击“搜索”按钮,效果如图1.1.4所示。
图1.1.4搜索产品
由于使用了文件存储搜索框中的数据,程序退出后重新启动,运行效果如图1.1.5所示。
图1.1.5使用文件存储搜索框中的数据
示例1.2中的两个方法只支持读取该应用目录下的文件,当读取非自身目录下的文件时会抛出异常。如果调用FileOutputStream时指定的文件不存在,Android会自动创建它。默认情况下,写入新内容时会覆盖原文件内容,如果需要将新写入的内容附加到原文件内容之后,可以在openFileOutput中指定其模式为Context.MODE_APPEND。openFileOutput方法打开文件的模式见表1.1.1。
表1.1.1openFileOutput方法打开文件的模式
常量说明
MODE_PRIVATE默认模式,文件只能被调用该方法的应用程序访问
MODE_APPEND如果文件已经存在,则向该文件末尾继续写入数据,而不是
覆盖
MODE_WORLD_READABLE赋予所有应用程序读取该文件的权限
MODE_WORLD_WRITEABLE赋予所有应用程序向该文件写入内容的权限
通过SharedPreferences操作的数据存储在shared_prefs文件夹中,而文件操作的数据存储在与shared_prefs同级的file文件夹中,如图1.1.6所示。
图1.1.6文件数据存储的目录
注意
默认情况下,使用openFileOutput方法创建的文件只能由其调用的应用使用,其他应用无法读取此文件。当需要在不同的应用中共享数据时,可以使用Content Provider。
1.4Android数据存储——SQLite
1.4.1SQLite简介
Android平台中集成了嵌入式的关系型数据库SQLite,它是一款开源的嵌入式数据库引擎,支持多数SQL92标准。与其他数据库相比较,SQLite非常适合作为移动存储设备的数据存储,具有以下4个特点:(1)处理速度快。传统的数据库引擎采用客户端和服务器端的访问方式,而SQLite的数据库引擎嵌入到程序中作为一部分,因此处理速度快。
(2)占用资源少。SQLite源代码总共不超过3万行,运行内存不超过250KB,无须安装部署,且支持多线程。
(3)SQLite中所有数据库信息都存放在一个文件中,SQLite支持事务,当开始一个新事务时会将整个数据库文件加锁。
(4)SQLite支持Windows、Linux等操作系统,可以采用多种语言进行操作,如Java、PHP等。
表面上,SQLite只支持NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)5种数据类型。实际上,SQLite也接受varchar(n)、char(n)、decimal(p,s)等数据类型,只是在运算或保存时会相应地转换成前面5种数据类型中的一种。SQLite的最大特点是无须考虑声明的数据类型,
能够向任何字段中保存任何类型的数据。例如,可以在Integer字段中存放字符串,或在布尔型字段中存放浮点数,以及在字符型字段中存放日期型值。但有一种情况例外,定义为INTEGER PRIMARY KEY的字段只能存储64位整数,向该字段中保存非整型的数据时会产生错误。另外,SQLite在解析CREATE TABLE语句时,会忽略CREATE TABLE语句中字段名后紧跟的数据类型信息。
1.4.2SQLite的应用
SQLite数据库功能非常强大且使用方便,一般包括创建和打开数据库、创建和操作数据库表等操作。
1.创建数据库对象
应用中需要操作数据库时,必须先获得SQLiteDatabase对象。SQLiteDatabase提供了创建和打开数据库的方法,常用方法如下:
(1)openDatabase(String path,CusorFactory factory int flags):以指定模式打开指定路径的数据库文件,使用指定的Cusor对象用于在查询中返回,如果传入为null,则使用默认模式。
(2)openOrCreateDatabase(File file path,CusorFactory factory int flags):相当于openDatabase(file.getPath(),factory,CREATE_IF_NECESSARY)。
(3)openOrCreateDatabase(String path,CusorFactory factory int flags):相当于openDatabase(path,factory,CREATE_IF_NECESSARY)。
openDatabase方法中通过参数flags指定数据库文件的打开模式,各种模式及说明见表1.6.2。
表1.1.2文件的打开模式及说明
模式名称说明
OPEN_READONLY打开数据库的方式为只读
OPEN_READWRITE打开数据库的方式为可读/可写
CREATE_IF_NECESSARY指定的数据库文件不存在时创建新的数据库
NO_LOCALIZED_COLLAORS打开数据库时不对数据进行基于本地化语言的排序
在实际应用中,可以通过创建数据库辅助类来操作数据库,此方式更加简单易行。辅助类继承自SQLiteOpenHelper类,在构造过程中调用Context的方法创建并打开指定名称的数据库对象。数据库辅助类主要重写以下两个方法:
(1)onCreate(SQLiteDatabase db):当数据库首次创建时执行该方法,一般将创建表等初始化操作放入该方法中执行。
(2)onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion):打开数据库,当传入的版本号与当前版本号不同时调用该方法。
除了以上两个方法之外,onOpen方法也经常使用,该方法会在每次打开数据库时被调用。
SQLiteOpenHelper类的基本用法是,当需要创建或打开一个数据库并活动数据库对象时,根据指定文件名创建一个辅助对象之后,调用该对象的getWritableDatabase和getReadableDatabase方法获得SQLiteDatabase对象。
2.操作数据
通常情况下,数据库操作包括增、删、改、查。SQLiteDatabase类提供了许多操作数据库的方法,包括直接使用SQL语句作为参数的方法和专用于增、删、改、查的方法。SQLiteDatabase类封装了部分操作数据库的API,使用该类可以完成数据的添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete),总称为“CRUD”。
在SQLiteDatabase中,execSQL()和rawQuery()是两个非常重要的方法。execSQL()方法可以执行insert、delete、update和CREATE TABLE等具有更改行为的SQL语句;rawQuery()方法可以执行select语句。SQLiteDatabase专门提供了对应于添加、删除、更新和查询的操作方法,分别为insert()、delete()、update()和query()。但对于熟悉SQL语法的程序员,直接使用execSQL()和rawQuery()方法执行SQL语句即可完成数据的添加、删除、更新和查询。
3.查询数据
SQLiteDatabase中提供了直接解析SQL语句的查询方法和专用于查询的方法。使用SQLiteOpenHelper 实现数据库表的查询和添加,见示例1.3。
示例1.3
调用数据库操作方法时创建数据库的辅助类:
public class DBService extends SQLiteOpenHelper{
private final static int DATABASE_VERSION=3;//定义数据库版本
private final static String DATABASE_NAME="product.db";//定义产品数据库
//定义构造方法,创建数据库
public DBService(Context context){
//当调用getWritableDatabase或getReadableDatabase方法时创建数据库
super(context,DATABASE_NAME,null,DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db){//创建数据库表
String sql="CREATE TABLE[PRODUCT]("
+"[_id]AUTOINC,"
+"[PRODUCT_NAME]VARCHAR(20)NOT NULL ON CONFLICT FAIL,"
+"[PRICE]VARCHAR(20)NOT NULL ON CONFLICT FAIL,"
+"[ADDRESS]VARCHAR(20)NOT NULL ON CONFLICT FAIL,"
+"CONSTRAINT[sqlite_autoindex_t_contacts_1]PRIMARY KEY([_id]))";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){ String sql="drop table if exists[PRODUCT]";
db.execSQL(sql);
//新的SQL语句
sql="CREATE TABLE[PRODUCT]("
+"[_id]AUTOINC,"
+"[PRODUCT_NAME]VARCHAR(20)NOT NULL ON CONFLICT FAIL,"
+"[PRICE]VARCHAR(20)NOT NULL ON CONFLICT FAIL,"
+"[ADDRESS]VARCHAR(20)NOT NULL ON CONFLICT FAIL,"
+"CONSTRAINT[sqlite_autoindex_t_contacts_1]PRIMARY KEY([_id]))";
db.execSQL(sql);
}
//执行insert、update、delete等SQL语句
public void execSQL(String sql,Object[]args){
SQLiteDatabase db=this.getWritableDatabase();
db.execSQL(sql,args);
}
//执行select语句
public Cursor query(String sql,String[]args){
SQLiteDatabase db=this.getReadableDatabase();
Cursor cursor=db.rawQuery(sql,args);
return cursor;
}
}
显示查询数据的布局文件:
android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> android:layout_width="wrap_content"android:layout_height="wrap_content" android:gravity="right"android:padding="10dp"> android:layout_width="wrap_content" android:layout_height="wrap_content"android:textSize="16dp"/> android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="100dip" android:textSize="14dp"/> android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="200dip" android:textSize="14dp"/>
实现该查询的Activity类:
import com.android.db.DBService;
public class SQLiteProActivity extends ListActivity{
public static ContactAdapter contactAdapter;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
DBService dbService=new DBService(this);
String sql="select_id,PRODUCT_NAME,PRICE,ADDRESS from PRODUCT order by_id";
//获得查询结果的Cursor对象
Cursor cursor=dbService.query(sql,null);
//显示查询的Cursor
contactAdapter=new ContactAdapter(this,cursor,true);
setListAdapter(contactAdapter);
}
public class ContactAdapter extends CursorAdapter{
private LayoutInflater layoutInflater;
private void setChildView(View view,Cursor cursor){
//获得需要显示的组件
TextView productName=(TextView)view.findViewById(R.id.productName);
TextView price=(TextView)view.findViewById(R.id.price);
TextView address=(TextView)view.findViewById(R.id.address);
//从数据库中取值赋予显示组件
productName.setText(cursor.getString(cursor.getColumnIndex("PRODUCT_NAME")));
price.setText(cursor.getString(cursor.getColumnIndex("PRICE")));
address.setText(cursor.getString(cursor.getColumnIndex("ADDRESS")));
}
@Override
public void bindView(View view,Context context,Cursor cursor){
setChildView(view,cursor);
}
@Override
public View newView(Context context,Cursor cursor,ViewGroup parent){
View view=layoutInflater.inflate(https://www.wendangku.net/doc/b011480039.html,yout.main,null);
setChildView(view,cursor);
return view;
}
public ContactAdapter(Context context,Cursor c,boolean autoRequery){
super(context,c,autoRequery);
//获得线性布局
layoutInflater=(LayoutInflater) context.getSystemService(https://www.wendangku.net/doc/b011480039.html,YOUT_INFLATER_SERVICE);
}
}
}
运行示例1.3,使用SQLite查询数据库中的数据,结果如图1.1.7所示。
图1.1.7使用SQLite查询数据库中的数据
图1.1.7中显示了数据库表中已存在的数据,需要向数据库表中增加数据时,可以在Activity类的查询前添加以下代码:
//添加数据
String addSql="insert into PRODUCT(PRODUCT_NAME,PRICE,ADDRESS)values(?,?,?)"; Object[]args=new Object[]{"Android2.2","4000","北京"};
dbService.execSQL(addSql,args);
重新运行该应用,效果如图1.1.8所示。
图1.1.8使用SQLite添加数据
与其他数据存储方式类似,SQLite的数据库文件存储在data/data/package-name/databases目录下,从Eclipse切换到DDMS视图的File Explorer标签,找到/data/data目录中对应项目下的databases文件夹,SQLite的数据库文件即存储在此文件夹中,如图1.1.9所示。
图1.1.9SQLite的数据库文件存储位置
1.5Android数据存储——Network
Android可以通过网络获取并保存数据信息,由于信息来自网络,因此需要保持网络的连接状态。
使用Android的Network实现网络文件数据的获取。搭建Web应用,先在Tomcat的Root目录下创建Network.txt文件并在其中编辑信息,启动Tomcat服务器后,通过http://localhost:8989/Network.txt访问Web信息,效果如图1.1.10所示。
图1.1.10Web中的网络资源
示例1.4
使用Android获得网络资源信息的Activity:
public class NetworkActivity extends Activity{
/**Called when the activity is first created.*/
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(https://www.wendangku.net/doc/b011480039.html,yout.main);
TextView myTextView=new TextView(this);
String myText="";
try{
//定义Web访问地址
URL uri=new URL("http://192.168.0.122:8989/Network.txt");
//打开URL链接
URLConnection conn=uri.openConnection();
System.out.println("conn:"+conn);
//从链接中获得InputStream
InputStream input=conn.getInputStream();
//读取页面信息
BufferedInputStream bInput=new BufferedInputStream(input);
ByteArrayBuffer baBuffer=new ByteArrayBuffer(100);
int current=0;
while((current=bInput.read())!=-1){
baBuffer.append((byte)current);
}
myText=new String(baBuffer.toByteArray());
}catch(Exception e){
e.printStackTrace();
}
myTextView.setText(myText);
this.setContentView(myTextView);
}
}
运行示例1.4,使用Android读取网络信息,效果如图1.1.11所示。
图1.1.11使用Android读取网络信息
注意:
由于Android访问的是外包网络资源,因此需要在AndroidManifest.xml文件中赋予权限,代码如下:
Android数据存储的方式包括SharedPreferences存储、文件存储、SQLite数据库存储和网络存储。 SharedPreferences存储方式用于存储简单的配置信息。
文件(Files)存储方式使用文件I/O,可以直接向手机中存储数据。
Android平台中集成了嵌入式的关系型数据库SQLite,它是一款开源的嵌入式数据库引擎,支持多数SQL92标准,SQLite非常适合作为移动存储设备的数据存储。
网络存储需要与Android网络数据包打交道,必须保持网络的连接状态。
android将数据存储到文件和从文件中读取字符串 1.读取数据(filename是读取文件的名称,reads是返回读取的字符串) private String readFile(String filename) { try { FileInputStream fis = this.openFileInput(filename); byte[] b = new byte[1024]; ByteArrayOutputStream baos = new ByteArrayOutputStream(); while (fis.read(b) != -1) { baos.write(b, 0, b.length); } baos.close(); fis.close(); reads = baos.toString(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return reads; } 2.写入保存(str是要存入的字符串,filename是保存文件的名称) private void saveFile(String str, String filename) { FileOutputStream fos; try { fos = this.openFileOutput(filename, Activity.MODE_PRIVATE); fos.write(str.getBytes()); fos.flush(); fos.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace();
GDOU-B-11-112广东海洋大学学生实验报告书(学生用表)实验名称实验6:数据存储与访问课程名称移动编程课程号16242215x0学院(系) 数学与计算机专业计算机科学与技术班级计科1141班学生姓名学号实验地点科技楼425 实验日期2017.4.1 一、实验目的 1.熟悉在Android Studio开发环境下编写Android应用程序的流程; 2.理解在Android Studio开发环境下进行用户界面设计的基本方法; 3.掌握应用Android碎片控件Fragment开发适用于大屏幕的应用程序的方法。 4.掌握应用Android存储方法SharePreferences的应用方法。 二、实验内容 在Android Studio开发环境下,使用Android的Fragment碎片控件、TextView文本标签控件、ListView列表控件、FrameLayout框架布局控件,利用SharePreferences存储方法,采用双页显示模式实现一个适用于大屏幕设备的简易新闻阅读器应用程序。 三、实验设备 Android Studio 四、实验结果 用户界面布局设计采用了水平线性布局方式,分为左右两个碎片Fragment;其中,左侧为新闻标题列表子界面,右侧为新闻详细内容子界面。当点击新闻标题列表中的某一标题时,右侧的Fragment将显示相应新闻标题的详细内容。
五、源代码 主Activity的布局文件activity_main.xml的源代码
南昌航空大学实验报告 二0一4 年11 月14 日 课程名称:Android 实验名称:Android数据存储和数据访问 班级:姓名:同组人: 指导教师评定:签名: 一:实验目的 掌握SharedPreferences的使用方法; 掌握各种文件存储的区别与适用情况; 了解SQLite数据库的特点和体系结构; 掌握SQLite数据库的建立和操作方法; 理解ContentProvider的用途和原理; 掌握ContentProvider的创建与使用方法 二:实验工具 Eclipse(MyEclipse)+ ADT + Android2.2 SDK; 三:实验题目 1.应用程序一般允许用户自己定义配置信息,如界面背景颜色、字体大小和字体颜色等,尝试使用SharedPreferences保存用户的自定义配置信息,并在程序启动时自动加载这些自定义的配置信息。 2.尝试把第1题的用户自己定义配置信息,以INI文件的形式保存在内部存储器上。 3.使用代码建库的方式,创建名为test.db的数据库,并建立staff数据表,表内的属性值如下表所示:
4.建立一个ContentProvider,用来共享第3题所建立的数据库; 四:实验代码 Internal public class Internal extends Activity { private final String = ""; private TextView labelView; private TextView displayView; private CheckBox appendBox ; private EditText entryText; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.wendangku.net/doc/b011480039.html,yout.main); labelView = (TextView)findViewById(https://www.wendangku.net/doc/b011480039.html,bel); displayView = (TextView)findViewById(R.id.display); appendBox = (CheckBox)findViewById(R.id.append); entryText = (EditText)findViewById(R.id.entry); Button writeButton = (Button)findViewById(R.id.write); Button readButton = (Button)findViewById(R.id.read); writeButton.setOnClickListener(writeButtonListener); readButton.setOnClickListener(readButtonListener); entryText.selectAll(); entryText.findFocus(); } OnClickListener writeButtonListener = new OnClickListener() { @Override public void onClick(View v) {
Android数据存储五种方式总结 本文介绍Android平台进行数据存储的五大方式,分别如下: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 5 网络存储数据 下面详细讲解这五种方式的特点 第一种:使用SharedPreferences存储数据 适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。比如应用 程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),解锁口令密码等 核心原理:保存基于XML文件存储的key-value键值对数据,通常用来存储一些简单的配置信息。通过DDMS的File Explorer面板,展开文件浏览树,很明显SharedPreferences数据总是存储在/data/data/
Android中5种数据存储方式 1概述 SharedPreferences存储数据。 ContentProvider存储 文件存储 SQLlite存储 网络存储 Preference,File,DataBase这三种方式分别对应的目录是: ●/data/data/Package Name/Shared_Pref ●/data/data/Package Name/files ●/data/data/Package Name/database 关于这五种数据存储方式,根据实际情况选择最合适的,秉持最简单原则,也就是说能用简单的方式处理,就不要用复杂的方式。比如存储几个数据或简单对象,用SharedPreference也能做到,就没必要写个ContentProvider。 ●简单数据和配置信息,SharedPreference是首选; ●如果SharedPreferences不够用,那么就创建一个数据库; ●结构化数据,一定要创建数据库,虽然这稍显烦锁,但是好处无穷; ●文件就是用来存储文件(也即非配置信息或结构化数据),如文本文件,二进制文件,PC文件, 多媒体文件,下载的文件等等; ●尽量不要创建文件; ●如果创建文件,如果是私密文件或是重要文件,就存储在内部存储,否则放到外部存储。
2SharedPreferences存储数据 SharedPreferences 可以将数据保存到应用程序的私有存储区,这些存储区中的数据只能被写入这些数据的软件读取。 它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。 其存储位置在/data/data/<包名>/shared_prefs 目录下。 使用SharedPreferences是有些限制的:只能在同一个包内使用,不能在不同的包之间使用。 例如:登录用户的用户名与密码。 步骤如下: (1)使用Activity类的getSharedPreference 方法获得SharePreferences对象。其中存储key-value 的文件名称由getSharedPreferences方法的第一个参数指定;第二个参数表示所创建的数据文件的访问权限(“MODE_WORLD_READABLE”表示其他用户有“读”的权限; “MODE_WORLD_WRITEABLE ” 表示其他用户有“写”权限;MODE_PRIVATE 和 MODE_APPEND创建的文件对其他用户都是不可访问的); (2)使用SharedPreferences 接口的edit 获得SharedPreferences.Editor对象; (3)通过Sharedreferences.Editor接口的putXxx方法保存key-value对。其中Xxx表示value 不同数据类型。例如,Boolean类型的value需要用putBoolean方法,字符串类型的value需要用putString方法; (4)通过Sharedreferences.Editor接口的commit方法保存key-value对。commit方法相当于数据库事务中的提交(commit)操作,只有在事务结束后进行提交,才会将数据真正保存在数据库中。保存key-value也是一样,在使用putXxx方法指定了key-value对后,必须调用commit方法才能将key-value对真正保存在相应的文件中。
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 实体类的创建 @Entity public class ArticleFile { @Id private 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; }
SharedPreferences: Activity之间的数据传递除了通过intent来传递外,还可以使用SharedPreferences来共享数据。 SharedPreferences是一种轻量级数据存储方式,能够实现不同应用程序间数据共享。 SharedPreferences使用键值对(Key-Value)的方式把简单数据类型(boolean、int、float、long和String)存储在应用程序的私有目录下自己定义的xml文件中。 私有目录是:/data/data/应用程序包名/shared_prefs/ SharedPreferences编程: (1)写入数据: //获得SharedPreferences对象(如果不存在则新建) SharedPreferences sp = getSharedPreferences(名称,访问模式); //名称是:SharedPreferences数据保存的XML文件名 //获得可编辑对象 SharedPreferences.Editor editor = sp.edit(); editor.putString(“Name”,”abc”); //p ut方法写数据(key-value) //一定要提交才能保存 https://www.wendangku.net/doc/b011480039.html,mit(); (2)读取数据:
//获得SharedPreferences对象(如果不存在则新建) SharedPreferences sp = getSharedPreferences(名称, 访问模式); String name = sp.getString("Name", "DefaultVal"); //get方法读数据//第2个参数:在无法获取值的时候使用的缺省值 SharedPreferences支持的三种访问模式: ?MODE_PRIVATE (=0,私有):仅创建SharedPreferences的程序有 权限对其进行读取或写入。 ?MODE_WORLD_READABLE (=1,全局读):创建程序可以对其进 行读取或写入,其它应用程序只具有读取操作的权限,但没有写入操作的权限。 ?MODE_WORLD_WRITEABLE (=2,全局写):所有程序都可以对其 进行写入操作,但没有读取操作的权限。 SQLite数据库: Android 在运行时(run-time)集成了SQLite,所以每个Android 应用程序都可以使用SQLite 数据库。 SQLite特点: ?SQLite是一款开源的、轻量级的、嵌入式的、关系型数据库。 ?普通数据库的管理系统比较庞大和复杂,会占用了较多的系统 资源,轻量级数据库SQLite的特点:
在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 数据需要共享: 这类数据通常是我们的一些共用数据,很多程序都会来调用,比如电话薄数据,就不可能存为私有的了。当然,这种方式的话,上面三种途径中的系统配置就不适用了,“系统配置”
【sharePreferences】共享参数: 概念:SharedPreferences是Android系统提供的一个通用的数据持久化框架, 用于存储和读取key-value类型的原始基本数据类型对,目前支持String、int、long、float、boolean等基本类型的存储,对于自定义的对象数据类型,无法 使用SharedPreferences来存储。 他通常以xml文件方式存储在data文件夹中,文件存储路径: /data/data/{appPackageName}/shared_prefs/{filename} SharedPreferences主要用于存储系统的配置信息。例如上次登录的用户名, 上次最后设置的配置信息(如:是否打开音效、是否使用振动,小游戏的玩家 积分等)。当再次启动程序后依然保持原有设置。SharedPreferences用键值对方式存储,方便写入和读取。 注:SharePreferenced本身的对象不能对数据进行存储和修改,只能获取到数据,是通过Editor的实例化对象对数据进行存储和修改。 常用方法 1.Context.getSharedPreferences(String, int mode) mode的属性值有: Context.MODE_PRIVATE:指定该SharedPreferences的数据只能 被本应用程序读、写 Context.MODE_APPEND:新内容追加到原内容后 Context.MODE_WORLD_READABLE: 指定 SharedPreferences数据 能被其他应用程序读,但是不支持写 Context.MODE_WORLD_WRITEABLE: 指定 SharedPreferences数据 能被其他应用程序读、写会覆盖原数据; 可以使用"+"连接这些权限 2.contains(String key) 3.Map
1. sharedPreferences 类似于存储window下的配置文件(.ini),sharedPreferences中存储的信息都是以键值对的形式存储 用sharedPreferences存储信息只能是基础数据类型 如: int/float/string/stringSet/Long/boolean SharedPreferences生成的存储文件路径:(默认保存名字为当前Activity.xml) data/data/包名/shared_prefs/Activity.xml 2. 利用SharedPreferred进行数据存储步骤: 向SharedPreferred中写入数据 1)获得SharedPreferences.Editor对象SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit(); 2)利用editor对象的putXX方法向editor中以键值对的形式存储信息(注意:存储基本数据类型数据) editor.putString("键名", 值); editor.putString("password", password.getText().toString()); 3)当editor信息存储完成后,提交,此时会在对应文件夹下生产.xml文件(用此种方式生产的xml文件名默认是 Activity.xml) https://www.wendangku.net/doc/b011480039.html,mit();-生成.xml文件 读取SharedPreferred中数据 1)获得SharedPreferred对象 SharedPreferences sp = getPreferences(MODE_PRIVATE); 2)通过SharedPreferred的对象的getXX(“键名”,默认值)的方法可以取出存在.xml文件中的对应信息
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()方法来提交要保存的新值。 使用SharedPreferences对象的诸如getBoolean()和getString()等方法来读取被保存的值。 以下示例代码保存了计算器的静音按键模式偏好: public class Calc extends Activity{ public static final String PREFS_NAME ="MyPrefsFile"; @Override protected void onCreate(Bundle state){ super.onCreate(state); ... // Restore preferences SharedPreferences settings = getSharedPreferences(PREFS_NAME,0); boolean silent = settings.getBoolean("silentMode",false);
第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,位置如下 第二个参数表示权限,控制所写的配置文件是否能由其他的程序所读取或修改 例:对前例所开发的记事本程序进行界面颜色的设定。包括:文本框的颜色、按钮的颜色等,并持久化保持到文件中,下次打开程序,能够读取到上次设定。
一、实验名称:实验9 Android数据存储和IO 二、实验日期: 三、实验目的: 1、了解SharedPreferences的存储数据的格式及位置,能够读写其他应用程序的SharedPreferences。 2、File存储数据 3、掌握SQLite存储数据方法。 4、会使用SQLiteOpenHelper辅助类,进行操作数据库。 四、实验用的仪器和材料:Windows+Eclipse+jdk+sdk+adt 五、实验的步骤和方法: 1、读写其他应用程序SharedPreferences。 Week09_01_01Activity.java package https://www.wendangku.net/doc/b011480039.html,b01_01; import https://www.wendangku.net/doc/b011480039.html,b01.R; import android.app.Activity; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.widget.TextView;
public class Week09_01_01Activity extends Activity { SharedPreferences preferences; TextView show; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.wendangku.net/doc/b011480039.html,yout.main); show=(TextView)findViewById(R.id.show); preferences = getSharedPreferences("count", MODE_WORLD_READABLE); //读取SharedPreferences里的count数据 int count = preferences.getInt("count" , 0); //显示程序以前使用的次数 show.setText("程序以前被使用了"+count+"次。"); Editor editor = preferences.edit(); //存入数据 editor.putInt("count" , ++count); //提交修改 https://www.wendangku.net/doc/b011480039.html,mit(); } } Week09_01_02Activity.java
Android提供了5种方式存储数据: --使用SharedPreferences存储数据; --文件存储数据; --SQLite数据库存储数据; --使用ContentProvider存储数据; --网络存储数据; 一:使用SharedPreferences存储数据 首先说明SharedPreferences存储方式,它是Android提供的用来存储一些简单配置信息的一种机制, 例如:登录用户的用户名与密码。其采用了Map数据结构来存储数据,以键值的方式存储,可以简单的读取与写入,具体实例如下: voidReadSharedPreferences(){ String strName,strPassword; SharedPreferences user = getSharedPreferences(“user_info”,0); strName = user.getString(“NAME”,””); strPassword = user getString(“PASSWORD”,””); } voidWriteSharedPreferences(String strName,StringstrPassword){ SharedPreferences user = getSharedPreferences(“user_info”,0); uer.edit(); user.putString(“NAME”, strName); user.putString(“PASSWORD”,strPassword); https://www.wendangku.net/doc/b011480039.html,mit();
} 数据读取与写入的方法都非常简单,只是在写入的时候有些区别: 先调用edit()使其处于编辑状态,然后才能修改数据,最后使用commit()提交修改的数据。 实际上SharedPreferences是采用了XML格式将数据存储到设备中,在DDMS中的File Explorer中的/data/data/
获取android文件系统的信息,需要Environment类和StatFs类的支持。 (1)Environment 是一个提供访问环境变量的类,常用的方法有: A,getDataDirectory() ,返回File ,获取Android 数据目录。 B,getDownloadCacheDirectory(),返回File ,获取Android 下载/缓存内容目录。 C,getExternalStorageDirectory() ,返回File ,获取外部存储目录即SDCard。 D,getExternalStorageState() ,返回File,获取外部存储设备的当前状态。 E,getRootDirectory() ,返回File,获取Android 的根目录。 常用的变量,以getExternalStorageState返回值为例: A,MEDIA_BAD_REMOVAL,表明SDCard 被卸载前己被移除。 B,MEDIA_CHECKING,表明对象正在磁盘检查。 C,MEDIA_MOUNTED,表明对象存在并具有读/写权限。 D,MEDIA_MOUNTED_READ_ONLY,表明对象权限为只读。 E,MEDIA_NOFS,表明对象为空白或正在使用不受支持的文件系统。 F,MEDIA_REMOVED,不存在SDCard。 G,MEDIA_SHARED,表明存储媒体正在通过USB共享。 H,MEDIA_UNMOUNTABLE,表明存储媒体无法挂载。 I, MEDIA_UNMOUNTED,表明存储媒体没有挂载。 (2)StatFs类,一个模拟linux的df命令的一个类,获得SD卡和手机内存的使用情况。StatFs 常用方法: A,getAvailableBlocks(),返回Int,获取当前可用的存储空间。 B,getBlockCount(),返回Int,获取该区域可用的文件系统数。 C,getBlockSize(),返回Int ,大小,以字节为单位 D,getFreeBlocks(),返回Int ,该块区域剩余的空间。 (3)一个获取系统和SD卡可用容量及总总量的实例,获取容量函数如下: [java] 01.i m p o r t a n d r o i d.o s.E n v i r o n m e n t; 02.i m p o r t a n d r o i d.o s.S t a t F s; 03.i m p o r t j a v a.i o.F i l e; 04.p u b l i c l o n g g e t A v a i l a b l e I n t e r n a l M e m o r y S i z e(){ 05.F i l e p a t h=E n v i r o n m e n t.g e t D a t a D i r e c t o r y();//获取数据目录 06.S t a t F s s t a t=n e w S t a t F s(p a t h.g e t P a t h()); 07.l o n g b l o c k S i z e=s t a t.g e t B l o c k S i z e(); 08.l o n g a v a i l a b l e B l o c k s=s t a t.g e t A v a i l a b l e B l o c k s(); 09.r e t u r n a v a i l a b l e B l o c k s*b l o c k S i z e; 10.} 11. 12.p u b l i c l o n g g e t T o t a l I n t e r n a l M e m o r y S i z e(){ 13.F i l e p a t h=E n v i r o n m e n t.g e t D a t a D i r e c t o r y(); 14.S t a t F s s t a t=n e w S t a t F s(p a t h.g e t P a t h()); 15.l o n g b l o c k S i z e=s t a t.g e t B l o c k S i z e(); 16.l o n g t o t a l B l o c k s=s t a t.g e t B l o c k C o u n t(); 17.r e t u r n t o t a l B l o c k s*b l o c k S i z e; 18.} 19.无法加载插件。
很多时候我们的软件需要对处理后的数据进行存储或再次访问。Android为数据存储提供了多种方式,分别有如下几种: ●文件 ●SharedPreferences ●SQLite数据库 ●内容提供者(Content provider) ●网络 使用文件进行数据存储 首先给大家介绍使用文件如何对数据进行存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。public class FileActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { ... FileOutputStream outStream = this.openFileOutput("itcast.txt", Context.MODE_PRIVATE); outStream.write("传智播客".getBytes()); outStream.close(); } } openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data/