Android数据存储三剑客——SharedPreferences、File、SQLite
Android中常用的数据存储一般有三种方式:SharedPreferences、文件和SQLite数据库,用来保存需要长时间保存的数据。本文将通过几个具体的小实例来讲解这三种方式的具体实现。
数据存储之SharedPreferences:
SharedPreferences位于android.content包中,用于存储少量简单数据。其特点有:
1. 轻型的数据存储方式
2. 基于xml文件的存储方式,以 键/值 对的形式存储数据
3. 存储简单的配置信息,支持的存储类型有:Boolean、Float、Integer、Long、String等。
SharedPreferences存储数据流程:
1. 获取SharedPreferences对象:
private SharedPreferences prefs;
① //不指定存储文件名,使用默认的名称,即活动的类名称
prefs = getPreferences(MODE_PRIVATE);
② /*
*如果文件中的数据是Android应用程序中各个活动之间的共享数据,
*每个活动都能访问,需要使用如下方式,获取SharedPreferences:
* prefs = getSharedPreferences(“myPrefs”,MODE_PRIVATE);
*/
③ //也可以使用PreferenceManager
//PreferenceManager.setDefaultValues(this,R.xml.preferences,false);
//prefs = PreferenceManager.getDefaultPreferenceManagers(this);
2. 存储数据(使用Editor对象,保存key-value值),读取数据:
Editor editor = prefs.edit();
//存储各种类型的数据
editor.putString(“name”,”Zhangsan”);
editor.putInt(“age”,18);
editor.putLong(“time”,System.currentTimeMillis);
//读取数据
String name = prefs.getString(“name”);
int age = prefs.getInt(“age“);
3. 提交设置的数据,使数据保存到文件中:
在第2步中使用editor对象设置好key-value值后,数据并未保存到文件中,要保存还需提交
editor.commit();
4. 删除保存的数据:
SharedPreferences.Clear();
说了这么多,可能还是有些朋友说SharedPreferences到底是个什么东东,下面个大家看看就明白了:
图1. SharedPreferences存储文件的内容

这下知道了吧,<string name=”user”>Zhangsan</string>就是用editor.putString(“user”,”Zhangsan”)设置的内容。使用DDMS可查看该文件位置,该文件存放在:
图2. SharedPreferences文件位置

数据存储之文件(File)存储
使用SharedPreferences存储文件比较方便简单,但不能指定存储文件的位置,存储的内容也很少,使用文件存储既可存储到应用程序默认的放置文件的位置,也可存储到外部存储设备中,如外置SD卡中,可以减少占用手机内存,可以存储比较大的文件。
文件的操作模式:
表1. 文件操作模式及说明
|
常量值 |
说明 |
|
MODE_PRIVATE |
文件只能让创建的应用程序访问 |
|
MODE_WORLD_WRITEABLE |
文件可让其他应用程序写入 |
|
MOED_WORLD_READABLE |
文件可让其他应用程序读取 |
|
MODE_APPEND |
文件若已存在,则在文件末尾写入数据,不覆盖原来文件内容 |
使用文件存储的步骤:
1. 写入文件
//以字符流的形式写数据到文件
FileOutputStream out = openFileOutput(“out.txt”,MODE_PRIVATE);
String data = “123456abcdef”;
out.write(data); //写数据到文件
out.close(); //关闭文件输出流
/*
* 也可使用OutputStreamWriter以字节流的形式写入文件
* OutputStreamWriter writer = new OutputStreamWriter(out);
* writer.write(data);
* writer.flush(); //输出流数据
* writer.close(); //关闭流
*/
2. 读取文件
FileInputStream fis = openFileInput("input.txt");
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len=fis.read(buffer))!=-1) {
out.write(buffer,o,len);
}
数据存储之SQLite
Android使用SQLite数据库引擎,它是包含的、事务型的数据库引擎,无需单独的服务线程。SQLite数据库资源占用少、开源、功能强大,有以下特点:
1. 轻量级,使用一个动态库,单个文件
2. 独立性,没有依赖,无需安装
3. 隔离性,数据全在一个文件夹中
4. 跨平台,支持多种操作系统
5. 多语言接口,支持众多编程语言
6. 安全性,支持事务处理。
7. 独占性,使用共享锁实现独立事务处理,多个进程可同一时间从同意数据库读数据,但只有一个进程可写数据。
SQLite支持的数据类型有:NULL、INTEGER、REAL、TEXT、BLOB类型。
SQLite存储数据流程:
1. 获取SQLiteDatabase数据库对象
SQLiteDatabase db = openOrCreateDatabase(“user.db”,MODE_PRIVATE,null);
2. 执行增删查改的数据操作语句
//创建一张表
db.execSQL(“create table if not exists contacts_tb(_id integer primary key autoincrement,name text not null,age integer not null)”);
//往数据库里插入一条数据
db.execSQL(“insert into contacts_tb(name,age)values(‘abc’,20)”);
db.execSQL(“insert into contacts_tb(name,age)values(‘cde’,18)”);
//查询所有的数据,返回一个游标对象
Cursor cursor = db.raw(“select * from contacts_tb”,null);
/*
* 也可使用ContentValues执行SQL操作
* ContentValues values = new ContentValues();
* values.put(“name”,”aaa”);
* values.put(“age”,20);
* db.insert(“contacts_tb”,null,values); //插入数据
* values.clear();
* values.put(“age”,18);
* //更新_id>2的数据项的属性值
* db.update(“contactes_tb”,values,”_id>?”,new String[]{“2”});
* //删除名字中含有’a’的项
* db.delete(“contacts_tb”,”name like ?”,new String[]{“%a%”});
* //查询_id>0的项,按名字排序
* Cursor cursor = db.query(“contacts_tb”,null,”_id>?”,new String[]{“0”},null,null,name);
*/
/*
* 使用SQLiteOpenHelper对象创建和管理数据库
* 新建一个类DBOHelper extends SQLiteOpenHelper
* @override onCreate,onUpdate方法
* 使用DBOHelper对象
* DBOHelper helper = new DBOHelper(this,”user.db”);
* //创建或打开只读数据库
* SQLiteDatabase db = helper.getWriteableDatabase();
* //SQLiteDatabase db = helper.getReadableDatabase();
* 数据的操作和上边都一样
*/
3.处理获取的结果
String name[10] ;
int age[10];
int i=0;
while(cursor.moveToNext()){
name[i] = cursor.getString(cursor.getColumnIndex(“name”));
age[i] = cursor.getInt(cursor.getColumnIndex(“age”));
i++;
}
cursor.close(); //需手动关闭,否则会出现未知的异常
db.close(); //数据库对象也要手动关闭
下面来个具体的实例,简单实现下SQLite的数据存储,用到了ListView数据绑定:
DBHelper.java文件
public class DBHelper extends SQLiteOpenHelper{ public DBHelper(Context context, String name) {
super(context, name, null, 1);
} @Override
public void onCreate(SQLiteDatabase db) { } @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
} Contact.java文件
public class Contact extends Activity{ private ListView lists;
SimpleAdapter adapter;
List<Map<String, Object>> dataList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_contacts); lists = (ListView) findViewById(R.id.contacts_list);
All_Contacts(); } public void All_Contacts(){
dataList = new ArrayList<Map<String,Object>>();
adapter = new SimpleAdapter(Contact.this, dataList, R.layout.layout_contacts, new String[]{"_id","name","sex","phone" }, new int[]{R.id._id,R.id._name,R.id._sex,R.id._phone}); DBHelper dbHelper = new DBHelper(Contact.this, "Contacts.db");
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.rawQuery("select * from tb_persons", null);
cursor.moveToFirst(); do { Map<String, Object> map = new HashMap<String, Object>();
map.put("_id", cursor.getInt(cursor.getColumnIndex("_id")));
map.put("name", cursor.getString(cursor.getColumnIndex("name")));
map.put("sex", cursor.getString(cursor.getColumnIndex("sex")));
map.put("phone", cursor.getString(cursor.getColumnIndex("phone")));
dataList.add(map); }while(cursor.moveToNext()); cursor.close();
db.close(); lists.setAdapter(adapter);
}
} MainActivity.java文件
public class MainActivity extends Activity { private Button btn_Add;
private Button btn_OK;
private Button btn_Cancel; private EditText nameText;
private EditText sexText;
private EditText phoneText; private LinearLayout info_Layout;
private SQLiteDatabase db; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); btn_Add = (Button) findViewById(R.id.btn_add);
btn_OK = (Button) findViewById(R.id.btn_OK);
btn_Cancel = (Button) findViewById(R.id.btn_Cancel); nameText = (EditText) findViewById(R.id.name);
sexText = (EditText) findViewById(R.id.sex);
phoneText = (EditText) findViewById(R.id.phone); info_Layout = (LinearLayout) findViewById(R.id.info_form); DBHandler();
}
//辅助方法,打开添加联系人信息区域
public void add_Contact(View v){
info_Layout.setVisibility(View.VISIBLE);
btn_Add.setEnabled(false);
}
//跳转到查询所有联系人页面
public void search_All(View v){
Intent intent = new Intent(MainActivity.this, Contact.class);
startActivity(intent);
}
//添加联系人信息区域
public void insert_Info(View v){ long id =0 ; String name = nameText.getText().toString().trim();
String sex = sexText.getText().toString().trim();
String phone = phoneText.getText().toString().trim(); ContentValues values = new ContentValues();
values.put("name", name);
values.put("sex", sex);
values.put("phone", phone); db = openOrCreateDatabase("Contacts.db", MODE_PRIVATE, null); id = db.insert("tb_persons", null, values);
values.clear();
db.close(); nameText.setText("");
sexText.setText("");
phoneText.setText(""); info_Layout.setVisibility(View.INVISIBLE);
btn_Add.setEnabled(true);
if (id==-1) {
Toast.makeText(this, "联系人添加失败!", Toast.LENGTH_SHORT).show();
return ;
}
Toast.makeText(this, "联系人添加成功!", Toast.LENGTH_SHORT).show();
}
//清空添加信息框
public void cancel_Info(View v){
nameText.setText("");
sexText.setText("");
phoneText.setText(""); info_Layout.setVisibility(View.INVISIBLE);
btn_Add.setEnabled(true);
Toast.makeText(this, "已取消添加!", Toast.LENGTH_SHORT).show();
} //创建联系人数据库
private void DBHandler(){
//创建应用程序的数据库
db = openOrCreateDatabase("Contacts.db", MODE_PRIVATE, null);
db.execSQL("create table if not exists tb_persons(_id integer primary key autoincrement,name text not null,sex text not null,phone text not null)");
}
}
应用程序结构图以及程序的运行效果:

以上就是三种方式的原理,代码比较凌乱,有空再好好梳理下!相信分享的力量,坚持就是胜利!
Android数据存储三剑客——SharedPreferences、File、SQLite的更多相关文章
- Android数据存储-通过SharedPreferences实现记住密码的操作
在Android中登陆中,为了实现用户的方便,往往需要根据用户的需要进行记住密码的操作,所以,在Android数据存储中SharedPreferences恰恰可以实现这一点 下面,小编将带领大家通过S ...
- Android数据存储方式--SharedPreferences
Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ...
- Android 数据存储之 SharedPreferences储存
------------------------------------------SharedPreferences存储--------------------------------------- ...
- android数据存储之SharedPreferences
一.SharedPreferences简介 (1)SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity状态,Activ ...
- Android数据存储之SharedPreferences存储
安卓系统为应用提供了系统级的配置存储方案,它就是靠SharedPreferences接口来实现的,该接口存储的所有信息都是以名值对的形式保存,但其保存的数据类型也仅限于基本数据类型,如字符串.整形.布 ...
- Android数据存储之sharedpreferences与Content Provider
android中对数据操作包含有: file, sqlite3, Preferences, ContectResolver与ContentProvider前三种数据操作方式都只是针对本应用内数据,程序 ...
- Android数据存储(三)——SQLite
如果需要一个更加健壮的数据存储机制,则需要使用一个关系型数据库,在Android上,则为SQLlite. SQLite的特点:轻量级.嵌入式的.关系型数据库.可移植性好,易使用,小,高效且可靠,与使用 ...
- Android数据存储之SharedPreferences使用
SharedPreferences是Android中一种轻型的数据存储类.本质上是基于XML文件进行存储Key-Value键值对的数据,生成的XML文件的目录在/data/data/包名/Shared ...
- Android数据存储之SharedPreferences及如何安全存储
前言: 最近一直在学习ios的数据存储,当学习到NSUserDefaults的时候让我回想起了SharedPreferences,今天闲来无事,想着总结一下SharedPreferences的使用. ...
随机推荐
- Windows消息传递机制具体解释
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka Windows是一个消息(Message)驱动系统.Windows的消息提供了应用程序之间.应 ...
- Com原理及應用——Com對象和接口
1.COM对象的理解 COM对象类似于C++语言中类的概念,类的每个实例代表一个COM对象,它也包括属性(即状态)和方法(即操作),状态反映对象的存在,方法就是接口. 2.COM对象的标识-CLSID ...
- Java经典23种设计模式之结构型模式(一)
结构型模式包含7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式事实上非常easy.就像手 ...
- 两台Linux机之间传送文件
最近实验室里接管了一台服务器,经常需要用到服务器与自己主机之间进行文件传输,因此,在此介绍一下两台Linux主机之间的一些操作,方便后来者. 1. Linux.Windows主机远程访问Linux服务 ...
- 使用CSS为内容设定特定的鼠标样式(cursor)介绍
相信大家都知道我们的鼠标在网页中不同的元素中有不同的显示(例如 a 元素就显示为“箭头指针”),但是其实我们还可以自定义这些有趣的东西哦!今天“畅想资源”就来教大家如何使用CSS为内容设定特定的鼠标样 ...
- ado.net(1)
connection对象处于最顶层,是所有数据请求的关口 数据库连接过程 SqlConnection theConnection = new SqlConnection(); //创建一个connec ...
- HTML5摇一摇
方式一 (function(){ /** * 摇一摇 * @author rubekid */ function Shake(options){ this.init(options); } Shake ...
- file控件change事件触发问题
最近,项目中需要用到一个图片上传的功能,我用的file控件来选取图片文件,然后利用js读取文件来预览图片,最后再根据用户的操作来决定是否上传文件. 其中碰到了一个奇怪的问题:在选取完第一张图片,并上传 ...
- Ecstore获取dbschema内容?
有时候在使用dbschema的时候,需要获取dbschema的结构.例如: 那么,我们可以这样写: 这样我就能获得 称呼 这个数组
- curl 命令使用
1.开启gzip请求curl -I http://www.sina.com.cn/ -H Accept-Encoding:gzip,defalte 2.监控网页的响应时间curl -o /dev/nu ...