Android sqlite и SaxParser - PullRequest
       6

Android sqlite и SaxParser

0 голосов
/ 11 марта 2011

на данный момент я немного смущен. Я получил файл 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. как мне собрать их вместе?

Спасибо, А.

Ответы [ 2 ]

0 голосов
/ 11 марта 2011

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

public HandlerXmlData(SQLiteDatabase db){
    this.db = db;
}
0 голосов
/ 11 марта 2011

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

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

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

...