【问题标题】:Android database insert throws NULLPointerException while XML parsingAndroid 数据库插入在 XML 解析时抛出 NULLPointerException
【发布时间】:2011-12-13 00:25:07
【问题描述】:

我正在尝试通过解析 XML 文件来插入图书数据。它允许我解析文件,但在 getWritableDatabase 上抛出错误 java.lang.NullPointerException。 它在 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();
    }

}
}

【问题讨论】:

    标签: android sqlite sax


    【解决方案1】:

    您的MyXMLHandlercontext 成员,但我看不到它有任何更新。确保在尝试创建数据库之前为其提供有效值。

    此外,您应该只创建一次数据库并为其保留一个句柄,而不是在每个元素的末尾创建一个新句柄。插入已经很慢了,没必要再慢了!

    【讨论】:

    • 非常感谢您的回答。我实际上对android java的概念很陌生。如果你能告诉我如何开发它,是否有可能。
    • @Change,在这种情况下,只需将参数添加到您的构造函数或某个地方的设置器,并传入对使用处理程序的ActivityService 的引用。
    • 我已经编辑了我的问题并更新了我的代码。你能让我知道我现在应该如何创建从 Activity 调用的构造函数吗?很抱歉问你这么多问题,但我需要继续前进。
    • @Change 几乎什么都没有。只需将其传入即可。Activity 扩展了Context,因此在您实例化MyXMLHandler 实例的地方,传入this 引用。您的 MyXMLHandler 构造函数只是将传入的引用分配给它自己的上下文成员。
    • MyXMLHandler 的构造函数当前没有创建。所以假设我这样做了: MyXMLHandler myXML = new MyXMLHandler(this);但是在 MyXMLHandler.java 我应该如何创建构造函数?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    相关资源
    最近更新 更多