4

我有以下两种方法

方法一

public String[] getSongIds(String whereClause) 
    {
        String countQuery = "SELECT  songid FROM TABLE_INDEX WHERE " + whereClause;
        Cursor cursor = db.rawQuery(countQuery, null);
        int cursorSize = cursor.getCount();

        int[] songIds = new int[cursorSize];
        int count=0;
        if (cursor != null ) {
            if (cursor.moveToFirst()){
                   do{
                       songIds[count] = cursor.getInt(cursor.getColumnIndex("songid"));
                      count++;
                   }while(cursor.moveToNext());
                }
        }
        cursor.close();
        db.close();
        return getSongTitles(songIds);
    }

方法二

private String[] getSongTitles(int[] songIds) {

    /some algorithm
    return songTitles;

}

方法 1 是从不同的包中调用的。方法 1 对 SQLite 数据库运行查询并调用第二个方法。我需要通过在方法 1 中执行 SQLite 查询来捕获通常导致的异常。最好返回 (-1) 或其他内容,以便我可以从最初调用这些方法的包中向用户显示一条消息。因此,如果存在(错误输入)SQL 异常,我希望方法 1 避免调用方法 2,而是将某些内容返回给另一个包

ps 我看到了几种捕获此异常的方法,但对他们的方法不满意。想知道解决这个问题的最佳方法是什么。干杯

4

1 回答 1

3

捕获异常,将其包装在自定义异常中,然后将其抛出:

public String[] getSongIds(String whereClause) throws FetchSongException {
  String countQuery = "SELECT  songid FROM TABLE_INDEX WHERE " + whereClause;
  try {
    Cursor cursor = db.rawQuery(countQuery, null);
    int cursorSize = cursor.getCount();

    int[] songIds = new int[cursorSize];
    int count=0;
    if (cursor != null) {
      if (cursor.moveToFirst()) {
        do {
          songIds[count] = cursor.getInt(cursor.getColumnIndex("songid"));
          count++;
        } while(cursor.moveToNext());
      }
      cursor.close(); // you should put this in a finally block
      db.close();
      return getSongTitles(songIds);
    }
  } catch (SQLException sqle) {
    throw new FetchSongException("Unable to fetch song ids.", sqle);
  }
}

然后,无论谁调用都getSongIds需要捕获这个新异常:

try {
  String[] result = getSongsIds("something");
} catch (FetchSongException e) {
  // Display user message with e.getMessage();
}
于 2012-08-25T02:41:03.840 回答