欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > 内容正文

Android使用xml存储数据和读取(xml序列化和解析),importandr

来源: 开发者 投稿于  被查看 42380 次 评论:45

Android使用xml存储数据和读取(xml序列化和解析),importandr


提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

一、创建一个存储页面

二、创建一个读取页面

三、增加权限和创建asstes资源文件

 四、创建service类和工具类(重点)

总结


一、创建一个存储页面

layout界面如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp"
    android:background="#E6E6E6">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:background="@android:color/white"
        android:orientation="horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:text="账号:"
            android:textColor="#000"
            android:textSize="20sp" />
        <EditText
            android:hint="输入的是数字"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/et_username"
            android:layout_marginLeft="5dp"
            android:background="@null"
            android:padding="10dp"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:background="@android:color/white"
        android:orientation="horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/tv_password"
            android:padding="10dp"
            android:text="密码:"
            android:textSize="20sp"
            android:textColor="#000"/>
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/et_password"
            android:layout_marginLeft="5dp"
            android:background="@null"
            android:inputType="textPassword"
            android:padding="10dp"/>
    </LinearLayout>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btn_login"
        android:text="注册"
        android:layout_marginTop="25dp"
        android:background="#3c8dc4"
        android:textColor="@android:color/white"
        android:textSize="20sp"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btn_cancel"
        android:text="返回"
        android:layout_marginTop="25dp"
        android:background="#3c8dc4"
        android:textColor="@android:color/white"
        android:textSize="20sp"/>



</LinearLayout>

 activity代码如下

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.util.Xml;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import com.example.mydownload.R;
import com.example.mydownload.entity.Person;

import org.xmlpull.v1.XmlSerializer;

import java.io.File;
import java.io.FileOutputStream;

public class RegisterActivity extends AppCompatActivity implements View.OnClickListener{

    private EditText username, paswd;
    private Button button, cancel;
    private static final int REQUEST_CODE = 1024;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        init();
        requestPermission();
        cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(RegisterActivity.this, SuccessActivity.class);
                startActivity(intent);
            }
        });
    }

    //组件初始化
    public void init(){
        username = (EditText) findViewById(R.id.et_username);
        paswd = (EditText) findViewById(R.id.et_password);
        button = (Button) findViewById(R.id.btn_login);
        cancel = (Button) findViewById(R.id.btn_cancel);
        button.setOnClickListener(this);
    }
    //点击事件
    @Override
    public void onClick(View view) {

        switch(view.getId()){

            case R.id.btn_login:
                String name_str =username.getText().toString();
                String paswd_str =paswd.getText().toString();
                //TODO 创建Person对象
                Person person = new Person(1,name_str,paswd_str);

                //将Person对象保存为XML格式

                try{
//                    getExternalFilesDir(null);
                    File file= new File(Environment.getExternalStorageDirectory(),
                            "person_mes.xml");
                    FileOutputStream fi_out = new FileOutputStream(file);
                    //如果运行报错,就把上面两行注释,使用下面一行的语句
//                    FileOutputStream fi_out = RegisterActivity.this.openFileOutput("person_mes.xml", Context.MODE_PRIVATE);

                    //XML文件生成器
                    XmlSerializer serializer= Xml.newSerializer();
                    serializer.setOutput(fi_out,"UTF-8");
                    serializer.startDocument("UTF-8",true);

                    serializer.startTag(null,"persons");
                    serializer.startTag(null,"person");

                    //将Person对象的用户名属性写人
                    serializer.startTag(null,"name");
                    serializer.text(person.getUsername());
                    serializer.endTag(null,"name");

                    //将Person对象的密码写人
                    serializer.startTag(null,"password");
                    serializer.text(person.getPaswd());
                    serializer.endTag(null,"password");

                    //结束标签
                    serializer.endTag(null,"person");
                    serializer.endTag(null,"persons");
                    serializer.endDocument();
                    serializer.flush();
                    fi_out.close();
                    Toast.makeText(this,"注册成功",Toast.LENGTH_SHORT).show();

                }catch(Exception e){
                    e.printStackTrace();
                    System.out.println("序列化错误");
                    Toast.makeText(this,"注册失败",Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                break;
        }
    }

    //权限申请
    private void requestPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // 先判断有没有权限
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
                    ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                writeFile();
            } else {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
            }
        } else {
            writeFile();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CODE) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
                    ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                writeFile();
            } else {
                //
                System.out.println("写入失败");
            }
        }
    }

    /**
     * 模拟文件写入
     */
    private void writeFile() {
        System.out.println("写入成功");
    }
}

二、创建一个读取页面

layout界面如下

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_success"
    android:layout_width="match_parent"
    android:layout_height="match_parent"


    tools:context="com.example.mydownload.activity.SuccessActivity">



    <TextView
        android:id="@+id/info_username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Text Test:"
        android:textSize="30sp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

    <TextView
        android:id="@+id/info_password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Text Test:"
        android:textSize="30sp"
        android:layout_marginTop="36dp"
        android:layout_below="@+id/info_username"
        android:layout_alignLeft="@+id/info_username"
        android:layout_alignStart="@+id/info_username" />

    <TextView
        android:id="@+id/info_sex"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Text Test:"
        android:textSize="30sp"
        android:layout_marginTop="36dp"
        android:layout_below="@+id/info_password"
        android:layout_alignLeft="@+id/info_password"
        android:layout_alignStart="@+id/info_password" />

    <TextView
        android:id="@+id/info_spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Text Test:"
        android:textSize="30sp"
        android:layout_marginTop="36dp"
        android:layout_below="@+id/info_sex"
        android:layout_alignLeft="@+id/info_sex"
        android:layout_alignStart="@+id/info_sex" />

    <Button
        android:id="@+id/bb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="查看图片"
        android:textSize="30sp"
        android:layout_marginTop="36dp"
        android:layout_below="@+id/info_spinner"
        android:layout_alignLeft="@+id/info_spinner"
        android:layout_alignStart="@+id/info_spinner" />


</RelativeLayout>

 activity代码如下

package com.example.mydownload.activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.example.mydownload.R;
import com.example.mydownload.Service.PersonService;
import com.example.mydownload.entity.Person;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class SuccessActivity extends Activity {
    Button button;
    TextView tv1,tv2,tv3,tv4;
    String sex,username,password;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_success);

        tv1=(TextView)findViewById(R.id.info_username);
        tv2=(TextView)findViewById(R.id.info_password);
        tv3=(TextView)findViewById(R.id.info_sex);
        tv4=(TextView)findViewById(R.id.info_spinner);

        InputStream xml= this.getClass().getClassLoader().getResourceAsStream("assets/student.xml");
        List< Person> persons = null;
        try {
            persons = PersonService.getPersons(xml);
        } catch (XmlPullParserException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        for(Person person:persons){
            Toast.makeText(this,person.getUsername(),Toast.LENGTH_SHORT).show();
            tv1.setText("你的姓名是 " +person.getUsername());
            tv2.setText("你的Id是 "+person.getId());
            tv3.setText("你的密码是 "+person.getPaswd());
//            tv4.setText("你的专业是 " + text);
            try {
                Thread.sleep(1 * 1000); // 暂停1秒
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }


        button = findViewById(R.id.bb);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(SuccessActivity.this, MainActivity.class);
                startActivity(intent);
            }
        });


    }
}

三、增加权限和创建asstes资源文件

在AndroidManifest.xml文件中添加以下两段代码

    <!--     读写权限-->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<!--跳转页面-->

        <activity android:name=".activity.SuccessActivity"/>

 创建assets文件

 在asstes文件中创建一个xml文件(这个xml文件被用来读取数据)

<?xml version="1.0" encoding="utf-8" ?>
<persons>
    <person id = "1">
        <name>twk</name>
        <age>22</age>
    </person>

    <person id = "2">
        <name>xk</name>
        <age>21</age>
    </person>
</persons>

 四、创建service类和工具类(重点)

代码如下:

personService类

作用:读取xml的内容(被SuccessActivity调用)。

import android.util.Xml;

import com.example.mydownload.entity.Person;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class PersonService {
    public static List<Person> getPersons(InputStream xml) throws IOException, XmlPullParserException{

        List <Person> persons = null;
        Person person = null;
        XmlPullParser pullParser = Xml.newPullParser();
        try{

            //为PULL解析器设置要解析的XML数据
            pullParser.setInput(xml,"UTF-8");
            int event= pullParser.getEventType();
            while(event!= XmlPullParser.END_DOCUMENT){
                switch (event){
                    case XmlPullParser.START_DOCUMENT:
                        persons = new ArrayList< Person >();
                        break;
                    case XmlPullParser.START_TAG:
                        if("person".equals(pullParser.getName())){
                            int id = new Integer(pullParser.getAttributeValue(0));
                            person = new Person();
                            person.setId(id);
                        }
                        if("name".equals(pullParser.getName())){
                            String name= pullParser.nextText();
                            person.setUsername(name);
                        }
                        if("age".equals(pullParser.getName())){
                            String age = pullParser.nextText();
                            person.setPaswd(age);
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if("person".equals(pullParser.getName())){
                            persons.add(person);
                            person= null;
                        }
                        break;
                }
                event = pullParser.next();
            }
        }catch(XmlPullParserException e){
            e.printStackTrace();
        }
        return persons;
    }
}

 实体类

这个实体类乱写的,可以按照需求改一点。(能运行就行了)

package com.example.mydownload.entity;

public class Person {

    private Integer id;

    private String username;
    private String paswd;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPaswd() {
        return paswd;
    }

    public void setPaswd(String paswd) {
        this.paswd = paswd;
    }



    public Person() {
    }

    public Person(Integer id, String username, String paswd) {
        this.id = id;
        this.username = username;
        this.paswd = paswd;
    }
}


总结

没啥总结的,如果运行不成功那就评论区dd我。看到的话会回来改的。

相关频道:

用户评论