安卓下的存储案例


Android下的文件的存储案例(此处以qq登录界面的帐号和密码的保存作为实例)

首先是res/layout/activity_main.xml中的代码:

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

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    android:gravity="center_horizontal"

    tools:context=".MainActivity" >

    

    <ImageView 

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:src="@drawable/qq"

        />

 

    <EditText 

        android:id="@+id/et_qq"

        android:inputType="number"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:hint="请输入QQ"

        />

    <EditText 

        android:id="@+id/et_password"

        android:inputType="textPassword"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:hint="请输入密码"

        />

    <CheckBox 

        android:id="@+id/cb_remember"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="记住密码"

        />

    <Button 

        android:onClick="loginQQ"

        android:layout_width="200dp"

        android:layout_height="wrap_content"

        android:text="登录"

        />

</LinearLayout>

可以实现如下的qq登录的界面:

 

实现代码的编写:

package com.itcast.FileStoreSubmit;

import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;

import android.view.View;

import android.widget.CheckBox;

import android.widget.EditText;

import android.widget.Toast;

public class MainActivity extends Activity {

private EditText et_qq;

private EditText et_password;

private CheckBox cb_remember;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

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

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

cb_remember= (CheckBox) findViewById(R.id.cb_remember);

}

public void loginQQ(View view){

String qq = et_qq.getText().toString().trim();

String password = et_password.getText().toString().trim();

if(qq.equals("")||password.equals("")){

Toast.makeText(this, "qq号或者密码不能为空", 0).show();

return;

}

if(cb_remember.isChecked()){

System.out.println("保存qq和密码");

}else{

System.out.println("不需要保存密码和qq");

}

}

}

以上只是简单的实现qq的登录界面,下面实现数据的保存:

public class MainActivity extends Activity {

private EditText et_qq;

private EditText et_password;

private CheckBox cb_remember;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

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

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

cb_remember= (CheckBox) findViewById(R.id.cb_remember);

}

public void loginQQ(View view){

String qq = et_qq.getText().toString().trim();

String password = et_password.getText().toString().trim();

if(qq.equals("")||password.equals("")){

Toast.makeText(this, "qq号或者密码不能为空", 0).show();

return;

}

if(cb_remember.isChecked()){

System.out.println("保存qq和密码");

}else{

System.out.println("不需要保存密码和qq");

}

try {

//File file=new File("zpf.txt");//这样保存会出错应该写成/data/data/包名/路径名...

File file=new File("/data/data/com.itcast.FileStoreSubmit/zpf.txt");

FileOutputStream fos=new FileOutputStream(file);

fos.write((qq+"##"+password).getBytes());

fos.close();

Toast.makeText(this,"qq和密码保存成功",0).show();

}catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

Toast.makeText(this,"qq和密码保存失败",0).show();

}

}

}

注意:无论此处是否勾选了”保存密码”的勾选框,输入的qq和密码都会被保存下来!但是退出程序后再次进入界面如下:

 

接下来实现退出qq,下次进入qq登录界面后,依旧有上次保存的qq和密码的操作,即是将保存的数据回写到文本框.

代码如下:

public class MainActivity extends Activity {

private EditText et_qq;

private EditText et_password;

private CheckBox cb_remember;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

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

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

cb_remember= (CheckBox) findViewById(R.id.cb_remember);

File file=new File("/data/data/com.itcast.FileStoreSubmit/qwer.txt");

if(file.isFile()&&file.length()>0){

try {

FileInputStream fis=new FileInputStream(file);

BufferedReader br=new BufferedReader(new InputStreamReader(fis));

String string = br.readLine();

String qq=string.split("##")[0];

String password=string.split("##")[1];

et_qq.setText(qq);

et_password.setText(password);

}catch (IOException e) {

e.printStackTrace();

}

}

}

public void loginQQ(View view){

String qq = et_qq.getText().toString().trim();

String password = et_password.getText().toString().trim();

if(qq.equals("")||password.equals("")){

Toast.makeText(this, "qq号或者密码不能为空", 0).show();

return;

}

if(cb_remember.isChecked()){

//System.out.println("保存qq和密码");

try {

//File file=new File("zpf.txt");//这样保存会出错应该写成/data/data/包名/路径名...

File file=new File("/data/data/com.itcast.FileStoreSubmit/qwer.txt");

FileOutputStream fos=new FileOutputStream(file);

fos.write((qq+"##"+password).getBytes());

fos.close();

Toast.makeText(this,"qq和密码保存成功",0).show();

}catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

Toast.makeText(this,"qq和密码保存失败",0).show();

}

}else{

Toast.makeText(this, "没有保存qq和密码", 0).show();

}

}

}

Runas android project之后:

输入qq和密码,并且选择不勾选保存密码的选框:

 

DDMS中并没有找到”qwer.txt”文件:

 

接下来重新runas  android project,这次选择保存qq和密码:

 

QQ和密码保存了,推出后再进入的界面如下:

 

可以看到数据已经保存,并且回写到了文本框.but,这里任然有一个小小的bug存在,如果第一次登录的时候记录了密码,qq和密码保存了下来,第二次登录选择不记住密码,登陆后出现未保存密码的Toast,退出后继续登录,qq帐号和密码又会保存下来!!!

针对这个bug,联想一下腾讯qq的登录(如果是记住密码,推出后下次登录,qq和密码都存在,如果是不记住密码,仍然会保存qq ),这里做以下处理:

=======================qq和密码保存的改进=======================

1.File file=newFile("/data/data/com.itcast.FileStoreSubmit/qwer.txt");

这种方式的保存并不可取,因为不同的手机生产商给出的路径不一样,所以路径选择用File file=new File(getFilesDir(),"gg.txt");或者

File file=new File(getCacheDir(),"gg.txt");这两种方式.前者删除的时候会有一个”确认”的提示框,后者不需要任何提示直接删除.

2.FileOutputStreamFileInputStream方式的保存(读取的时候用了”##”来切割保存的数据),如果在密码中出现了”##”这样的特殊字符就会出现问题,因此针对此方法有了sharedpreferences.保存的是xml文件,在写文件路径的时候不需要加.xml后缀名.

 

=====================================day03=====================================

一.利用StringBuilder生成xml文件,注意添加的时候标签成对存在.

二.StringBuilder生成xml文件,在窗口输入特殊字符的时候eg:”</...”;会因为xml格式里面的<></>出现异常匹配.从而导致数据的保存不成功.利用xml序列化器生成xml文件可以解决这个问题!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值