项目开发,我的名字不可能这么可爱——使用XML和Sqlite处理数据

来源:互联网 发布:centos一键搭建squid 编辑:程序博客网 时间:2024/04/28 23:20

既然是要做一个人物的信息卡包,那就要用到人物信息数据。为了方便查询和添加,应用中打算采用Sqlite来保存数据。最初的一部分原始数据用XML保存在assets中。既然如此,这篇文章就是关于XML文件的解析和Sqlite的数据库的使用了。

1、XML文件的解析

首先是自己通过文本编辑器准备了一份人物信息的XML文件,再通过代码解析。XML文件如下:

<?xml version="1.0" encoding="utf-8"?><persons>    <person>        <name>真红</name>        <introduce>是蔷薇少女中的第五人偶,第一个与樱田纯缔结契约的蔷薇少女。拥有透彻如宝石蓝的眼睛与末端呈螺旋状的金色双马尾,身着深红色维多利亚风与拿破仑式结合的服装。</introduce>        <label>蔷薇少女</label>    </person>    <person>        <name>水银灯</name>        <introduce>蔷薇少女第一人偶,性格孤傲,与其它人偶不和,战斗中经常展现出冷酷无情的一面。相当敢爱敢恨,为了自己所爱的人可以不惜一切。</introduce>        <label>蔷薇少女</label>    </person>    <person>        <name>雏梅</name>        <introduce>雏莓是蔷薇少女中的第六人偶,可爱十足,天真烂漫,心地善良,人工精灵是莓铃(ベリーベル),代表色为粉红色。</introduce>        <label>蔷薇少女</label>    </person>    <person>        <name>翠星石</name>        <introduce>翠星石是蔷薇少女中的第三人偶。人工精灵是水之梦(甜蜜梦境)。左眼是翡翠绿,右眼是宝石红,穿着巴伐利亚风格的公主裙。</introduce>        <label>蔷薇少女</label>    </person>    <person>        <name>苍星石</name>        <introduce>苍星石是蔷薇少女中第四位人偶,人工精灵是琅碧卡Lempicka)。左眼为宝石红,右眼为翡翠绿,穿着巴伐利亚风格的王子装。</introduce>        <label>蔷薇少女</label>    </person>    <person>        <name>金丝雀</name>        <introduce>金丝雀是蔷薇少女中的第二人偶。擅长使用小提琴进行波音攻击,因此十分擅长小提琴(可变幻为飞行西洋伞),人工精灵是拨弦(ピチカート)。</introduce>        <label>蔷薇少女</label>    </person>    <person>        <name>蔷薇水晶</name>        <introduce>蔷薇水晶是由槐制作的人偶。最大的特色是眼睛上的紫色蔷薇造型的眼罩,有着异于其他人偶的衣物造型风格。</introduce>        <label>蔷薇少女</label>    </person>    <person>        <name>雪华绮晶</name>        <introduce>雪华绮晶蔷薇少女第七人偶,代表色是白色(白蔷薇)。</introduce>        <label>蔷薇少女</label>    </person></persons>
XML文件实际上是由一系列的标签组成的。首先在最外层的<persons>和</persons>是XML文件开始的标签,<person>和</person>标签对应了一个具体的对象,其里面的<name>、<introduce>等标签则对应了对象的每个属性。说到这里,XML文件的解析应该就非常清楚了,实际的解析过程如下:

public List<Person> parse(InputStream is) throws Exception {    List<Person> persons = null;    Person person = null;    XmlPullParser parser = Xml.newPullParser();    parser.setInput(is, "UTF-8");    int eventType = parser.getEventType();    while (eventType != XmlPullParser.END_DOCUMENT) {        switch (eventType) {            case XmlPullParser.START_DOCUMENT:                persons = new ArrayList<Person>();                break;            case XmlPullParser.START_TAG:                if ("person".equals(parser.getName())) {                    person = new Person();                } else if ("name".equals(parser.getName())) {                    eventType = parser.next();                    person.setName(parser.getText());                } else if("introduce".equals(parser.getName())) {                    eventType = parser.next();                    person.setIntroduce(parser.getText());                } else if ("label".equals(parser.getName())) {                    eventType = parser.next();                    person.setLabel(parser.getText());                }                break;            case  XmlPullParser.END_TAG:                if ("person".equals(parser.getName())) {                    persons.add(person);                    person = null;                }                break;        }        eventType = parser.next();    }    return persons;}
这里传入的InputStrem是用来读入XML文件的,本应用中将XML文件放在assets中,因此可以使用getAssets().open("persons.xml")方法来得到一个InputStream。首先通过Xml.newPullParser()获取一个xml解析器,通过该解析器去依次获取XML文件的每个标签,直到读取到文件结束标签为止。

2、Sqlite数据库的使用

首先创建一个PersonDBHelper类,用来创建和更新数据库:

public class PersonDBHelper extends SQLiteOpenHelper {    private static final String DB_NAME = "person.db";    private static final int VERSION = 1;    private static final String SQL_CREATE = "create table person (" +                                        "name text, introduce text, label text)";    private static final String SQL_DELETE = "drop table person";    public PersonDBHelper(Context context) {        super(context, DB_NAME, null, VERSION);    }    @Override    public void onCreate(SQLiteDatabase db) {        db.execSQL(SQL_CREATE);    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        db.execSQL(SQL_DELETE);        db.execSQL(SQL_CREATE);    }}
再创建一个DBOperator类用来实现数据库的增、删、改、查操作:

public class DBOperator {    private static final String SQL_INSERT = "insert into person (name, introduce, label) values (?, ?, ?)";    private static final String SQL_DELETE = "delete from person where name = ?";    private static final String SQL_UPDATE = "update person set label = ? where person = ?";    private static final String SQL_SELECT = "select * from person where label = ?";    private PersonDBHelper dbHelper;    public DBOperator(Context context) {        dbHelper = new PersonDBHelper(context);    }    public void insert(Person person) {        SQLiteDatabase db = dbHelper.getWritableDatabase();        db.execSQL(SQL_INSERT, new Object[] {            person.getName(), person.getIntroduce(), person.getLabel()        });        db.close();    }    public void delete(String name) {        SQLiteDatabase db = dbHelper.getWritableDatabase();        db.execSQL(SQL_DELETE, new Object[] {                name        });        db.close();    }    public void update(String label, String name) {        SQLiteDatabase db = dbHelper.getWritableDatabase();        db.execSQL(SQL_UPDATE, new Object[]{                label, name        });        db.close();    }    public List<Person> select(String label) {        ArrayList<Person> persons = new ArrayList<>();        SQLiteDatabase db = dbHelper.getReadableDatabase();        Cursor cursor = db.rawQuery(SQL_SELECT, new String[]{                label        });        int nameCol = cursor.getColumnIndex("name");        int introduceCol = cursor.getColumnIndex("introduce");        while (cursor.moveToNext()) {            String name = cursor.getString(nameCol);            String introduce = cursor.getString(introduceCol);            Person person = new Person(name, introduce, label);            persons.add(person);        }        cursor.close();        db.close();        return persons;    }    public boolean isRecordEmpty(String label) {        List<Person> persons = select(label);        if (persons == null) {            return true;        }        return false;    }}
这里用到的主要都是SQL语法的一些知识,大家可以参考着SQL语句来写。当然,Android也提供了封装好的方法,大家也可以试着使用。

呃,突然就写完了(没写够啊!喂!)。好吧,这个应用果然够简单的:)。下一篇开始介绍material design布局。

0 0