2011-12-13 49 views
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(); 
    } 

} 
} 

回答

1

MyXMLHandlercontext成員,但我沒有看到任何地方得到更新。在嘗試創建數據庫之前,請確保提供了有效的值。

此外,您應該只創建一次數據庫並保留一個句柄,而不是在每個元素末尾創建一個新句柄。插入已經很慢了,不需要讓它們變慢!

+0

非常感謝您的回答。其實我對android java的概念很陌生。如果你能告訴我如何開發它,有可能嗎? – Change

+0

@Change,在這種情況下,只需將一個參數添加到您的構造函數或setter中,然後將引用傳遞給使用該處理函數的「Activity」或「Service」。 – Argyle

+0

我編輯了我的問題,並更新了我的代碼。你能讓我知道我應該如何創建構造函數來從Activity調用?我很抱歉向你提出這麼多問題,但我需要繼續前進。 – Change

相關問題