Android sqlite и SaxParser

на данный момент я немного смущен. Я получаю файл XML и хочу сохранить этот контент в базе данных sqlite. Звучит очень обычно, я думаю. У меня есть DBAdapter, который в основном делает следующее

private  static class DatabaseHelper extends SQLiteOpenHelper 
{
    private final Context ctx;

    DatabaseHelper(Context context) 
    {
        super(context, Constants.DB_NAME, null, Constants.DB_VERSION);
        this.ctx = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) 
    {
        db.execSQL("create table mytable (_id integer primary key autoincrement, field text not null, field2 text not null );");
        fillDb(db);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    {
    //not relevant here so skip it
    }

    private void fillDb(SQLiteDatabase db)
    {
        InputStream rawInput = this.ctx.getResources().openRawResource(R.raw.data);

        SAXParserFactory factory = SAXParserFactory.newInstance();
        try
        {
            SAXParser saxParser = factory.newSAXParser();
            saxParser.parse(rawInput, new HandlerXmlData());
        }
        catch(Exception e)
        {
        //not relevant here so skip it              
        }


     //this manual entries would work here
        //ContentValues values = new ContentValues();
        //values.put("field", "aaa");
        //values.put("field2", "bbb");
        //db.insert("mytable", null, values);
                }

Проблема в том, что в моем SAXParser

открытый класс HandlerXmlData расширяет DefaultHandler {

private String currentValue = "";

public void startDocument()
{

}

public void startElement(String namespaceURI, String localName, String qName, Attributes atts) 
{
}

public void characters(char[] ch, int start, int length)
{
    currentValue = new String(ch, start, length);
    //here I get the value from my XML
              //so I need something like db.insert(...)
}

public void endElement(String uri, String localName, String qName)
{

}

Поэтому в моем SAXParser я не могу получить доступ к объекту db, который у меня есть в моем классе DatabaseHelper. как мне собрать их вместе?

Спасибо.


person AndyAndroid    schedule 11.03.2011    source источник


Ответы (2)


Можете ли вы передать объект db парсеру через конструктор?

public HandlerXmlData(SQLiteDatabase db){
    this.db = db;
}
person Chiefumpire    schedule 11.03.2011

У вас есть несколько вариантов для достижения того, что вы пытаетесь сделать.

  1. Вы можете просто передать объект SQLiteDatabase в свой объект HandlerXmlData, сохранить объект как переменную экземпляра и вставлять в него по мере приближения к своим значениям.

  2. Вы также можете создать bean-компонент, представляющий вашу модель базы данных. В вашем объекте HandlerXmlData вы можете иметь переменную экземпляра, хранящую коллекцию этого bean-компонента, и добавлять к ней по мере получения событий sax. Когда синтаксический анализ завершен, у вас должен быть метод, из которого вы можете получить доступ к заполненной модели, выполнить итерацию по ней и вставить каждую запись в свою базу данных.

person nicholas.hauschild    schedule 11.03.2011