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

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 

技术开发者如何看实时Web App开发框架? 高薪技术排行:大数据居首,苹果相关次之,Java、C等相去甚远 谷歌开发网络跟踪新技术:AdID将取代第三方Cookie 穿在脚上的苹果?苹果聘用Nike设计主管Ben Shaffer 七款Debug工具推荐:iOS开发必备的调试利器 六年亲历,见证中国大数据技术与应用时代的到来 Mailbox:日支撑过亿信息数据库的性能调优及集群迁移 PayPal前CTO 在美国改变世界的乌克兰犹太人 放弃Bootstrap&amp;amp;Foundation,迎接Semantic UI? 一键分享:iOS版Google+发布SDK InMobi杨娟:中国移动游戏如何挑战全球? Adobe再遭APT攻击:数十G源代码及290万用户信息失窃 程序员,如何在工作中崭露头角? 国内外三个不同领域巨头分享的Redis实战经验及使用场景 这是一场潜在的战争:谷歌与Facebook、苹果在搜索上的博弈 设计新闻类网站需要注意的关键点:移动友好、宽带…… 直接开始用:5个免费的在线思维组织工具 招聘开发者常见的九大误区 开源影响销售,维护赞助商? 盘点黑客攻击途径:最常用的7个策略及简单的防护方法 专访AngularJS框架创始人Misko Hevery:让Web开发更便捷 果粉的又一个节日:新iPad或于10月22日发布 新车间李大维:到集装箱里来看创客嘉年华 亚马逊推“登录与支付”功能 直接冲击PayPal Google编程之夏新里程碑:5000万行源代码 8500名学生开发者 非常实用的15款开源PHP类库 Runnable:一站式代码片段服务平台,打造编程界的YouTube 谷歌向所有开发者开放Google App Engine PHP Runtime “沟通”电子表格和矢量图形的“桥梁”:在线可视化工具Raw Facebook北极圈数据中心,Open Compute Project的力作! 最后三天!4折抢购2013移动开发者大会门票 access转化为mssql时出现的一些问题??? 工作流运行时出现了问题!很奇怪! 一个注册表的问题? 关于STL的弱问题 很少有人问的问题 请教学习路线,散分 一个困扰我很久的难题?(高手帮忙啊) 告诉帮我解决文件关联问题!! 请问如何添加备注字段,用sql server建表,有一备注字段为text类型。。。。。。。。。。。 函數啊﹐怎么么搞的?氣死人了。一百求救。 关于数据库的问题 生命游戏问题!!!!那位大哥指点迷津 VB做的免费软件,大家随便下载!给我提点建议也行! RichEdit问题,急!!! 关于IF语句。我是新手我理解不了请高手帮我,谢谢 请问oricle 有没有像sql server 2000 的企业管理器一样的工具? 关于richedit的问题! 誰能告訴我﹐我給他發又發(88分求找) asp.net就没有什么不足吗? 问题:高级程序员的《数据结构》该怎么复习?请有经验的人给指个明路,多谢! 如何将中文文件存入数据库?是文件,不是表单,谢谢!! 怎样才能得到CDialogBar的控件(如Button)的消息及消息处理 子数据窗口中为什麽filter条件不起作用?急急!!在线等!!!! 菜鸟来了! 怎么把Demo_Adhoc分到两台机上运行 数据库更新 how to 用 insert into 把一个.zip文件保存进数据库?? 请大家推荐一个CD机吧!!!! 急,NOTES与SQL SERVER的问题 asp实例 我的Access库文件原来大小是6.78M,我清空所有记录和减少很多记录时,为什么大小没改变? 关于delphi动态加载控件,在线 代人提问:请问.dcu文件是干什么的?如何才能生成该类型文件。 怎么响应Enabled属性 asp.net做网页,运行后,<asp;....></asp:...>字段仍然存在?? 请教VB高手们一个高难问题! 请问,存储过程在VC如何调用,用ADO,ODBC。 怎么实现这个SQL? 没事瞎问~~~黑客软件能走向海外吗?(比如扫描器,键盘记录器,木马等) windows protect --error ,我装不了系统啊 DbEdit里的数据用adoquery如何更新才好? 有没有办法调试存储过程? 我是个菜鸟,请教大家,VC++和C++ Builer的优点和缺点。 请问如何改变显示文本的颜色? delphi 6 的补丁包 浏览器为NS6时如何获取屏幕分辨率? 如何控制 ValueListEditor ?有一个Help这样写道: 各位斑竹请进来,紧急求救呀!!!!! 是否可以把用asa建的数据库转变为access? 在java中如何压缩和解压文件夹? 如何在运行期把最大化,最小化按钮灰掉!? 碳酸氢钙与足量的氢氧化钾反应方程式谢啦`` 将氨水慢慢滴入硝酸溶液中;将硫酸慢慢滴入氢氧化铁胶体中,现象分别是?化学方程式分别是? 用什么作流动相才会让甲醇在液相色谱中响应? 汶川地震,触动了我的心灵.作文,急需600字以上 现有反应物:硝酸银溶液、锌粒、碳酸钙、水、石灰水、生石灰、盐酸、中(1)有单质生成的分解反应是(2)有气体生成的复分解反应(3)有热量放出的中和反应 硫酸氢盐溶液与甲醇反应吗? 用铝壶烧水喝,会吸收过量的铝吗? 现有反应物:硝酸根溶液、锌粒、碳酸钙、水、氢氧化钠溶液、生石灰、盐酸、根据下列要求各写出一个化学反应方程式(反应物可重复使用)(1)无气体生成的置换反应(2)化合反应(3) 【甲醇与乙醇】在硫酸做催化剂加热条件下反应如何? 二氧化硫能否与氯化钙反应 热水壶烧水都有声音么?新买的热水壶烧水声音很大.有相关电器方面知识的人可以和在下讲解下, 怎么鉴别 乙烷 乙烯和环丙烷啊 氦气 氖气 氩气 氪气 氙气分别用字母表示 乙炔生成苯环是什么反应? 硫化亚铁(FeS)+硫酸+氯酸钠生成二氧化氯的反应方程是怎样? HPLC色谱条件摸索中,为什么我们要做波长的选择,以及波长选择的方法? 某含有苯环的烃,相对分子质量是乙炔的4倍又知该烃能使溴的四氯化碳溶液褪色1.确定该烃分子式和结构式2.写出该烃与溴的四氯化碳溶液反映的化学方程式 在盐酸中加入足量下列物质后,溶液的pH不会显著升高的是 a氢氧化铁 B碳酸钾 C硝酸银 D氢氧化钠 高效液相色谱中,波长的选择依据是什么?和紫外的波长选择有何不同求答案 从Cu,O2,NaOH,盐酸,CaCo3,KMnO4,硝酸钠,氧化钙,硝酸银选出合适的, 分解,置换,有沉淀生成的复分解反应 现有铜,氧化铜,氢氧化铜,碳酸钙,硝酸银溶液,盐酸,各取少量两两混合则可发生的化学反应共有 个,其中有 个反应可以生成水;有 个反应属于置换反应. 无色无味的气体是什么今天挖地桩,在地下五米处看到一巴掌大裂缝,里面冒出一种气体,无色无味,比空气重,因为不一会儿周围都没有氧气了(点不着火)闻一下就马上就会流眼泪,火一靠近就 水壶烧开水为什么刚刚烧开时壶底离开火焰摸上去不烫? 如何证明氯化氢中既有氢离子又有氯离子?氯化氢和硝酸银反应呈现他的酸性吗?盐酸和氯化氢的区别? 什么气体最便宜?而且无色无味? 格兰仕电热水壶 烧水后底座拿不下来了,底部很烫和水壶底部连在一起了,不知道是烧水温度太高引起膨胀卡住格兰仕电热水壶 烧水后底座拿不下来了,底部很烫和水壶底部连在一起了,后来用 帮忙分析一下这张琼脂糖凝胶电泳图啊这是我昨天提完质粒后做检测的一张图,一共十六个样,没点maker,其中最左边两个点样孔没有点样.谁能帮忙分析一下为什么最左边两个孔没点样也会发亮 如何用物理性质区分氢气和氧气 为什么把装沸水的水壶从煤气灶上拎下来,手指迅速短暂的接触壶底并不觉得烫 甲醇和甲醛反应生成什么 水可由氢气和氧气化合而成,所以水具有氢气和氧气的性质这种说法对么?水可由氢气和氧气化合而成,所以水具有氢气和氧气的性质这种说法对么?为什么? 为何电热水壶烧水有杂质,而铝壶却没有同样的水,一个用电,一个用煤气烧. 帮忙分析一下下面这个琼脂糖凝胶电泳图左一为marker,检测ApoBVNTR基因多态性的,从这张图里能分析出什么.可以从哪里入手进行实验讨论 . 氧化钠与氧气在常温下能反应生成过氧化钠吗 碳酸氢钙溶液与盐酸反应离子方程式 两分子甲醇如何生成两分子甲醛?两分子甲醇如何生成两分子甲醛?(我要方程式) 如图: 简单并联电路中,一个支联电阻减小,另一个电阻增大,总电阻变化范围和情况快一点哈!时间有限!6号以前!谢谢各位了哈 盐酸克伦特罗100微克/毫升(介质是乙醇)可以用于甲醇和水为流动相的液相色谱仪吗? 形容后悔的好词好句 1.滑动变阻器阻值变化,那么电流电阻分别如何随着滑动变阻器变化?2.并联电路中,滑动变阻器阻值增大,那么总电阻如何变化?3如图所示,电源电压保持不变时,当滑动变阻器滑片p向右移动过程中 液相色谱仪的流动相甲醇和水中,用氢氧化钠调节pH值后,柱子的压力会升高么?我在流动相中用氢氧化钠调节pH值到11,发现柱子的压力升高了300psi左右,请问为什么? 为什么配位原子电负性越大配合物越稳定 如果在电解池中银为正极,碳为负极,硫酸铜为电解质溶液.能组成电解池吗? 最低油的沸点 做配体的配位原子如何确定?是不是电负性越大就是配位原子?CO,硫酸根 做配体时配位原子是什么? 碳酸氢钙和盐酸反应的化学方程式 氯离子,氯分子,氢离子,氯化氢分子没有氧化性的是哪个 如何判断原子电负性 并联电路支路的条数一定时,某一条支路的电阻增大,则并联总电阻增大 用新买的铝壶烧水时,凡是水壶浸到的地方都变成了黑色,这是由于水中有可溶性的()A.钠的化合物B.铁的化合物C.镁的化合物D.钙的化合物 影响碳原子电负性的因素有那些?尤其从杂化角度 ABCD四种单质,AB为无色气体,C为红色固体,D为黑色固体粉末 荧光光谱法分析物质时,溶剂、激发波长会造成什么影响 可以说电负性就是原子吸引电子的能力吗?为什么不说是离子吸引呢? 从氧化钙、水、氢氧化钙、锌粒、稀硫酸中选择适当的物质,按要求各写一个化学方程式①分解反应②化合反应③置换反应④复分解反应 对于某种组分,为什么在荧光最大激发波长和荧光最大发射波长处荧光强度基本相同 为什么sp杂化碳原子比sp3杂化碳原子电负性大?s成分越多电负性也越大? 氢氧化钾和足量的碳酸氢钙反应方程式和离子方程式. 制取氢氧化铁胶体的离子方程式.高手来 小弟在此谢过... 为什么乙炔分子中两个碳原子采用sp轨道?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘