2011-03-01 18 views
0

私はチャネル全体を文字列に解析して印刷するシンプルなアプリケーションを作成しようとしており、将来は構文解析されたデータをsqliteデータベースに保存できます。私はまた、RSSリーダーの3-4他の実装と一緒にIBMのチュートリアルを読みますがいただきました!間違っAndroid RSSリーダーの問題

Item.java

public class Item extends Object { 
private String Data= null; 
Item() { 

} 
Item(String data) { 
    this.Data = data; 
} 
public void setData(String data) { 
    this.Data = data; 
} 
public String getData() { 
    return this.Data; 
} 

}

RSSHandlerを把握カントtutorial1tutorial2 を追ってきました.java

public class RSSHandler extends DefaultHandler { 
public static final String ITEMS_TABLE="items"; 
private final String MY_DEBUG_TAG = "handler"; 
boolean inChannel = false; 
public Item item; 
LearDB leardb = null; 
RSSHandler(Context context) 
{ 
    leardb = new LearDB(context); 
    item =new Item(); 
} 
@Override 
public void startDocument() throws SAXException { 
    this.item = new Item(); 
} 
@Override 
public void endDocument() throws SAXException{ 
} 

@Override 
public void startElement(String Uri, String localName, String qName, 
     Attributes atts) throws SAXException { 
    if (localName.equals("channel")) { 
     this.inChannel = true; 
    } 
    else { 
     return; 
    } 
} 
@Override 
public void endElement(String Uri, String localName, String qName) 
throws SAXException { 
    if (localName.equals("channel")) { 
     this.inChannel = false; 
    } 
    else { 
     return; 
    } 
} 
@Override 
public void characters(char ch[], int start, int length) { 
    String temp = new String(ch, start, length); 
    try { 
     if (this.inChannel) { 
      this.item.setData(temp); 
     } 
    } catch (Exception e) { 
     Log.e(MY_DEBUG_TAG, "Parsing Error", e); 
    } 
} 
public String getData() { 
    return this.item.getData(); 

} 
public Item getItem() { 
    return this.item; 
}  
public void insertItem(String temp) { 
    SQLiteDatabase db = leardb.getWritableDatabase(); 
    ContentValues value=new ContentValues(); 
    value.put("data", temp); 
    db.insert(ITEMS_TABLE, null, value);   
} 

}

LearDB.java

public class LearDB extends SQLiteOpenHelper { 
private static final String DATABASE_NAME="lear.db"; 
public static final String ITEMS_TABLE="items"; 

public LearDB(Context context) { 
    super(context, DATABASE_NAME, null, 1);  
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    String sql = ("CREATE TABLE items (_id INTEGER PRIMARY KEY AUTOINCREMENT, data TEXT);"); 
    db.execSQL(sql);  
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    if (oldVersion == 1 && newVersion == 2) { 
     String sql = "drop table items;"; 
     db.execSQL(sql); 
     sql = ("CREATE TABLE items (_id INTEGER PRIMARY KEY AUTOINCREMENT, data TEXT);"); 
     db.execSQL(sql); 
    } 
} 

}

主な活動

public class test3 extends Activity { 
private final String MY_DEBUG_TAG = "test2"; 
@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    TextView text = new TextView(this); 
    try { 
     URL url = new URL("http://achdre.freehostia.com/example.xml");// URL of XML document to be parsed 
     InputSource source = new InputSource(url.openStream()); 
     SAXParserFactory LearParseFactory = SAXParserFactory.newInstance(); 
     SAXParser LearParser = LearParseFactory.newSAXParser(); //SAX Parser object 
     XMLReader LearReader = LearParser.getXMLReader(); // Object that scans the XML document 
     RSSHandler LearHandler = new RSSHandler(this); //Handler object 
     LearReader.setContentHandler(LearHandler); 
     LearReader.parse(source); //Parses the XML document 
     String temp=LearHandler.getData(); 
     text.setText("12345"); 
     LearHandler.insertItem("android"); //inserting test string to DB 
     } 
    catch (Exception e) { 
     text.setText("Error: " + e.getMessage()); 
     Log.e(MY_DEBUG_TAG, "Parsing Error", e); 
     } 
    this.setContentView(text); 
}} 

とマニフェストファイル

<uses-sdk android:minSdkVersion="8" /> 
<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<application android:icon="..." android:label="..."android:debuggable="true"> 
<activity android:name=".test3"android:label="@string/app_name"> 
<intent-filter> 
<action android:name="android.intent.action.MAIN" /> 
<category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 
</activity> 
</application> 
android:label="@string/app_name"android:debuggable="true"> 

編集:私はそれを実行させることができました。エラーは、私が解析しようとしていたxmlとハンドラクラスのコールバックイベントの両方にあります。より多くの援助

+1

を助けません。ダミーの「Hello World!」を追加することで、あなたのアクティビティがまったくロードされていることを確認できますか?テキストフィールド?また、tryブロックの早い段階でブレークポイント(Eclipseで左マージンをダブルクリック)を設定し、デバッグでアプリを実行することもできます。 –

+0

メインアクティビティで作成した 'LearHandler'オブジェクトのSQLiteデータベースが正しく作成されていて、3つの LearHandler.insertItem(" xxxx ");' コマンドが実際にデータベースにデータを挿入するため、私はそれを取得して開くときに見ることができるように、 はブレークポイントとデバッグを実行する;私はそれを朝にし、答えを与える 助けをありがとう – pmantz

+0

私はデバッグでアプリを実行します。私は 'text.setText(" 1234 ");' を使って画面にテキスト1234を印刷することができるので、何かが起きていることを確かめることができます。 'text.setText(" 12345 ");'私のハンドラクラスで何かが間違っています それ以外はデバッグで何を見つけるかわからない – pmantz

答えて

0

は可能かもしれする必要は処理するために、かなり多くのです

public class RSSHandler extends DefaultHandler 
{ 
    RSSFeed rssFeed; 
    RSSItem rssItem; 
    String lastElementName = ""; 
    final int RSS_TITLE = 1; 
    final int RSS_LINK = 2; 
    final int RSS_DESCRIPTION = 3; 
    final int RSS_CATEGORY = 4; 
    final int RSS_PUBDATE = 5; 

    int currentstate = 0; 

    public RSSHandler() 
    { 
    } 

    public RSSFeed getFeed() 
    { 
     return rssFeed; 
    } 

    //开始解析文档 
    public void startDocument() throws SAXException 
    { 
     rssFeed = new RSSFeed(); 
     rssItem = new RSSItem(); 
    } 

    //文档解析结束 
    public void endDocument() throws SAXException 
    { 
    } 

    public void startElement(String namespaceURI, String localName,String qName, Attributes atts) throws SAXException 
    { 
     if (localName.equals("channel")) 
     { 
      currentstate = 0; 
      return; 
     } 

     if (localName.equals("item")) 
     { 
      rssItem = new RSSItem(); 
      return; 
     } 

     if (localName.equals("title")) 
     { 
      currentstate = RSS_TITLE; 
      return; 
     } 

     if (localName.equals("description")) 
     { 
      currentstate = RSS_DESCRIPTION; 
      return; 
     } 

     if (localName.equals("link")) 
     { 
      currentstate = RSS_LINK; 
      return; 
     } 

     if (localName.equals("category")) 
     { 
      currentstate = RSS_CATEGORY; 
      return; 
     } 

     if (localName.equals("pubDate")) 
     { 
      currentstate = RSS_PUBDATE; 
      return; 
     } 

     currentstate = 0; 
    } 

    public void endElement(String namespaceURI, String localName, String qName) throws SAXException 
    { 
     //如果解析一个item节点结束,就将rssItem添加到rssFeed中。 
     if (localName.equals("item")) 
     { 
      rssFeed.addItem(rssItem); 
      return; 
     } 
    } 

    public void characters(char ch[], int start, int length) 
    { 
     String theString = new String(ch,start,length); 

     switch (currentstate) 
     { 
      case RSS_TITLE: 
       rssItem.setTitle(theString); 
       currentstate = 0; 
       break; 

      case RSS_LINK: 
       rssItem.setLink(theString); 
       currentstate = 0; 
       break; 

      case RSS_DESCRIPTION: 
       rssItem.setDescription(theString); 
       currentstate = 0; 
       break; 

      case RSS_CATEGORY: 
       rssItem.setCategory(theString); 
       currentstate = 0; 
       break; 

      case RSS_PUBDATE: 
       rssItem.setPubDate(theString); 
       currentstate = 0; 
       break; 

      default: 
       return; 
     } 
    } 
} 
関連する問題