写点什么

Android 常见的数据存储方式,腾讯 T2 大佬手把手教你

发布于: 2 小时前

private String staffInfo = "";


private String strJsonRes = "";


private String strMsg;


private Button btnAdd;


private Button btnJson;


@Override


public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);


setContentView(R.layout.main);


tvMsg = (TextView) findViewById(R.id.tvMsg);


tvJson = (TextView) findViewById(R.id.tvJson);


etName = (EditText) findViewById(R.id.etName);


etAge = (EditText) findViewById(R.id.etAge);


btnAdd = (Button) findViewById(R.id.btnAdd);


btnJson = (Button) findViewById(R.id.btnJson);


MsgToJson(); // 封装 Json


JsonToMsg(); // 解析 Json


}


class onClickListenerImp implements OnClickListener {


@Override


public void onClick(View v) {


// TODO Auto-generated method stub


if (v == btnAdd) {


if (strMsg != null && strJson.trim().length() != 0) {


strMsg = strMsg + ",{name:'" + etName.getText().toString()


  • "',age:" + etAge.getText().toString() + "}";


} else {


strMsg = "{staff:[{name:'" + etName.getText().toString()


  • "',age:" + etAge.getText().toString() + "}";


}


Toast.makeText(Main.this, "Add Succcess!", Toast.LENGTH_SHORT)


.show();


etAge.setText("");


etName.setText("");


} else if (v == btnJson) {


strJsonRes = "";


strJsonRes = strMsg + "]}";


tvJson.setText(strJsonRes);


}


}


}


private void MsgToJson() {


btnAdd.setOnClickListener(new onClickListenerImp());


btnJson.setOnClickListener(new onClickListenerImp());


}


private void JsonToMsg() {


strJson = "{staff:[{name:'Alex',age:21},{name:'Zhou',age:22},{name:'Anne',age:23}],company:'T-Chip'}";


staffInfo = "原始数据:\n" + strJson + "\n\n 解析之后:\n";


try {


JSONObject mJsonObject = new JSONObject(strJson);


JSONArray mJsonArray = mJsonObject.getJSONArray("staff");


String company = mJsonObject.getString("company");


staffInfo = staffInfo + company + "共有 " + mJsonArray.length()


  • " 个员工,信息如下:\n";


for (int staffCount = 0; staffCount < mJsonArray.length(); staffCount++) {


// 获取员工


JSONObject staff = mJsonArray.getJSONObject(staffCount);


int staffNo = staffCount + 1;


staffInfo = staffInfo + "序号:" + staffNo + " 姓名: "


  • staff.getString("name") + " 年龄: "

  • staff.getInt("age") + "\n";


}


tvMsg.setText(staffInfo);


} catch (JSONException e) {


e.printStackTrace();


} catch (Exception e) {


e.printStackTrace();


}


}


}


布局有点拖沓,其实数据封装部分还可以利用一下解析部分的逻辑。


<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"


android:layout_width="fill_parent"


android:layout_height="fill_parent"


android:orientation="vertical" >


<TextView


android:id="@+id/tvMsg"


android:layout_width="fill_parent"


android:layout_height="wrap_content" />


<TextView


android:layout_width="fill_parent"


android:layout_height="wrap_content"


android:text="==========================" />


<LinearLayout


android:layout_width="fill_parent"


android:layout_height="wrap_content"


android:orientation="horizontal" >


<EditText


android:id="@+id/etName"


android:layout_width="wrap_content"


android:layout_height="wrap_content"


android:hint="姓名" />


<EditText


android:id="@+id/etAge"


android:layout_width="wrap_content"


android:layout_height="wrap_content"


android:hint="年龄" />


<Button


android:id="@+id/btnAdd"


android:layout_width="wrap_content"


android:layout_height="wrap_content"


android:text="增加" />


<Button


android:id="@+id/btnJson"


android:layout_width="wrap_content"


android:layout_height="wrap_content"


android:text="JSON" />


</LinearLayout>


<TextView


android:id="@+id/tvJson"


android:layout_width="fill_parent"


android:layout_height="wrap_content" />


</LinearLayout>


4.DOM,SAX 解析 XML


分别通过 DOM 和 SAX 解析 XML 实现存储和读取 XML 信息。


首先是 DOM 存储信息到 XML 文件:


// 判断是否存在 SDCard


if(!Environment.getExternalStorageState().equals(


Environment.MEDIA_MOUNTED)){


return ;


}


// 路径:/sdcard/zhoumushui/android.xml


File file = new File(Environment


.getExternalStorageDirectory().toString()


  • File.separator

  • "zhoumushui" + File.separator + "android.xml") ;


// 若目录不存在则创建


if (! file.getParentFile().exists()) {


file.getParentFile().mkdirs() ;


}


DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();


DocumentBuilder builder = null;


try {


builder = factory.newDocumentBuilder();


} catch (ParserConfigurationException e) {


e.printStackTrace();


}


Document doc = null;


doc = builder.newDocument();


// 根标签


Element roottag = doc.createElement("roottag") ;


// 次标签


Element infotag = doc.createElement("infotag") ;


Element name = doc.createElement("name") ;


Element url = doc.createElement("url") ;


name.appendChild(doc.createTextNode(MyDOMDemo.this.name.getText()


.toString()));


url.appendChild(doc.createTextNode(MyDOMDemo.this.url.getText()


.toString())) ;


// 次标签有两个子元素 name 和 url


infotag.appendChild(name) ;


infotag.appendChild(url) ;


// 主标签有一个子元素 infotag


roottag.appendChild(infotag) ;


doc.appendChild(roottag) ;


TransformerFactory transformerFactory =


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


TransformerFactory.newInstance();


Transformer transformer = null;


try {


transformer = transformerFactory.newTransformer();


} catch (TransformerConfigurationException e1) {


e1.printStackTrace();


}


transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8") ;


// 定义 source 和 result,从 source 变形为 result:


DOMSource source = new DOMSource(doc);


StreamResult result = new StreamResult(file);


try {


transformer.transform(source, result);


} catch (TransformerException e) {


e.printStackTrace();


}


在 Activity 中输入内容后,点击 Button 提交后,在/sdcard/zhoumushui/android.xml 文件中显示以下信息:


<?xml version="1.0" encoding="UTF-8"?>


<roottag>


<infotag>


<name>zhoumushui</name>


<url>blog.csdn.net/zhoumushui</url>


</infotag>


</roottag>


成功实现了将数据存储到 XML 文件中,下面看一下怎么用 DOM 读取 XML 中的信息:


if (!Environment.getExternalStorageState().equals(


Environment.MEDIA_MOUNTED)) {


return;


}


File file = new File(Environment.getExternalStorageDirectory()


.toString()


  • File.separator

  • "zhoumushui"

  • File.separator + "android.xml");


if (!file.exists()) {


return;


}


// 建立 DocumentBuilderFactory,以用于取得 DocumentBuilder


DocumentBuilderFactory factory = DocumentBuilderFactory


.newInstance();


// 通过 DocumentBuilderFactory 取得 DocumentBuilder


DocumentBuilder builder = null;


try {


builder = factory.newDocumentBuilder();


} catch (ParserConfigurationException e) {


e.printStackTrace();


}


// 定义 Document 接口对象,通过 DocumentBuilder 类进行 DOM 树的转换操作


Document doc = null;


try {


doc = builder.parse(file); // 读取指定路径的 xml 文件


} catch (SAXException e) {


e.printStackTrace();


} catch (IOException e) {


e.printStackTrace();


}


NodeList nodeList = doc.getElementsByTagName("infotag");


// 输出 NodeList 中第一个子节点中文本节点的内容


for (int x = 0; x < nodeList.getLength(); x++) { // 循环输出节点内容


Element e = (Element) nodeList.item(x); // 取得每一个元素


MyDOMDemo.this.name.setText(e.getElementsByTagName("name")


.item(0).getFirstChild().getNodeValue()); // 设置文本


MyDOMDemo.this.email.setText(e.getElementsByTagName("url")


.item(0).getFirstChild().getNodeValue()); // 设置文本


}


这样就可以读取到刚刚存储到 android.xml 文件中的内容了。


下面看一下另外一种解析方式 SAX 获得 xml 中内容的处理方法:


Activity 中的内容与 DOM 类似:


if (!Environment.getExternalStorageState().equals(


Environment.MEDIA_MOUNTED)) {


return;


}


File file = new File(Environment.getExternalStorageDirectory()


.toString()


  • File.separator

  • "zhoumushui"

  • File.separator + "android.xml");


if (!file.exists()) {


return;


}


SAXParserFactory factory = SAXParserFactory.newInstance();


SAXParser parser = null;


MySAX mySax = new MySAX();


try {


parser = factory.newSAXParser();


} catch (Exception e) {


e.printStackTrace();


}


try {


parser.parse(file, mySax);


} catch (Exception e) {


e.printStackTrace();


}


List<LinkMan> all = mySax.getAll();


name.setText(all.get(0).getName());


url.setText(all.get(0).getUrl());


MySAX 类继承自 org.xml.sax.helpers.DefaultHandler :


public class MySAX extends DefaultHandler {


private List<LinkMan> all = null;


private String elementName = null;


private LinkMan linkMan = null;


@Override


public void startDocument() throws SAXException {


this.all = new ArrayList<LinkMan>();


}


@Override


public void startElement(String uri, String localName, String name,


Attributes attributes) throws SAXException {


if ("infotag".equals(localName)) {


this.linkMan = new LinkMan();


}


this.elementName = localName;


}


@Override


public void characters(char[] ch, int start, int length)


throws SAXException {


if (this.elementName != null) {


String data = new String(ch, start, length);


if ("name".equals(this.elementName)) {


this.linkMan.setName(data);


} else if ("url".equals(this.elementName)) {


this.linkMan.setUrl(data);


}


}


}


@Override


public void endElement(String uri, String localName, String name)


throws SAXException {


if ("linkman".equals(localName)) {


this.all.add(this.linkMan);


this.linkMan = null;


}


this.elementName = null;


}


public List<LinkMan> getAll() {


return this.all;


}


}


这两天开始开始忙起来了,做一些 mediaTek 编译和固件的事情,还有 Qualcomm 的初步熟悉和部分源码了解。今晚还要赶一下月度述职报告,就先这样了。


5.初识 Media 类的 EXTERNAL_CONTENT_URI 和 INTERNAL_CONTENT_URI


今天有个客户需求,要内置一个不可删除的视频。


不可删除的话,不能在设备中删除,USB 连接电脑也不能删除。那么直接放到 system/media/下好了,这样对用户就完全不可见了,这样还不行,完全不可见,就失去了内置视频的意义,所以我们还要在视频播放器中显示出来,这就要修改播放器的源码,让播放器读取 Internal 的媒体文件即可。


adb shell,查看如下目录


/data/data/com.android.providers.media/databases/


可以看到有两个数据库文件:external.db 和 internal.db:

评论

发布
暂无评论
Android 常见的数据存储方式,腾讯T2大佬手把手教你