Android 常见的数据存储方式,2024Android大厂高频面试题

本文介绍了在Android应用中如何进行基础文件操作,如读取文件,以及JSON数据的解析与封装,还涉及了DOM和SAX解析XML的方法。作者分享了自己的开发经验和资源,以帮助Android工程师提升技能。
摘要由CSDN通过智能技术生成

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

super.setContentView(R.layout.main); // 调用布局文件

this.msg = (TextView) super.findViewById(R.id.msg) ;

FileInputStream input = null; // 文件输入流

try { // 找到指定文件的输入流对象

input = super.openFileInput(FILENAME);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

Scanner scan = new Scanner(input) ; // 定义Scanner

while(scan.hasNext()){ // 循环读取

this.msg.append(scan.next() + “\n”) ; // 设置文本

}

scan.close() ; // 关闭输入流

}

这样就可以实现一些基本的文件操作,目前还没有写关于文件操作比较复杂的Demo,想深入了解的朋友可以看一下GitHub上小米的“ MIUI文件管理器社区开源版“。

今天就先这样,去学习了。

3.JSON数据的解析与封装

今天早早的下班了,写了一个简单的JSON Demo,这里总结一下。

首先是效果图:

简单起见,解析部分并没有采用解析URL的方式,直接把JSON写到String里,逻辑比较简单,这里就不啰嗦了,上代码:

package com.example.jsondemo;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;

import android.app.Activity;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;

public class Main extends Activity {

// private static final String BASE_URL =

// “http://zhoumushui.sinaapp.com/json/”;

private TextView tvMsg;

private TextView tvJson;

private EditText etName;

private EditText etAge;

private String strJson = “”;

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” />

<TextView

android:id=“@+id/tvJson”

android:layout_width=“fill_parent”

android:layout_height=“wrap_content” />

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 = 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);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-F5XNM7ao-1710915790862)]
[外链图片转存中…(img-PL4A8b33-1710915790863)]
[外链图片转存中…(img-cpNo8s3H-1710915790863)]
[外链图片转存中…(img-vipvA4bQ-1710915790864)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-Zmv9wCER-1710915790864)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值