您的位置:首页 > 数据库

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

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

4000
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布局。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息