• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android系统的五种数据存储形式(二),android数据存储

Android系统的五种数据存储形式(二),android数据存储

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android系统升级,android系统,android系统恢复3e,android系统架构,android系统开发等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android系统的五种数据存储形式(二),android数据存储


     之前介绍了Android系统下三种数据存储形式,今天补充介绍另外两种,分别是内容提供者和网络存储。有些人可能认为内存提供者和网络存储更偏向于对数据的操作而不是数据的存储,但这两种方式确实与数据有关,所以这里还是将这两种形式简要的说明一下。

     Content Provider:

     Content Provider,中文名是内存提供者,Android四大组件之一,内容提供者是应用程序之间共享数据的接口,以数据库形式存入手机内存,可以共享自己的数据给其他应用使用。之所以需要设计一个单独的控件来操作数据,是为了实现应用程序之间的数据传递。通过查看DDMS中的目录结构可以看出,数据库文件对于其他应用来说是不可读、不可写,而日常生活中又需要获取其他应用的数据,尤其是系统自带软件的数据。比如打开QQ或者微信时会提示是否同步联系人,又比如备份短信的时候,这些都需要访问和操作其他应用的数据库。因此谷歌工程师在底层软件中集成了大量的方法利用内存提供者的原理,类似于在数据库中提供一个对外访问的路径,供其他应用访问。

      为了更好的理解内存提供者的工作原理,可以自定义一个内容提示者来帮助理解。首先写一个类继承ContentProvider,实现该类中的方法,包括一些增删改查和数据初始化的方法,可以在方法中实现对数据库的增删改查操作。数据库本来是不对外开放的,所以为保护数据,类中的方法原始返回数据均是空类型。为保证数据的安全性,可以创建一个UriMatcher对象,利用addURIf方法添加Uri的路径规则,在每一次进行数据操作时先判断传入的路径是否符合命名规则。使用内存提供者需要在配置文件中添加provider标签,指定主机名。只有当访问者与内容提供者的主机名一致时,才可以建立数据连接。在另一个应用中实现对内存提供者的访问。具体操作是:创建内容提供者解析器,定义要访问的Uri的路径。Uri路径有着固定的格式:”content://主机名/匹配字符”。 利用内容提供者解析器进行增删改查,和要操作的数据库之间建立联系。以上内容通常用来理解内容提供者的工作原理,实际工作中很少用到自定义的内容提示者。实际中用的比较多的是用内容提供者操作系统联系人、系统短信等系统应用的数据库。

      内容提供者操作系统应用时相对简单,需要用到的大部分程序已经在底层实现,要做的是调用各种方法和相关的参数。需要关注的参数有Uri路径、数据库的表单结构。可以通过查看底层的代码获取相应的参数。其中有些常用的参数可以记下来,方便调用。比如获取全部短信的Uri路径是: content://sms。与联系人有关的数据库表单有三个raw_contacts、data、mimetypes。操作raw_contacts 表的Uri是: content://com.android.contacts/raw_contacts,操作data 表的Uri是: content://com.android.contacts/data。本文以短信的备份、还原来演示利用内容提供者访问短信数据库。

      先看一下短信和手机联系人有关的数据库所在的路径。短信在Android 模拟器下存放在的路径是:/data/data/com.android.providers.telephony/databases/目录,联系人在Android 模拟器下存放在的路径是:/data/data/com.android.providers.contacts/databases/目录。对于短信数据库我们关心的表数据有:address、type、body、date,分别表示发送者号码、短信类型(收还是发)、短信内容、日期。对于联系人数据库的三张表一定要按照一定的顺序依次查找才能得到相关的数据,在这不做解释。尽管开发的时候不需要了解短信和手机联系人的数据库路径,但是要明白短信和手机联系人的数据是存在数据库中的,同时数据库对外是不开放的。

       与短信有关的数据库的目录结构:

     

       本文给出的案例是短信的备份和还原,从而实现对系统应用数据库的操作。首先利用内容提供者查询到短信数据库里的详细参数,将该数据以Xml文件的形式存入到指定的文件夹。利用xml解析得到数据,将获取的数据存在一个工具类中,这样就能用ListView将数据显示在界面上。具体实现如下。

      

package com.example.contentprovider;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
/**
 * 短信的备份和还原
 * 添加写短信和读短信的权限
 *  <uses-permission android:name="android.permission.READ_SMS"/>
    <uses-permission android:name="android.permission.WRITE_SMS"/>
 * @author Huang
 */
  public class MainActivity extends Activity {
    private static final String TAG = "MainActivity";
	private ListView lv;
    private List<Person> mlist;
    private Myadpter adapter;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		lv = (ListView) findViewById(R.id.lv);
		datafresh();
	}
	//数据刷新,一般用到ListView时最好记得刷新数据否则不显示
	public void datafresh(){
		mlist = getList();
		if(adapter == null){
			adapter = new Myadpter();
		}else {
			adapter.notifyDataSetChanged();
		}
	}
	//用ListView显示短信内容
	public class Myadpter extends BaseAdapter{
		public int getCount() {
			// TODO Auto-generated method stub
			return mlist.size();
		}
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return null;
		}
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return 0;
		}
		public View getView(int position, View convertView, ViewGroup parent) {
			TextView tv = new TextView(MainActivity.this);
			tv.setText(mlist.get(position).toString());
			return tv;
		}
	}
    //短信备份	
    public void bankup(View view){
    	ContentResolver resolver = getContentResolver();
    	Uri uri = Uri.parse("content://sms");
    	Cursor cursor = resolver.query(uri, new String[]{"address","body","type","date"}, null, null, null);
    	while(cursor.moveToNext()){
    		String address = cursor.getString(0);
    		String body = cursor.getString(1);
    		String type = cursor.getString(2);
    		String date = cursor.getString(3);
    		//序列化,把短信以Xml文件的形式存储
    		XmlSerializer serializer = Xml.newSerializer();
    		File file = new File(getFilesDir(),"info.xml");
    		try {
				FileOutputStream fos = new FileOutputStream(file);
				serializer.setOutput(fos, "utf-8");
				serializer.startDocument("utf-8", true);
				serializer.startTag(null, "p



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Android系统属性简介,android属性简介
  • Android系统的五种数据存储形式(二),android数据存储
  • Android系统的五种数据存储形式(一),android数据存储

相关文章

  • 2017-05-26支持缩放的fresco图片控件 —— fresco sample: ZoomableDraweeView,
  • 2017-05-26Android之SQLite数据库篇,androidsqlite
  • 2017-05-26Handler,Looper,HandlerThread浅析,handlerthreadlooper
  • 2017-05-26Android 的系统架构,Android系统架构
  • 2017-05-26Android 搜索 把软键盘上的回车键改为搜索
  • 2017-05-26Android开发之初识MVP模式
  • 2017-05-26SIMLock锁卡功能解析,simlock锁解析
  • 2017-05-26【同行说技术】Android程序员从小白到大神必读资料汇总(四),android资料汇总
  • 2017-05-26volley框架的使用
  • 2017-05-26Android 热修复原理及Gradle插件源码解析(以Nuwa为例)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android 上千实例源码分析以及开源分析
    • Unity实现滑页嵌套(解决ScrollRect嵌套冲突问题)
    • 将Android系统源码导入Android studio的方法,androidstudio
    • Loader加载器,loader加载
    • Android(Java)控制GPIO的方法及耗时分析,androidgpio
    • Android动态加载Dex机制解析
    • 关于数据抓取之xpath提取text为空问题的原因和解决方案
    • Setting 之dashboard 点击跳转流程,settingdashboard
    • 安卓中Paint类和Canvas类的方法汇总,安卓中canvas
    • Android中使用ExpandableListView实现微信通讯录界面(完善仿微信APP),expandablelistview

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有