1
我試圖通過解析XML文件來插入Books的數據。它允許我解析文件,但在getWritableDatabase上拋出錯誤java.lang.NullPointerException。 它拋出我MyXMLHandler.java文件錯誤在行:Android數據庫插入在XML解析時拋出NULLPointerException
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 java的概念很陌生。如果你能告訴我如何開發它,有可能嗎? – Change
@Change,在這種情況下,只需將一個參數添加到您的構造函數或setter中,然後將引用傳遞給使用該處理函數的「Activity」或「Service」。 – Argyle
我編輯了我的問題,並更新了我的代碼。你能讓我知道我應該如何創建構造函數來從Activity調用?我很抱歉向你提出這麼多問題,但我需要繼續前進。 – Change