说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Android开发中保存数据的四种方法

HTML文档下载 WORD文档下载 PDF文档下载
本文详细介绍了Android开发中四种数据存储方式:Preferences,Files,Databases,Network,并给出相应代码。

在Android开发中我们会接触到四种数据存储方式,每种存储方式都各有不同;以下我分别列举了Android开发中的不同存储方式的特点

一,Preferences

Preferences是一个较轻量级的存储数据的方法,具体使用方法:

在A中保存值:

SharedPreferences.Editor sharedata = getSharedPreferences("data", 0).edit();   

  sharedata.putString("name","shenrenkui");   

  sharedata.commit();  

在B中取值:

SharedPreferences sharedata = getSharedPreferences("data", 0);   

String data = sharedata.getString("name", null);   

Log.i(TAG,"data="+data);  

注意,Context.getSharedPreferences(String name,int type)的参数更我们在创建数据的时候的数据权限属性是一样的,存储和取值的过程这有点像HashMap但是比HashMap更具人性化,getXXX(Object key,Object defualtReturnValue),第二个参数是当你所要的key对应没有时候返回的值。这就省去了很多逻辑判断。。。。

二,Files

在Android上面没有的File就是J2se中的纯种File了,可见功能之强大,这里就算是走马观花地严重路过了。
//创建文件
            file = new File(FILE_PATH , FILE_NAME);
            file.createNewFile();
            
            //打开文件file的OutputStream
            out = new FileOutputStream(file);
            String infoToWrite = "纸上得来终觉浅,绝知此事要躬行";
            //将字符串转换成byte数组写入文件
            out.write(infoToWrite.getBytes());
            //关闭文件file的OutputStream
            out.close();
            
            //打开文件file的InputStream
            in = new FileInputStream(file);
            //将文件内容全部读入到byte数组
            int length = (int)file.length();
            byte[] temp = new byte[length];
            in.read(temp, 0, length);
            //将byte数组用UTF-8编码并存入display字符串中
            display =  EncodingUtils.getString(temp,TEXT_ENCODING);
            //关闭文件file的InputStream
            in.close();
        } catch (IOException e) {
            //将出错信息打印到Logcat
            Log.e(TAG, e.toString());
            this.finish();
        }

//从资源读取

InputStream is=getResources().getRawResource(R.raw.文件名)
三,Databases

Android内嵌了功能比其他手机操作系统强大的关系型数据库sqlite3,我们在大学时候学的SQL语句基本都可以使用,我们自己创建的数据可以用adb shell来操作。具体路径是/data/data/package_name/databases。如,这里演示一下进入com.android.providers.media包下面的操作。

1,  adb shell

2,  cd /data/data/com.android.providers.media/databases

3,  ls(查看com.android.providers.media下面的数据库)

4,  sqlite3 internal.db

5,  .help---看看如何操作

6,  .table列出internal数据中的表

7,  select * from albums;


 DatabaseHelper mOpenHelper;

 private static final String DATABASE_NAME = "dbForTest.db";
 private static final int DATABASE_VERSION = 1;
 private static final String TABLE_NAME = "diary";
 private static final String TITLE = "title";
 private static final String BODY = "body";

 private static class DatabaseHelper extends SQLiteOpenHelper {
  DatabaseHelper(Context context) {
   super(context, DATABASE_NAME, null, DATABASE_VERSION);
  }

  @Override
  public void onCreate(SQLiteDatabase db) {

   String sql = "CREATE TABLE " + TABLE_NAME + " (" + TITLE
     + " text not null, " + BODY + " text not null " + ");";
   Log.i("haiyang:createDB=", sql);
   db.execSQL(sql);

  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  }
 }

 /*
  * 重新建立数据表
  */
 private void CreateTable() {
  SQLiteDatabase db = mOpenHelper.getWritableDatabase();
  String sql = "CREATE TABLE " + TABLE_NAME + " (" + TITLE
    + " text not null, " + BODY + " text not null " + ");";
  Log.i("haiyang:createDB=", sql);

  try {
   db.execSQL("DROP TABLE IF EXISTS diary");
   db.execSQL(sql);
   setTitle("数据表成功重建");
  } catch (SQLException e) {
   setTitle("数据表重建错误");
  }
 }

 /*
  * 删除数据表
  */
 private void dropTable() {
  SQLiteDatabase db = mOpenHelper.getWritableDatabase();
  String sql = "drop table " + TABLE_NAME;
  try {
   db.execSQL(sql);
   setTitle("数据表成功删除:" + sql);
  } catch (SQLException e) {
   setTitle("数据表删除错误");
  }
 }

 /*
  * 插入两条数据
  */
 private void insertItem() {
  SQLiteDatabase db = mOpenHelper.getWritableDatabase();
  String sql1 = "insert into " + TABLE_NAME + " (" + TITLE + ", " + BODY
    + ") values('haiyang', 'android的发展真是迅速啊');";
  String sql2 = "insert into " + TABLE_NAME + " (" + TITLE + ", " + BODY
    + ") values('icesky', 'android的发展真是迅速啊');";
  try {
   Log.i("haiyang:sql1=", sql1);
   Log.i("haiyang:sql2=", sql2);
   db.execSQL(sql1);
   db.execSQL(sql2);
   setTitle("插入两条数据成功");
  } catch (SQLException e) {
   setTitle("插入两条数据失败");
  }
 }

 /*
  * 删除其中的一条数据
  */
 private void deleteItem() {
  try {
   SQLiteDatabase db = mOpenHelper.getWritableDatabase();
   db.delete(TABLE_NAME, " title = 'haiyang'", null);
   setTitle("删除title为haiyang的一条记录");
  } catch (SQLException e) {

  }

 }

 /*
  * 在屏幕的title区域显示当前数据表当中的数据的条数。
  */
 private void showItems() {

  SQLiteDatabase db = mOpenHelper.getReadableDatabase();
  String col[] = { TITLE, BODY };
  Cursor cur = db.query(TABLE_NAME, col, null, null, null, null, null);
  Integer num = cur.getCount();
  setTitle(Integer.toString(num) + " 条记录");
 }

四,Network

这是借助Internet来存储我们要的数据,这是CS结构的存储方式,也是点一下名了。


如何使用 Content Provider

下边是用户经常接触到的几个典型Content Provider应用:

    * Content Provider Name : Intended Data
    * Browser : Browser bookmarks, Browser history, etc.
    * CallLog : Missed calls, Call datails, etc.
    * Contacts : Contact details
    * MediaStore : Media files such as audio, Video and Images
    * Settings : Device Settings and Preferences

调用Content Provider资源的标准URI结构:

:////

例如:
1) 取得浏览器所有“书签”信息: content://browser/bookmarks
2) 取得系统通讯录中的信息: content://contacts/people (如果取得某一个特定通讯记录,在路径URI的末端指定一个ID号:content://contacts/people/5

简单的实例片段:

Uri allCalls = Uri.parse("content://call_log/calls");

Cursor c = managedQuery(allCalls, null, null, null, null);

转载自:http://blog.csdn.net/sdhjob/archive/2009/12/18/5031610.aspx 

全透明、可折叠,平板电脑概念机是这样的 插件大集合!开源包管理器Alcatraz迎来Xcode 5更新 Q语言:新型的数据定义语言 非响应式手机网站页面的优化 高薪必备:Hadoop求职者的6大攻略 微软或将于四月发布“返璞归真”的Windows 8.1 Update 1 《近匠》第14期:LiveCode——全民开发工具 美团梁堰波:用SQL-on-Hadoop构建互联网数据仓库与商务智能系统 程序员游戏Style:亚特兰大极客使用机器学习玩转Flappy Bird Gleasy CTO薛珂:成立3年,企业用户2万+,移动办公蕴藏较大发展机遇 Unity Awards展区“点亮”Unity亚洲开发者大会 DevBox:最实用的移动开发辅助工具包 【技术博客推荐】创客程序员设计实现最小物联网系统 MySQL还是NoSQL:开源盛世下的数据库该如何选择 利用Hadoop Streaming处理二进制格式文件 如果没有强大的API,那么还是与OpenStack兼容吧 企业社交工具为何走向衰退? 封闭还是开放?雅虎禁止用户使用Facebook、谷歌ID登录和使用其服务 【OSTC讲师专访】罗聪翼:付出和回报在开源世界成正比 近匠:“词Ci”——全栈“女神”如何诠释倾城之美 国内首届引擎黑客松Cocos2d-x Hackathon即将开赛! 抛弃CloudStack,GoDaddy加入OpenStack PaaS平台之争:Cloud Foundry是赢家吗? 投资超140亿美元,涨幅达30%,数据密集型应用将占领第三平台 汽车开放平台:看看通用汽车是怎么做API的 Gamebase将推全新跨平台3D游戏引擎Reach3dx 借助API Telegram能否成为第二个WhatsApp 机器学习也感性:90后软妹纸的编程之路 为安防与视频监控而生 西数紫盘首发 秘闻:鲍尔默离职,或与坚持收购诺基亚有关 【OSTC讲师专访】Thomas Yao:开源社区最缺有能力的领导者 如何加载控件? 强烈推荐!" 在QQ上如何弄的别人神经分裂???//owner: onice (西瓜的眼泪) " 请问如何在XML字符串中传递中文 压缩原理究竟是怎样的? 如何用javascript创建树形菜单 ftp 你的上网速度低于1m就不用看了 请问在VC中使用ADO连接Oracle数据库,如何判断连接断开 关于C++BUIDLER的学习 ====我的显示器以前好好的不知为什么现在闪呀闪的弄的我眼睛疼啊!我重装了系统又重装了显卡驱动程序,可是还是 闪!请问我该怎么办?谢 各位大哥,小弟有段初级链表程序,有些问题,请斑竹和高手解答,谢谢!!!!!! 如何让EDIT控件换行显示数据? 想考计算机系的研究生,请大家给点建议 各位大哥,小弟有段初级链表程序,有些问题,请斑竹和高手解答,谢谢!!!!!! 关于路径设置的问题,为什么没人回答呢??? 叶剑英的孙女,李泽楷和曾荫权都在追 100分送上!!我都快被ADO逼疯了!!!真他妈的服了,各位给我指点一下吧,急用呀!!! 在linux下的C对数据库编程中,嵌套SQL语句的格式 如何启动备份服务器! 如何在窗口下对datawindow的数据进行修改后保存? 火急!急!急!急!急JBuilder完全安装怎么没有InterBase,哪又怎么安装? 求救!!! 明天上班,终于结束失业期了。 一个ORACLE备份数据导入问题。请高手指点! VC和VB下好用的控件在delphi下不好用!是不是dll的问题? 明天上班了,同喜! 大家觉得POWERSOFT公司的PB9会推出WEB SERVICE功能吗? 一个ORACLE备份数据导入问题。请高手指点!!! 请教各位高手,DirectX环境下,是否可以利用各种输入法输入汉字? 急,高手帮忙。 getchar小问题,为什么程序不能中断? 我想学游戏编程,谁能指点一下?100分! 医疗管理系统 请帮忙看看这段流操作的代码错在哪里? javabean高手请进!请赐教!!! 请各位高手指点一下,什么软件开发java比较方便,效率较高? 谁能告诉我,怎样将邮箱中的信件复制到本地硬盘.谢了 需要什么权限才能在active directory里添加用户??(实际上是想添加email帐号),谢谢各位 test 请问在winXP里该如何实现如下功能呢? 再问一次,怎么在mandrake下设显示器的刷新率!怎么想给分都送不出去! 当用c++编程时,能不能不用回收内存?100分 用VC处理XML文档时遇到的一些细微而重要的问题 大家能不能给我给我点 我有一个关于注册表的问题? delphi中要想定义一个整个工程文件中可以访问的变量怎样做才好?(说者有分) 本人泡MM精华之作,大家快看!! 25分散尽! 如何使用paradox.net? 类的定义与实现细节是否要放在不同文件 各位:我想当斑竹,位兄弟是否同意?:) 关于shell和key事件 写出下列化学式 1在空气中点燃锌粉时,锌粉燃烧.2铝跟硫在加热条件下反应.3汞蒸气有毒,为防止汞蒸气使人毒,可以在洒落的液态汞上覆盖硫粉,产物是+2价汞的硫化物.4铜器在潮湿的空气中,表 水汞的作用的是什么? 英语中,如何判断句子成分? 苯和溴单质生成了溴化氢,溴化氢和硝酸银反应的淡黄色沉淀是溴化银吗?如题将问题一中的反应后的液体倒入水中,在水底可出现黄褐色的油状液体,这个油油是什么东东? 苯和水共沸,哪个更易挥发?为什么?挥发性和沸点有什么关系? 来判断英语这些句子成分1.She took me there herself.这个there herself是做什么句子成分的?2.含疑问代词的句子,主语怎么判断的,这个疑问代词又会做什么成分,能举个例子吗?还有反身代词一般都从当 硝酸银和溴水中的什么反应是溴化氢还是次溴酸(有次溴酸吗) 如何快速判断英语句子成分? 除去硝酸铜中的硝酸银加入什么物质能够除去硝酸铜溶液中的少量硝酸银?请写一下方程式 溴气与硝酸银的反应 高锰酸钾 和 溴水可以去除二氧化硫么 - -RT 为什么可以加适量铜粉除硝酸铜中的硝酸银 光气和苯胺怎么反应?化工生产中运用光气,氯气和N-苯胺在四氯化碳中反应生产某种氯化物!这其中的反应是如何进行的!反应式怎么写? 干冰为什么不是单质,它的化学式怎么写? 氢氧化钠中混有氢氧化钡,能用硫酸铜去除吗?硝酸铜中混有硝酸银能用铜粉去除吗? 求高中化学常见沉淀谢谢,详细点. 硝酸铁 干冰 冰的化学式是什么 光气的用途我想知道光气是做什么用的,最好举些例子,谢谢能在具体点么?比如说我们身边的什么东西或物品是跟光气有关的。 通古斯大爆炸之谜 将铁和铜加入到硝酸银中怎么反应 分离硝酸银,硝酸铜硝酸铁 通古斯大爆炸真相通古斯大爆炸是不是外星人干的,还是俄国的最新式武器试验,或者还有自然原因! 一次性鉴别盐酸、氢氧化钠与石灰水是用A.二氧化碳 B.碳酸钠 C.锌 D.石蕊溶液 如何分离硝酸银和硝酸铜 通古斯大爆炸的原因 求铁,镁,硫,磷分别雨氧气反应的化学方程式 如何从硝酸银中分离掉硝酸铜和硝酸铁杂质,写出相关反应式. 通古斯大爆炸原因是什么? 生鸡蛋用开水冲,再加蜂蜜可以喝吗 如何分开硝酸铜和硝酸银 通古斯大爆炸的起因? 生鸡蛋放入白开水,这样喝卫生吗?.就是.开水冲生鸡蛋!鸡蛋生吃对身体是有害的,可用白开水冲,能不能把蛋里的抗菌素杀死?这样是不是科学的?我听过别人的说法,这样对身体不好```是不是这样 怎样从硝酸银和硝酸铜溶液中分离硝酸铜 溴单质与二氧化硫水溶液的化学方程式 喝开水冲的生鸡蛋好不好、 詹姆斯抛撒镁粉是什么意思?镁粉象征什么?镁粉是什么东西? 钠和铝两种元素的最高价氧化物对应水化物在溶液中相互反应的离子方程式是什么? 总喝开水冲的生鸡蛋好吗厄 因为我总血压低 总熬夜 所以吃的 如果内径为120mm的圆柱形玻璃杯,和内径为300mm,内高为32mm的圆柱形玻璃盆容纳同样多的水,则玻璃杯的内高是多少?(方程解,) 铝最高价氧化物对应的水化物是什么? 生鸡蛋用开水冲食好吗? 圆柱形玻璃的内径为120mm,与内径为300mm,高为32mm的圆柱形玻璃盘可以盛同样多的水,则玻璃杯的高为多少 铝的氢氧化物和硫、钾最高价氧化物的水化物反应方程式是什么? 英语句子中主语的一个问题刚看到一个句子Colour the picture yellow.这句话主语是什么啊? 内径为120mm的圆柱体玻璃杯和内径为300mm 内高为32mm的圆柱行玻璃盘可以盛同样的水,求玻璃杯的高度 铝元素的最高价氧化物对应的水化物与氢氧化钠反应的离子方程式是什么啊? nuk塑料奶瓶怎么样 .内径为120mm的圆柱形玻璃杯,和内径为300mm,内高为32mm的圆柱形玻璃盆可以盛同样.方程回答! 钠、铝的最高价氧化物对应水化物相互反应的离子方程式 关于有机化学亲核加成的问题关于亲核加成的规律不是说两端有选择性的结合吗就是带部分异号的电荷的加成 那为什么像乙炔或乙烯和有的物质如H2O(水)却有两种产物虽然有的多有的少 但 内径为120mm的圆柱玻璃杯和内径为300mm,高为32mm的圆柱塑料杯可以装同样的水,则玻璃杯的高为( ) 请问通古斯大爆炸是什么回事? 硝酸银弄在手上了要怎么去掉做实验的时候一不小心就搞了点硝酸银到手上了...黑呼呼的,还洗不掉...天哪,这要怎么办啊? 氯酸钾是单质吗同上 卤素单质与卤素离子哪个更容易与硝酸银反应 沾上硝酸银怎么去除 镁粉是纯净物还是单质? 卤素与硝酸银溶液反应生成什么方程式 家用净水器能不能彻底去除自来水中的铅、砷、汞等有毒物质 硝酸钾是单质吗
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘