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

既然是要做一个人物的信息卡包,那就要用到人物信息数据。为了方便查询和添加,应用中打算采用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布局。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值