2012-07-10 50 views
1

我正在嘗試使用我編寫自己的SAX解析器來解析在BNR official site上找到的XML文件,並將結果返回到列表中。該列表旨在存儲到SQLite數據庫中,以供我的應用程序進一步使用。使用Android使用sax解析在線XML文件到數據庫中

問題是,當我運行我的應用程序時,沒有任何東西被插入到數據庫中。 這裏是我目前正與代碼:

package com.example.myapp; 
import java.io.IOException; 
import java.net.URL; 
import java.util.List; 

import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 
import org.xml.sax.XMLReader; 


public class myXMLReader 
{ 
    String urlM; 
    DbHandler db; 

public void setDatabase (DbHandler db) 
{ 
    this.db=db; 
} 

    public myXMLReader(){} 


    public List<Record> obtainCurrencyList() throws ParserConfigurationException, 
               SAXException, 
               IOException 
    { 
    SAXParserFactory parserFactory = SAXParserFactory.newInstance(); 
    SAXParser parser = parserFactory.newSAXParser(); 

    XMLReader xmlReader = parser.getXMLReader(); 
    XMLHandler currHandler = new XMLHandler(); 
    currHandler.setDatabase(db); 
    ((org.xml.sax.XMLReader) xmlReader).setContentHandler(currHandler); 

    URL url = new URL(urlM); 
    ((org.xml.sax.XMLReader) xmlReader).parse(new InputSource(url.openStream())); 

    return currHandler.getRecList();   
} 
} 

這裏,XMLHandler是一類我寫我自己,代碼如下:

package com.example.myapp; 
    import java.util.ArrayList; 
    import java.util.List; 

    import org.xml.sax.Attributes; 
    import org.xml.sax.SAXException; 
    import org.xml.sax.helpers.DefaultHandler; 

    public class XMLHandler extends DefaultHandler{ 

List<Record> recList = new ArrayList<Record>(); 
DbHandler db; 
String data; 
String rate; 
String moneda; 
String multi; 
boolean brate; 

public void setDatabase (DbHandler db) 
{ 
    this.db=db; 
} 


public void startElement(String theNamespaceURI, 
     String theLocalName, 
     String theQName, 
     Attributes theAtts) throws SAXException 
     { 


    if (theLocalName.equals("Cube")) 

    { 
     data = theAtts.getValue("date"); 
    } 

    //if (data.equals(db.getLastRecord().data)==false) 
    { 

     if(theLocalName.equals("Rate")) 
     { 
      moneda = theAtts.getValue("currency"); 
      multi = theAtts.getValue("multiplier"); 
      if (multi==null) multi="1"; 
      //rate = new String(); 
      brate=true; 

     } 

    } 
     } 


    public void endElement(String uri, String localName, String qName) throws 
    SAXException { 
    //if (data.equals(db.getLastRecord().data)==false) 
    { 
     if (localName.equals("Rate")) 
      recList.add(new Record(moneda, multi, rate, data)); 
    } 
}; 


public void characters(char[] ch, int start, int length) throws SAXException 
{ 
    if (data.equals(db.getLastRecord().data)==false) 
    { 
     if (brate) 
     { 
      rate = new String(ch,start,length); 
      brate = false; 
     } 
    } 
}; 



List<Record> getRecList() 
{ 
    return recList; 
} 
    } 

好了,涉及到數據庫的功能都包含在這裏,在日DbHandler類:

package com.example.myapp; 

import java.util.ArrayList; 
import java.util.Calendar; 
import java.util.GregorianCalendar; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DbHandler 
{ 
private DatabaseHelper mDbHelper; 
SQLiteDatabase mDb; 
private static Context mCtx; 
// All Static variables 
// Database Version 
public static final int DATABASE_VERSION = 1; 

// Database Name 
public static final String DATABASE_NAME = "CursBNR"; 

// Contacts table name 
public static final String TODAY = "CursCurent"; 

// Contacts Table Columns names 
public static final String KEY_ID = "_id"; 
public static final String KEY_MONEDA = "Moneda"; 
public static final String KEY_MULTI = "Multi"; 
public static final String KEY_RATA = "Rata"; 
public static final String KEY_DATA = "Data"; 


public static class DatabaseHelper extends SQLiteOpenHelper{ 

    public DatabaseHelper(Context context) { 
     super(mCtx, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    // Creating Tables 
    @Override 
    public void onCreate(SQLiteDatabase db) 
    { 
String CREATE_TODAY = "CREATE TABLE " + TODAY + "("+ KEY_ID + " INTEGER PRIMARY KEY 
AUTOINCREMENT," + KEY_MONEDA + " TEXT,"+ KEY_MULTI + " TEXT,"+ KEY_RATA + " TEXT," + 
KEY_DATA + " TEXT" + ");"; 
     db.execSQL(CREATE_TODAY); 
     ; 
    } 

    // Upgrading database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Drop older table if existed 
     db.execSQL("DROP TABLE IF EXISTS " + TODAY); 
     // Create tables again 
     onCreate(db); 
    } 
} 

/**init context, open and close database*/ 

public DbHandler initcontext(Context ctx) { 
    mCtx = ctx; 
    return this; 
} 

public DbHandler open() throws SQLException { 
    mDbHelper = new DatabaseHelper(mCtx); 
    mDb = mDbHelper.getWritableDatabase(); 
    return this; 
} 

public void close() { 
    mDbHelper.close(); 
} 




/** 
* All CRUD(Create, Read, Update, Delete) Operations 
*/ 

// Adding new contact 
void addRecord(String MONEDA, String MULTI, String RATA, String DATA) { 
    try{ 
     mDb.execSQL("INSERT INTO "+TODAY+" 
('"+KEY_MONEDA+"','"+KEY_MULTI+"','"+KEY_RATA+"','"+KEY_DATA+"') VALUES('"+MONEDA+"', 
'"+MULTI+"', '"+RATA+"', '"+DATA+"');"); 
    }catch(Exception ex){ 
     ex.printStackTrace(); 
    } 
} 

// Updating single contact 
public void updateRecord(String MONEDA, String MULTI, String RATA, String DATA) 
{ 
    try{ 
     mDb.execSQL("UPDATE "+TODAY+" SET "+KEY_MONEDA+"='"+MONEDA+"', 
"+KEY_MULTI+"='"+MULTI+"', "+ 
       KEY_RATA+"='"+RATA+"',"+KEY_DATA+"='"+DATA+"' 
WHERE "+KEY_MONEDA+"='"+MONEDA+"';"); 
    }catch(Exception ex){ 
     ex.printStackTrace(); 
    } 
} 


/** 
* DELETE all students 
*/ 
public void dropAllRecords(){ 
    try{ 
     mDb.delete(TODAY, null, null); 
    }catch(SQLException ex){ 
     ex.printStackTrace(); 
    } 
} 

public void deleteRecords (int ID) 
{ 
    try 
    { 
     mDb.execSQL("DELETE * FROM"+TODAY+" WHERE "+KEY_ID+"='"+ID+"'"); 
    } 
    catch (SQLException ex) 
    { 
     ex.printStackTrace(); 
    } 
} 

public Record getLastRecord(){ 

    String query = "SELECT * FROM "+TODAY+" WHERE "+KEY_ID+"=(SELECT 
MAX("+KEY_ID+") FROM "+TODAY+");"; 
    Cursor cursor = null; 
    Record record = new Record(); 

    try{ 

     cursor = this.mDb.rawQuery(query, null); 
     cursor.moveToFirst(); 
     record.setID(cursor.getString(0)); 
     record.setMoneda(cursor.getString(1)); 
     record.setMulti(cursor.getString(2)); 
     record.setRata(cursor.getString(3)); 
     record.setData(cursor.getString(4));  
    }catch(Exception ex){ 
     ex.printStackTrace(); 
    } 

     //close cursor avoiding memory leaks 
    if(!cursor.isClosed()) 
     cursor.close(); 

    return record; 

} 

public int getreccount(){ 
    //allocate memory 
    String query = "SELECT COUNT("+KEY_MONEDA+") FROM "+TODAY; 
    int result = 0; 
    Cursor cursor = null; 
    //fetch result 
    try{ 
     cursor = this.mDb.rawQuery(query, null); 
     cursor.moveToFirst(); 
     result = cursor.getInt(0); 
    }catch(Exception ex){ 
     cursor.close(); 
     ex.printStackTrace(); 
    } 

    //close cursor avoiding memory leaks 
    if(!cursor.isClosed()) 
     cursor.close(); 

    return result; 
} 

起初它似乎工作,直到我把條件:如果(data.equals(db.getLastRecord()數據)==假),whick是爲了檢查w ^無論最後一個記錄的項目是否具有相同的日期或不是xml中的項目。如果不是,他們應該被插入數據庫,我通過這種編碼:

注意:這是從我的ProjectActivity.java,一小部分的OnClick()函數中獲取的。

myXMLReader XML= new myXMLReader(); 
XML.setDatabase(dbHandler); 
XML.urlM="http://www.bnr.ro/nbrfxrates.xml"; 


    //create database if necessary, update database 

    try 
    { 
     List <Record> reclist = XML.obtainCurrencyList(); 


     if (reclist.isEmpty()==false) 
     { 
      //database gets updated 

      for (int i=0; i<reclist.size(); i++) 
      { 
       dbHandler.addRecord(reclist.get(i).moneda, 
reclist.get(i).multi, reclist.get(i).rata, reclist.get(i).data);  

      } 
     } 


    } 
    catch (Exception e) 
    { 
     // TODO: handle exception 
     Log.i("Exceptie", "Exceptie"); 
     e.printStackTrace(); 
    } 

我檢查了所有的變量都已經通過Eclipse調試接口正確設置,並且我得到的值似乎是正確的。我有一種感覺,getLastRecord()函數可能會有一個不正確的行爲,如果在空數據庫的數據庫上運行,但我不明白爲什麼。正如你在代碼中看到的那樣,我已經嘗試過評論這個條件,但是還沒有返回到數據庫中。

您可能有任何建議都非常感謝,感謝您抽出寶貴時間!

回答

0

我可能會讀這個錯誤,但它看起來像你解析的XML,然後插入結果,但你試圖從數據庫中讀取「最後記錄插入」,同時仍然解析XML(即。插入任何東西)。

請保留指向最後一條記錄的指針副本,並將其添加到reclist並使用if(lastRec !=null && data.equals(lastRec.data))