Неправильное заполнение базы данных sqlite из xml файла - PullRequest
0 голосов
/ 16 мая 2018

друзей!

Пожалуйста, помогите мне решить мою проблему.Я пытаюсь заполнить базу данных sqlite из xml, получаю 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       

Пожалуйста, помогите мне решить эту проблему.Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Проблема была решена, причина в том, что XmlPullParser анализирует данные из xml в алфавитном порядке. Поэтому я просто переименовал путь в apath.

0 голосов
/ 16 мая 2018

Переместите ваше объявление 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 объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...