При вставке базы данных Android возникает исключение NULLPointerException при разборе XML - PullRequest
1 голос
/ 13 декабря 2011

Я пытаюсь вставить данные Книги, анализируя XML-файл. Это позволяет мне анализировать файл, но выдает ошибку java.lang.NullPointerException в getWritableDatabase. Выдает ошибку в файле MyXMLHandler.java в строке:

  xmDB = new XMLDatabaseManager(context);
  xmDB.insertFeed(currentValue);

У меня есть код, который я использую для его разработки. Я работал над этим в течение длительного времени сегодня, но не могу понять ошибку. Будет очень полезно, если вы поможете мне здесь.

package org.database.databasemanager;

import android.content.ContentValues;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;
import android.util.Log;

public class XMLDatabaseManager {

// the activity or appliation that is creating an object
Context context;

private SQLiteDatabase db;

private final String DATABASE_NAME = "Main.db";
private final int DATABASE_VERSION = 1;

// Table name
public final String TABLE = "events";

// Columns
public static final String TIME = "time";
public final String TITLE = "title";

private final String TAG = "MyActivity";

public XMLDatabaseManager(Context context){
    this.context = context;

    EventDataSQLHelper helper = new EventDataSQLHelper(context);
    this.db = helper.getWritableDatabase();

}



public class EventDataSQLHelper extends SQLiteOpenHelper {
    public EventDataSQLHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "create table " + TABLE + "( " + BaseColumns._ID
                + " integer primary key autoincrement, " 
                + TITLE + " text not null);";
        Log.d("EventsData", "onCreate: " + sql);
        db.execSQL(sql);

        Log.v(TAG, "secondnameText");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

}


public boolean insertFeed( String title) {
      ContentValues values = new ContentValues();
      values.put("title", title);
      return (this.db.insert(TABLE, null, values) > 0);
}


}

Следующий код, используемый для синтаксического анализа XML-файла и вставки в конце элемента.

package org.database.databasemanager;
import org.database.databasemanager.XMLDatabaseManager;
import org.database.databasemanager.XMLDatabaseManager.EventDataSQLHelper;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.Cursor;
 import android.util.Log;

 public class MyXMLHandler extends DefaultHandler {

Boolean currentElement = false;
String currentValue = null;
Context context;
private SQLiteDatabase db;
private XMLDatabaseManager xmDB;
public static SitesList sitesList = null;
private final String TAG = "KEY";

public static SitesList getSitesList() {
    return sitesList;
}

public static void setSitesList(SitesList sitesList) {
    MyXMLHandler.sitesList = sitesList;
}

/** Called when tag starts ( ex:- <name>AndroidPeople</name>
 * -- <name> )*/
@Override
public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {

    currentElement = true;

    if (localName.equals("Books"))
    {
        sitesList = new SitesList();

    } 
    }

    public void endElement(String uri, String localName, String qName)
throws SAXException {

     currentElement = false;

    /** set value */
    if (localName.equalsIgnoreCase("title")){

        // Get the value here 
        Log.d(TAG, currentValue);

                        ERROR THROWN HERE
                       --------------------------

         xmDB = new XMLDatabaseManager(context);
         xmDB.insertFeed(currentValue);

    }


}

/** Called to get tag characters ( ex:- <name>AndroidPeople</name>
 * -- to get AndroidPeople Character ) */
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {

    if (currentElement) {
        currentValue = new String(ch, start, length);
        currentElement = false;
    }

}
}

Класс активности:

package org.database.databasemanager;

 import java.net.URL;

 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;

 import org.xml.sax.InputSource;
 import org.xml.sax.XMLReader;

 import android.app.Activity;
 import android.os.Bundle;
 import android.util.Log;
  import android.widget.LinearLayout;
 import android.widget.TextView;

public class DatabaseManagerActivity extends Activity {


XMLDatabaseManager db;
private final String TAG = "SIZE";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {

    try{

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        db = new XMLDatabaseManager(this);
        SitesList sitesList = null;
        LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(1);

        try {

            /** Handling XML */
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();

            /** Create handler to handle XML Tags ( extends DefaultHandler ) */
            MyXMLHandler myXMLHandler = new MyXMLHandler();
            xr.setContentHandler(myXMLHandler);
            //xr.parse(new InputSource(sourceUrl.openStream()));
            xr.parse(new InputSource(getAssets().open("Books1.xml")));

        } catch (Exception e) {
            System.out.println("XML Pasing Excpetion = " + e);
            e.printStackTrace();

        }
        /** Get result from MyXMLHandler SitlesList Object */
        sitesList = MyXMLHandler.sitesList;
        /** Set the layout view to display */
        setContentView(layout);

    }
    catch (Exception e)
    {
        Log.e("ERROR", e.toString());
        e.printStackTrace();
    }

}
}

1 Ответ

1 голос
/ 13 декабря 2011

У вашего MyXMLHandler есть член context, но я нигде не вижу, чтобы он обновлялся.Убедитесь, что вы указали правильное значение для этого, прежде чем пытаться создать базу данных.

Кроме того, вы должны создать базу данных только один раз и сохранять ее дескриптор, а не создавать новый дескриптор в конце каждого элемента.Вставки уже медленные, нет необходимости делать их медленнее!

...