1

現在、自分で作成したSAXパーサーを使用してBNR公式サイトで見つかったXMLファイルを解析し、結果をリストに戻そうとしています。このリストは、アプリケーションでさらに使用できるようにSQLiteデータベースに保存することを目的としています。

問題は、アプリを実行してもデータベースに何も挿入されないことです。現在使用しているコードは次のとおりです。

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;
}

最初は、条件を設定するまで機能しているように見えました。if(data.equals(db.getLastRecord()。data)== false)、whickは、最後に記録されたアイテムの日付がアイテムと同じかどうかを確認するためのものです。 xmlで。そうでない場合、それらはデータベースに挿入されることになっています。これは、このコーディングを介して行いました。

注:これは、OnClick()関数のごく一部であるProjectActivity.javaから取得したものです。

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()関数を実行すると、正しく動作しない可能性があると感じていますが、その理由がわかりません。コードでわかるように、私はすでに条件をコメント化しようとしましたが、それでもデータベースに何も返されません。

あなたが持っているかもしれないどんな提案も高く評価されます、あなたの時間を割いてくれてありがとう!

4

1 に答える 1

0

私はこれを間違って読んでいる可能性がありますが、XMLを解析してから結果を挿入しているようですが、XMLを解析している間(つまり、何かを挿入する前)にデータベースから「最後に挿入されたレコード」を読み取ろうとしています。

最後に追加されたレコードのコピー/ポインタを保持して、reclistを使用してみてくださいif(lastRec !=null && data.equals(lastRec.data))

于 2013-09-03T14:12:35.080 に答える