Android03

Android03

sharedpreference保存数据

1.获取sp = getSharedPreferences("config", 0);

2.获取编辑器 Editor editor = sp.edit();

3.editor.putString(key, value); 

4.editor.commit();

5.获取数据 sp.getString(key ,dafvalue); sp.getInt()...

利用sp开发一个设置功能

1.UI界面

<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"
    tools:context=".MainActivity" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="65dp" >

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"
            android:text="是否开启音效"
            android:textSize="22sp" />

        <CheckBox
            android:id="@+id/checkBox1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="8dp" />
    </RelativeLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#11000000" />

    <SeekBar
        android:id="@+id/seekBar1"
        android:layout_width="278dp"
        android:layout_height="wrap_content"
        android:max="100" />

</LinearLayout>

2.逻辑

public class MainActivity extends Activity {

    protected static final String TAG = "MainActivity";
    private CheckBox cb;
    private SeekBar seekBar;
    private SharedPreferences sp;

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

        cb = (CheckBox) findViewById(R.id.checkBox1);
        seekBar = (SeekBar) findViewById(R.id.seekBar1);

        sp = this.getSharedPreferences("config", 0);
        //回显复选框
        boolean isChecked = sp.getBoolean("isChecked", false);
        cb.setChecked(isChecked);

        //回显进度条
        int progress=sp.getInt("progress", 0);
        seekBar.setProgress(progress);

        cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                Log.i(TAG, "当前状态是:"+isChecked);
                Editor edit = sp.edit();
                edit.putBoolean("isChecked", isChecked);
                edit.commit();
            }
        });

        seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                int progress = seekBar.getProgress();
                Log.i(TAG,"当前进度"+progress);
                Editor edit = sp.edit();
                edit.putInt("progress", progress);
                edit.commit();
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }

            @Override
            public void onProgressChanged(SeekBar seekBar, int progress,
                    boolean fromUser) {
            }
        });
    }
}

利用stringbuilder生成xml文件

/*
    <?xml version="1.0" encoding="utf-8"?>
    <student>
        <name>zhangsan</name>
        <number>s001</number>
        <sex>male</sex>
    </student>
 */
StringBuilder sb = new StringBuilder();
sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
sb.append("<student>");
sb.append("<name>");
sb.append(name);
sb.append("</name>");

sb.append("<number>");
sb.append(num);
sb.append("</number>");

sb.append("<sex>");
sb.append(sex);
sb.append("</sex>");
sb.append("</student>");

try {
    File file = new File(getFilesDir(), name+".xml");
    FileOutputStream os = new FileOutputStream(file);
    os.write(sb.toString().getBytes());
    os.close();
    Toast.makeText(this, "数据保存成功", 0).show();
} catch (Exception e) {
    Toast.makeText(this, "数据保存失败", 0).show();
    e.printStackTrace();
}

}

stringbuilder生成xml文件注意的问题

输入时 张三

采用xml序列化器生成xml文件

1.得到xml文件的序列化器

XmlSerializer serializer = Xml.newSerializer();

2.指定序列化器的一些初始参数

File file = new File(getFilesDir(), name+".xml");
FileOutputStream os = new FileOutputStream(file);
serializer.setOutput(os, "utf-8");      

3.写xml文件

serializer.startDocument("utf-8", true);写开头
serializer.startDocument("utf-8", null);也可以
serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);

serializer.endDocument();写结束
serializer.startTag(null, "number");开始标签
serializer.endTag(null, "number");结束标签
serializer.text();写文本标签
serializer.attribute(namespace, name, value);写属性

xml文件的解析

*SAX

*DOM & DOM4J

*PULL解析

//1.获取到一个xml解析器
XmlPullParser parser = Xml.newPullParser();
//2.设置解析器的初始参数
FileInputStream inputStream = new FileInputStream(file);
parser.setInput(inputStream, "utf-8");
//3.解析xml文件
XmlPullParser.START_TAG;开始节点
XmlPullParser.END_TAG;结束节点
parser.nextText();2个节点中的值
parser.getName();获取当前节点的名称
parser.next();让解析器解析下一个节点

采用调试的方式观察pull解析的流程

一步一步调试就行

需求

完成本地的XML文件解析

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

        TextView tv = (TextView) this.findViewById(R.id.textView1);
//      <?xml version="1.0" encoding="gbk"?>
//      <smartresult>
//          <product type="mobile">
//                  <phonenum>13512345678</phonenum>
//                  <location>重庆移动神州行卡</location>
//                  <phoneJx>有得有失,华而不实,须防劫财,始保平安 吉带凶</phoneJx>
//          </product>
//      </smartresult>

        try {
            StringBuilder sb = new StringBuilder();
            InputStream is = this.getAssets().open("local.xml");
            XmlPullParser parser = Xml.newPullParser();
            parser.setInput(is, "utf-8");

            int type =XmlPullParser.START_DOCUMENT; 
            while ((type  = parser.getEventType())!=XmlPullParser.END_DOCUMENT) {
                if (type == XmlPullParser.START_TAG) {
                    if ("phonenum".equals(parser.getName())) {
                        sb.append("电话:"+parser.nextText()+"\n");
                    } else if ("location".equals(parser.getName())) {
                        sb.append("地址:"+parser.nextText()+"\n");
                    }else if ("phoneJx".equals(parser.getName())) {
                        sb.append("数据:"+parser.nextText()+"\n");
                    }
                } 
                parser.next();
            }

            tv.setText(sb.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Android下如何创建数据库

sqlite

开源项目,c,嵌入式轻量级数据库

java中创建文件,类比Android创建数据文件

//文件的帮助类,得到一个文件的引用,如果文件不存在,第一行代码.第一行代码执行文件不会被创建
File file = new File("文件的名称.db");
file.createNewFile();//创建文件 
//2.通过输出流向文件写数据
FileOutputStream fos = new FileOutputStream(file);
fos.write("hello".getBytes());
fos.close();

如何创建数据库

1.定义一个数据库创建的帮助类

MyDataBaseOpenHelper extends SQLiteOpenHelper

2.指定数据库文件的名称,数据库的版本号,默认的游标工厂

3.通过helper得到一个可写或者是可读的数据库,数据库才会被创建

helper.getWritableDatabase();

注意点

1. 写一个类继承SQLiteOpenHelper
2. 重写构造方法 参数是上下文
3. 从写方法onCreate() onUpgrade()

onCreate是数据库第一次被创建的时候调用,这个方法只执行一次
onUpgrade是数据库需要被更新的时候被调用,只能升级不能降级

创建数据库的表结构

public class StudentDBOpenHelper extends SQLiteOpenHelper {

    public StudentDBOpenHelper(Context context) {
        super(context, "info.db ", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table student (_id integer primary key autoincrement ,name varchar(20) ,sex varchar(6))");
    }   
}

数据库的升级更新

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    System.out.println("数据库 onUpgrade");
    db.execSQL("alter table student add account varchar(20)");
}

数据库的增删改查的sql语句

*增

insert into student (name , phone) values ('张三','100');

*删

delete from student where name='张三';

*改

update student set phone = '119' where name='张三';

*查

select * from student;

数据库的增删改查的实现

public class StudentDao {

    private StudentDBOpenHelper helper;


    public StudentDao(Context context) {
        helper = new StudentDBOpenHelper(context);
    }

    public void add(String name, String sex) {
        SQLiteDatabase db = helper.getWritableDatabase();
        db.execSQL("insert into student (name , sex) values (?,?)",
                new Object[] { name, sex });
        db.close();
    }

    public void delete(String name) {
        SQLiteDatabase db = helper.getWritableDatabase();
        db.execSQL("delete from student where name=?", new Object[] { name });
        db.close();

    }

    public void update(String name, String newSex) {

        SQLiteDatabase db = helper.getWritableDatabase();
        db.execSQL("update student set sex = ? where name=?", new Object[] {
                newSex,name  });
        db.close();
    }

    public String find(String name) {
        String sex = null;
        SQLiteDatabase db = helper.getReadableDatabase();
        Cursor cursor = db.rawQuery("select sex from student where name = ?",
                new String[] { name });
        boolean result = cursor.moveToNext();
        if (result) {
            sex = cursor.getString(0);
        }
        cursor.close();
        db.close();
        return sex;
    }
}

对增删改查的方法进行单元测试

Junit

1. 写个类,继承AndroidTestCase
2. 写方法 public throws Exception
3. 清单文件添加 测试框架和测试指令集
public class TestStdentDao extends AndroidTestCase {

    public void testAdd() throws Exception{
        StudentDao dao = new StudentDao(getContext());
        dao.add("zhangsan", "male");
    }
    public void testDelete() throws Exception{
        StudentDao dao = new StudentDao(getContext());
        dao.delete("zhangsan");
    }
    public void testUpdate() throws Exception{
        StudentDao dao = new StudentDao(getContext());
        dao.update("zhangsan", "female");
    }

    public void testfind() throws Exception{
        StudentDao dao = new StudentDao(getContext());
        String sex = dao.find("zhangsan");
        if (TextUtils.isEmpty(sex)) {
            System.out.println("学生不存在");
        }else{
            System.out.println("学生的性别为:"+sex);
        }
    }
}

采用命名行查看sqlite数据库的内容

cmd
adb shell
cd data/data/com.xxx.studentinfosystem
ls -l
cd databases
ls -l
sqlite3 info.db
选择编码utf-8
chcp 65001
选择字体 Lucida Console
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值