Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Android使用sax将在线XML文件解析到数据库中_Android_Eclipse_Sqlite_Xml Parsing_Saxparser - Fatal编程技术网

使用Android使用sax将在线XML文件解析到数据库中

使用Android使用sax将在线XML文件解析到数据库中,android,eclipse,sqlite,xml-parsing,saxparser,Android,Eclipse,Sqlite,Xml Parsing,Saxparser,我目前正在尝试使用我自己编写的SAX解析器解析在上找到的XML文件,并将结果返回到列表中。该列表将存储到SQLite数据库中,以便在我的应用程序中进一步使用 问题是,当我运行我的应用程序时,没有任何东西被插入到数据库中。 以下是我目前使用的代码: package com.example.myapp; import java.io.IOException; import java.net.URL; import java.util.List; import javax.xml.parsers.P

我目前正在尝试使用我自己编写的SAX解析器解析在上找到的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();        
 }
 }
起初,它似乎可以工作,直到我设置了条件:if data.equalsdb.getLastRecord.data==false,这意味着检查最后记录的项是否与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函数,可能会有不正确的行为,但我不知道为什么。正如您在代码中看到的,我已经尝试对条件进行注释,但仍然没有返回任何内容到数据库中


如果您有任何建议,我们将不胜感激,感谢您抽出时间

我可能读错了,但看起来您正在解析XML,然后插入结果,但您试图读取从db插入的最后一条记录,同时仍在解析XML,即在插入任何内容之前

尝试保留添加到reclist的最后一条记录的副本/指针,并使用iFastrec=null&&data.equalslastRec.data

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