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我。看到的话会回来改的。
用户评论