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