Android中常见的持久化数据存储方法有三个:文件存储、SharedPreferences存储和数据库存储。文件存储的核心思想是将数据按照streaming的形式保存到本地,这点与C++有共通点。写一个利用文件存储数据的简单实例,重新定义《MPD解析模块在Android中的实现》中提到的parseXMLWithPull(String xmlData)方法,在showResponse()后接着调用Save()方法,将解析数据保存到本地:

    private void parseXMLWithPull(String xmlData) { //MPD解析方法Represent repres = new Represent();//实例化一个Representation对象String line = "";try {XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); //获得一个XMLPULL工厂类的实例XmlPullParser xmlPullParser = factory.newPullParser(); //获得一个XML解析器的实例xmlPullParser.setInput(new StringReader(xmlData));int eventType = xmlPullParser.getEventType();while (eventType != XmlPullParser.END_DOCUMENT) {String nodeName = xmlPullParser.getName();switch (eventType) {// 通过判断事件类型来选择执行不同的代码// 开始解析某个结点case XmlPullParser.START_TAG: {if ("Representation".equals(nodeName)) {//由<Representation开始解析repres.setId(xmlPullParser.getAttributeValue(null, "id"));repres.setWidth(xmlPullParser.getAttributeValue(null, "width"));repres.setHeight(xmlPullParser.getAttributeValue(null, "height"));}break;}// 完成解析某个结点case XmlPullParser.END_TAG: {if ("Representation".equals(nodeName)) {     //由Representation--/>结束解析Log.d("Representation", "id is " + repres.getId());//在调试窗口logcat打印出属性值Log.d("Representation", "width is " + repres.getWidth());Log.d("Representation", "height is " + repres.getHeight());line = line +"ID: "+ repres.getId()+";  WIDTH: "+repres.getWidth()+";  HEIGHT: "+repres.getHeight()+";\n";//将已经遍历的属性值连接成一个字符串,并注意换行}break;}default:break;}eventType = xmlPullParser.next();}showResponse(line);//将字符串对象传入showResponse()方法,打印在UI的TextViewSave(line);//保存数据到本地文件} catch (Exception e) {e.printStackTrace();}}

利用文件存储方式保存数据,Save()方法可以定义为:

public void Save(String streaming){FileOutputStream out = null;BufferedWriter writer = null;try {out = openFileOutput("mpd", Context.MODE_APPEND);
//文件名定义为mpd,因为会多次调用Save()方法,不希望每次覆盖之前内容,因此声明为MODE_APPENDwriter = new BufferedWriter(new OutputStreamWriter(out));writer.write(streaming);}catch (IOException e){e.printStackTrace();}finally {try{if(writer != null){writer.close();}}catch (IOException e){e.printStackTrace();}}}

Run App之后点击MainActivity页面的send request按钮,执行:

在Device File Explore视窗中Data/Data/应用包名/files/下面找到新创建的mpd文件:

打开mpd文件,查看存储的解析数据:

在真机上运行App,但是通过手机的管理文件夹不能搜索到mpd文件,网上的解答是,应用的数据文件不能被用户直接看到,只有将手机ROOT后才可以看到Data文件。

文件存储只适用于保存一些简单的数据和键值对,当需要存储大量复杂的关系型数据时,便会用到数据库。使用SQLite数据库对上面的实例进行重写。首先建立一个MPDdatabaseHelper类,继承自SQLiteOpenHelper类,重写父类的构造方法、onCreate()方法和onUpgrade()方法,并定义表单的创建语句构成的数据成员字符串。

package com.example.xmlparser;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;/*** @Author Fupenzi on 2019/1/4.* @Blog https://blog.csdn.net/qq_34041083*/public class MPDdatabaseHelper extends SQLiteOpenHelper {public static final String CREATE_DATABASE = "create table MPD("+"id string primary key,"+"width string,"+"height string)";private Context context;public MPDdatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){super(context, name, factory, version);}@Overridepublic void onCreate(SQLiteDatabase database){database.execSQL(CREATE_DATABASE);}@Overridepublic void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion){}
}

在public class MainActivity extends AppCompatActivity implements View.OnClickListener 类中声明类MPDdatabaseHelper对象成员:

private MPDdatabaseHelper mpdHelper;

并在MainActivity活动的onCreate()方法中对mpdHelper对象进行实例化

 mpdHelper = new MPDdatabaseHelper(this, "MPD.database",null,1);

在private void parseXMLWithPull() 方法中创建数据库并声明数据填充对象

SQLiteDatabase database = mpdHelper.getWritableDatabase();
//getWritableDatabase()方法检测并创建数据库,返回一个数据库对象ContentValues values = new ContentValues();//数据库内容填充对象

在case XmlPullParser.END_TAG:……解析结果后面,对将解析结果写入到数据库内容对象中,并将写好的内容insert到表单中,之后清空内容对象。

    values.put("id",repres.getId());values.put("width",repres.getWidth());values.put("height",repres.getHeight());database.insert("MPD",null,values);values.clear();

Run App,通过文件夹视窗可以看到创建的表单:

再通过Terminal进入到该目录利用命令行窗口查看MPD.database中的内容

可以看到表单内容和之前本地文件存储的内容一样,说明MPD解析的内容成功保存到数据库中。

DASH流媒体MPD文件存储相关推荐

  1. DASH流媒体MPD文件解析

    MPD文件本质是XML文件,其说明了DASH服务端流媒体视频切片的相关信息,包含分辨率,大小,帧率等等,因此在DASH客户端实现的第一步便是解析服务端的MPD文件,其常见结构如图所示: MPD文件来源 ...

  2. DASH流mpd文件注释---比较详细

    <!--profiles:不同的profile对应不同的MPD要求和Segment格式要求 mediaPresentationDuration:整个节目的时长 minBufferTime:至少需 ...

  3. DASH 流媒体协议(Dynamic Adaptive Streaming over HTTP)概述——起源、MPD文件解析、相关项目

    流媒体 注: 1.此篇文章立足于巨人的肩膀之上,侵必删 2.有许多内容尚未完成,包括segment的类别,HTTP协议基础等 DASH DASH的起源-- MPEG(Moving Picture Ex ...

  4. MPEG DASH MPD文件字段解释

    转自:http://www.cnblogs.com/vleung/p/4162409.html MPEG DASH作为三大流媒体协议之一,诞生的目的是为了统一标准,因此是兼容SmoothStreami ...

  5. DASH MPD 文件内容解析

    拿个MPD内容举个例子: <?xml version="1.0" encoding="utf-8"?> <!-- Created with B ...

  6. 文件标识符无效。使用 fopen 生成有效的文件标识符。_「存储架构」块存储、文件存储和对象存储(第1节)...

    全球传输和生成的数据比以往任何时候都多.国际数据公司(IDC)的分析师预计,到2025年,全球数据层将增至163zb.这比2016年16.1 ZB的数据增长了1000%以上.数据大量增加的原因是多方面 ...

  7. SDS趋势之二:对象存储将替代文件存储

    首先什么是对象存储? 对象存储(Object Storage)是综合了NAS和SAN的优点,同时具有SAN的高速直接访问和NAS的数据共享等优势,提供了高可靠性.跨平台性以及安全的数据共享的存储体系结 ...

  8. 中维云视通录像文件存储及设置_视频监控存储方式选择,磁盘阵列与NVR优势对比...

    如何构建一个高效.经济.安全的存储架构对于安防监控的建设是至关重要的,目前视频监控存储无非DVR存储.DVS前端存储.NVR存储及磁盘阵列集中存储. 随着视频监控高清化.网络化,使得NVR存储和磁盘阵 ...

  9. 块存储、文件存储、对象存储这三者的区别

    参考链接 https://blog.csdn.net/wuxiaobingandbob/article/details/80178502 https://blog.csdn.net/qq_319331 ...

最新文章

  1. 一个用户实体应该有它自己的实体验证,即一个实体应该有它的属性,方法,扩展属性及验证机制组成...
  2. JVM年轻代,老年代,永久代详解
  3. 3G,三足鼎立;花开千朵,各表一枝!!!
  4. python elasticsearch 入门教程(一)
  5. Dubbo原理和源码解析之服务引用
  6. 在Unity内使用对象池并实现线程安全的单例模式
  7. java设计模式6.代理模式
  8. css如何将元素水平居中
  9. 买断变订阅!苹果第一付费软件被骂上热搜 官方回应
  10. mariadb数据库基础
  11. JAVA标识符和命名规则
  12. 机器学习大牛李飞飞的电脑配置
  13. JSP——在JSP中嵌入java代码
  14. PHP计算比较两段文字内容的重复率
  15. 宋朝人物第一,朱熹都说他是“天地间第一流人物”
  16. 计算机前沿技术讲座心得体会
  17. NIOS II --- UART
  18. 删除服务器的文件夹,删除服务器上的文件夹
  19. 基于libusb库、uac协议,获取Audio声音数据
  20. ConcurrentHashMap源码分析,轻取面试Offer(二)

热门文章

  1. YOLO v1到YOLO v4(下)
  2. Java基础Switch和循环控制
  3. python raw_input 与 input 的区别
  4. 吴恩达Drive.ai因经营困难“卖身”苹果
  5. Java基于Quartz的定时任务调度服务(一)
  6. 2022-2028年中国团购行业投资分析及前景预测报告
  7. C++ VS2013环境编译使用sqlite数据库全过程
  8. Struts2中Action接收参数
  9. 从头到尾彻底解析Hash表算法
  10. Oracle 12C -- 基于sequence的列的默认值