从xml文件填充sqlite数据库不正确
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从xml文件填充sqlite数据库不正确相关的知识,希望对你有一定的参考价值。
朋友们!
请帮我解决我的问题。我试图从xml填充sqlite数据库,收到0错误,但数据库中的值混淆。
这是一个xml文件:
<?xml version="1.0" encoding="utf-8"?>
<cards>
<record
path="R.mipmap.ot1"
man="man1"
woman="woman1" />
<record
path="R.mipmap.ot2"
man="man2"
woman="woman2" />
</cards>
这是DBhelper类。 onUpgrade方法为空,但atm我每次都手动清除应用程序数据。
class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
super(context, "myDB", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.d(LOG_TAG, "--- onCreate database ---");
String sqlStatement = "CREATE TABLE IF NOT EXISTS mytable( id INTEGER PRIMARY KEY AUTOINCREMENT, path TEXT, man TEXT, woman TEXT)";
db.execSQL(sqlStatement);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
这里是将数据从xml导入数据库的部分
dbHelper = new DBHelper(this);
ContentValues cv = new ContentValues();
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("mytable", null, null);
Resources res = this.getResources();
ContentValues values = new ContentValues();
XmlResourceParser _xml = res.getXml(R.xml.cardslist);
try {
int eventType = _xml.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if ((eventType == XmlPullParser.START_TAG)
&& (_xml.getName().equals("record"))) {
String path = _xml.getAttributeValue(0);
String man = _xml.getAttributeValue(1);
String woman = _xml.getAttributeValue(2);
values.put("path", path);
values.put("man", man);
values.put("woman", woman);
db.insert("mytable", null, values);
Log.d(LOG_TAG, "success");
}
eventType = _xml.next();
}
}
// Catch errors
catch (XmlPullParserException e) {
Log.e("Test", e.getMessage(), e);
} catch (IOException e) {
Log.e("Test", e.getMessage(), e);
} finally {
// Close the xml file
_xml.close();
}
dbHelper.close();
所以我想收到
path = R.mipmap.ot1 man = man1 woman = woman1
R.mipmap.ot2 man2 woman2
但收到
path=man1 man=R.mipmap.ot1 woman=woman1
man2 R.mipmap.ot2 woman2
请帮我解决这个问题。非常感谢。
答案
在循环中移动你的ContentValues
声明:
while (eventType != XmlPullParser.END_DOCUMENT) {
ContentValues values = new ContentValues();
if ((eventType == XmlPullParser.START_TAG)
&& (_xml.getName().equals("record"))) {
String path = _xml.getAttributeValue(0);
String man = _xml.getAttributeValue(1);
String woman = _xml.getAttributeValue(2);
values.put("path", path);
values.put("man", man);
values.put("woman", woman);
db.insert("mytable", null, values);
Log.d(LOG_TAG, "success");
}
eventType = _xml.next();
}
或者你可以在每次迭代开始时使用values.clear()
,我认为它可能比声明新的ContentValues
对象更好。
另一答案
问题解决了,原因是XmlPullParser按字母顺序解析xml中的数据。所以我只是将路径重命名为apath。
以上是关于从xml文件填充sqlite数据库不正确的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段
使用 Core Data 一对多关系从 JSON 数组填充 sqlite 数据库
预填充核心数据存储:使用 JSON 属性列表还是 XML 文件?