2016-09-15 12 views
0

現在、カーソルの現在の位置に基づいて、クエリに基づいて各列を取り込み、変数を変更しています。別の関数呼び出しは、現在参照されているカーソル内の列に基づいて行われることになる。このような何かを行うことによって、コードのサイズを削減することが可能であろうかと思いまして:カーソル位置に基づく関数呼び出しの使用 - Android

do { 
    Ticket ticket = new Ticket(); 
    for(int i = 0; i < cursor.getColumnCount(); i++) 
    { 
     if (cursor.getString(0) != null) { 
     /*Where the array contains a list of function calls*/ 
     ticket.arrayList(i); 
    } 
}while(cursor.moveToNext()); 
以下

私は現在持っているコードです。私が知っていることから、このように動作するJavaでは何もありませんが、私は最終的にカーソルに引かれる100列近くになるので、ここで行数を減らそうとしています。

public List<Ticket> getTickets(Context context, SQLiteDatabase db) 
{ 
    List<Ticket> ticketInfo = new ArrayList<>(); 
    String selectQuery = "SELECT * FROM " + TABLE_TICKET; 

    Cursor cursor = null; 


    try { 
     cursor = db.rawQuery(selectQuery, null); 
     if (cursor != null) { 
      try { 
       if (cursor.moveToFirst()) { 
        do { 
         Ticket ticket = new Ticket(); 
         //Set the ticket number 
         if (cursor.getString(0) != null) { 
          ticket.setTicketNr(Integer.parseInt(cursor.getString(0))); 
         } 
         //Set the ticket id 
         if (cursor.getString(1) != null) { 
          ticket.setTicketId(Integer.parseInt(cursor.getString(1))); 
         } 
         // 
         if (cursor.getString(2) != null) { 
          ticket.setServiceName(cursor.getString(2)); 
         } 
         // 
         if (cursor.getString(3) != null) { 
          ticket.setServiceHouseNr(Integer.parseInt(cursor.getString(3))); 
         } 
         // 
         if (cursor.getString(4) != null) { 
          ticket.setServiceDirectional(cursor.getString(4)); 
         } 
         // 
         if (cursor.getString(5) != null) { 
          ticket.setServiceStreetName(cursor.getString(5)); 
         } 
         // 
         if (cursor.getString(6) != null) { 
          ticket.setServiceCommunityName(cursor.getString(6)); 
         } 
         // 
         if (cursor.getString(7) != null) { 
          ticket.setServiceState(cursor.getString(7)); 
         } 
         // 
         if (cursor.getString(8) != null) { 
          ticket.setServiceZip1(Integer.parseInt(cursor.getString(8))); 
         } 
         // 
         if (cursor.getString(9) != null) { 
          ticket.setServiceZip2(Integer.parseInt(cursor.getString(9))); 
         } 
         // 
         if (cursor.getString(10) != null) { 
          ticket.setTroubleReported(cursor.getString(10)); 
         } 
         // Adding exercise to list 
         if (ticket != null) { 
          ticketInfo.add(ticket); 
         } 

        } while (cursor.moveToNext()); 
       } else { 
        //No results from query 
        Toast.makeText(context.getApplicationContext(), "No tickets found", Toast.LENGTH_LONG).show(); 
       } 

      } finally { 
       if (cursor != null && !cursor.isClosed()) { 
        cursor.close(); 
       } 
      } 
     } 
    } 
    catch(SQLiteException exception)//If exception is found 
    { 
     Log.d(TAG, "Error", exception); 
     //Display exception 
     Toast.makeText(context.getApplicationContext(), exception.toString(), Toast.LENGTH_LONG).show(); 
    } 

    return ticketInfo; 
} 

ありがとうございました。

答えて

1

これはそうすると思います。カーソルを進め、Ticketコンストラクタに渡してください。いくつかのエラーチェックを追加することができます。

public class Ticket { 

    private static class Field { 
     int intValue; 
     String stringValue; 
     final Class type; 

     Field(Class fieldType){ 
      type = fieldType; 
     } 

     void set(String value){ 
      if(type.equals(String.class)){ 
       stringValue = value; 
      } 
      else { 
       intValue = Integer.parseInt(value); 
      } 
     } 
    } 

    private List<Field> fields = new ArrayList<>(); 

    private Field addField(Field field){ 
     fields.add(field); 
     return field; 
    } 

    // This solution relies on adding fields in the order they'll be retrieved in the cursor. 
    // Other options are possible such as a map by column index. 
    private Field ticketNumber = addField(new Field(Integer.class)); 
    private Field serviceName = addField(new Field(String.class)); 

    public Ticket(Cursor cursor){ 
     for(int i=0; i < fields.size(); i++){ 
      Field f = fields.get(i); 
      f.set(cursor.getString(i)); 
     } 
    } 
} 

public int getTicketNumber(){ 
    return ticketNumber.intValue; 
} 

// Don't know if you need setters 
public void setTicketNumber(int value){ 
    ticketNumber.intValue = value; 
} 

// etc for remaining fields 

また、カーソルを扱うのではなく、このようなことを簡単にするためにORMを使用することも検討します。

+0

ありがとうございました!私のDatabaseHandlerクラスでいくつかの変更を加えれば、私はあなたのソリューションを動作させることができました。 –

関連する問題