0

此刻我有点困惑。我收到一个 XML 文件并希望将该内容存储在 sqlite db 中。我猜听起来很常见。我有一个 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 中,我无法访问我在 DatabaseHelper 类中拥有的 db 对象。我如何把这些放在一起?

谢谢。

4

2 回答 2

0

你有几个选择来实现你想要做的事情。

  1. 您可以简单地将 SQLiteDatabase 对象传递到您的 HandlerXmlData 对象中,将该对象保留为实例变量,并在您接近您的值时插入其中。

  2. 您还可以创建一个代表您的数据库模型的 bean。在您的 HandlerXmlData 对象中,您可以有一个实例变量来存储此 bean 的集合,并在您接收到 sax 事件时添加到它。解析完成后,您应该有一个方法,您可以从中访问填充的模型,对其进行迭代并将每个条目插入到数据库中。

于 2011-03-11T17:18:33.050 回答
0

您可以通过构造函数将 db 对象传递给解析器吗?

public HandlerXmlData(SQLiteDatabase db){
    this.db = db;
}
于 2011-03-11T17:19:57.633 回答