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

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 

PHP操作SQLite数据库 PHP利用DomDocument创建XML文件 ASP.NET如何加密/解密URL网址 如何使用C#读取csv文件 三步骤实现ASP.NET(C#)项目中添加谷歌(Google Map)地图 使用C# ASP.NET以FTP客户端方式下载文件 ASP.NET如何用C#代码检测手机浏览器 使用C#读取上传的Excel文件 新版本SQL Helper类 C#使用iTextsharp生成PDF 在.NET里用iTextSharp库生成PDF文档 用itextsharp将ASP.NET页面导出到PDF中 什么是JQuery-JQuery API jQuery入门指南-JQuery API jQuery的核心部分-JQuery API $(elements)-JQuery API $(expr, context)-JQuery API $(fn) -JQuery API $(html) -JQuery API $.extend(prop) -JQuery API $.noConflict() -JQuery API each(fn)-JQuery API eq(pos)-JQuery API get(num)-JQuery API get()-JQuery API gt(pos)-JQuery API index(subject)-JQuery API length-JQuery API lt(pos)-JQuery API size()-JQuery API CSS-JQuery API 哪里有CASL语言虚拟机下载?急,谢谢! 如何改变控件Enabled时的字体颜色??? 学习C++采用BC++好还是vc++好? 如何打开用winara3.0加秘的文件? ADO方法访问数据库出措时如何获得数据库错误号(sqlcode)? 如何在aspx页面中添加TreeView控件? 关于用JSP做邮件服务的问题~ 如何找到windowsXP风格的全系列控件 Widestring与AnsiString之间怎么相互转换 关于FTP的问题 用什么函数可以得到本地硬盘分区个数? 程序中如何跳出进行鼠标操作? 传值,三个窗体之间的传值,在线,请回答 斑竹,请教你一个问题:ASP与报表... 体提议意见 数据库中正常,在JSP中显示好象为十六进制数,帮忙解决 如何获取硬盘序列号? 请教高手,这个效果用CSS该如何实现? win2k如何实现桌面共享!! 可不可以怎么做? 当前提供者不支持索引必需的界面 没有马甲的来这里报到! linu和windows都不能启动了,怎么办,急急急!!! 请问,在PB中怎么为自定义窗体类定义一个虚拟方法? 熟悉memfile的朋友请进 php调VB程序?着急! vb 访问另一台sql server 的问题? 谁有flashmx,dreamwerver mx,firework mx 的注册吗。有100分 很急的问题? 断点无效?? 想给自己买一个数码相机做新年礼物!但对选中的品牌不是很熟!请师哥师姐给点建议!!! 如何对视图连接的表进行数据插入?? 谁会替用户负责?用“小灵通”还是小心为妙 做过考勤管理的请进………… 简单问题,麻烦各位高手!!! 请问delphi5中有没有delphi6中的object treeview功能 哪有关于网络安全方面的资料? 三层MIS中的中间件怎么用COM或EJB来实现. 请问哪里的个人主页控件支持JSP? 再次请教一个有关DataGrid不能显示而令人头晕的问题(在线等待)! 做过考勤管理的请进………… 在ASP.NET中怎样实现语句加入引用? 请问下面这个问题应该怎么解决最好?关于处理网页中的数据的 使用VB6自带的Sample中自动化示例应用程序时的一个问题 那位高手知道怎样实现曲线分析图... 一个简单SESSION 问题,请解决。在线等,没分了不好意思. 为什么在asp中使用ADODb的Connection对象的方法时不能使用事务处理 ====寂寞啊!谁帮介绍一个女孩啊(15-18)岁的!!万分感谢!==== 高分请教大虾,关于搜索的问题?。。。。 100分请教一个简单的问题?? runtime在JAVA中解释应该是什么意思? SCO上的ORACLE7建库?SOS 福岛核污水泄漏事故等级上调 安倍称政沙特“巫术战争”:信主不信巫美国:涨工资拯救低收入者?日媒谴责潘基文涉日历史言论 韩媒批其杭州信息产业工程重点扶持信息软件和电杭州新增两条东西向的育英路和余杭塘路杭州昨天PM2.5的平均浓度值为18宁杭甬高铁车次停靠站发布 杭州东站6宁波毒蛋糕致近百人中毒事件主体责任认省第十三次妇女代表大会代表建议防止儿京杭高铁最快4小时58分阳光不烈雨水不大 端午三天杭州天气不杭州端午节期间新开7条公交换乘线过期鸡翅化妆后销往菜市场餐饮店食堂杭州公交车上300斤猪肉皮一路解冻一记者探访杭州市场尚未发现整容鸡翅昨天杭州地铁多站点因故停车 十天内两端午节生鲜产品走俏涨价 宁波活禽交易宁波现已成功试种色拉土豆杭州上城区永康开化等5个县市区党政主东站枢纽开通时先启用东广场 候车大厅特朗普基金会将解散:避免与总统身份有老人扎堆领“免费”鸡蛋?其实这都是骗2016山东已建成49套校园科技馆,辽宁舰编队应当远行,走出第二岛链多名全国人大代表的代表资格终止下周的\"元旦抢红包\",要变玩法了城市顽疾!“小蹦蹦”无视禁行区肆意穿在濮阳倾倒千吨废硫酸,聊城一化工厂被昨晚,“得分机器”如何被辽篮“断电”这次足球“三对三”为何吸引人“孙队长”的担当竞彩足球总进球小技巧-4℃!扬州气温明天开始暴跌,还有超安徽芜湖:高速交警连闯8处红灯救人“我就是抢劫,我是依法抢劫!”环境治理 我们有信心(数字解读201民生改善 我们有收获(数字解读201北京首列磁浮列车将于2017年运行出彩中国 我们在一起(数字解读201山里娃娃的足球梦足坛那么大 我想去看看
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘