JVx mit Android einsetzen

Behandelt die Integration von JVx in unterschiedlichste Technologien und die Verwendung von und mit bekannten Frameworks.

JVx mit Android einsetzen

Postby Development@SIB » Thu Jan 07, 2010 10:00 pm

Es ist unbestritten das Google mit Android eine interessante Plattform für mobile Anwendungen bereitstellt. Da mit der Dalvik VM ein spezielles Java Runtime Environment zum Einsatz kommt, dachten wir uns das JVx auf dieser Plattform nicht fehlen darf.

Die Möglichkeit, auch auf mobilen Geräten mit JVx Anwendungen zu entwickeln, wollen wir Ihnen nicht vorenthalten. Die Bandbreite reicht von simpler Datenerfassung bis hin zu komplexen Enterprise Anwendungen. Falls Sie bereits eine Anwendung mit JVx entwickelt haben, können Sie die komplette Business Logik mit Ihrer mobilen Anwendung wiederverwenden.

Wir zeigen Ihnen anhand einiger Code Beispiele aus der mobilen Packung!, wie Sie JVx einsetzen können.


Die mobile Packung!

Der Kategorie-Auswahl der Anwendung:

android_categories_small.png
android_categories_small.png (12.75 KiB) Viewed 5095 times

liegt folgender Source Code zugrunde:

Code: Select all
@Override
public void onCreate(Bundle pSavedInstanceState)
{
   super.onCreate(pSavedInstanceState);
   
   setContentView(R.layout.categoryselection);
   
   try
   {
      MemDataBook mdb = new MemDataBook();
      mdb.setName("categorylist");
      mdb.getRowDefinition().addColumnDefinition(
                             new ColumnDefinition("ID", new BigDecimalDataType()));
      mdb.getRowDefinition().addColumnDefinition(
                             new ColumnDefinition("IMAGE", new BigDecimalDataType()));
      mdb.getRowDefinition().addColumnDefinition(new ColumnDefinition("TITLE"));
      mdb.getRowDefinition().setPrimaryKeyColumnNames(new String[] {"ID"});
      mdb.getRowDefinition().setTableColumnNames(new String[] {"IMAGE", "TITLE"});
      mdb.open();
      
      mdb.insert(false);
      mdb.setValues(new String[] {"ID", "IMAGE", "TITLE"},
                    new Object[] {BigDecimal.valueOf(CATEGORY_BETS),
                                  new BigDecimal(R.drawable.ball),
                                  getResources().getString(R.string.cat_bets)});
      mdb.insert(false);
      mdb.setValues(new String[] {"ID", "IMAGE", "TITLE"},
                    new Object[] {BigDecimal.valueOf(CATEGORY_STATISTICS),
                                  new BigDecimal(R.drawable.statistics),
                                  getResources().getString(R.string.cat_stats)});
      mdb.saveAllRows();
      
      DataBookAdapter adapter = new DataBookAdapter(this,
                                                    mdb,
                                                    R.layout.categoryselection_listrow);
      adapter.setColumnViewResources(new int[] {R.id.activityselection_icon,
                                                R.id.activityselection_text});
      
      ListView list = ((ListView)findViewById(R.id.categoryselection_list));

      list.setAdapter(adapter);
   }
   catch (Throwable th)
   {
      showError(th.getMessage());
   }
}

Es wird ein MemDataBook erstellt und mit einem DataBookAdapter an eine ListView gebunden. Zu beachten ist, daß jede Spalte des DataBooks an eine View gebunden werden kann. Der Adapter übernimmt die Metadaten aus der RowDefinition.

Wir gehen nun einen Schritt weiter und binden die Daten aus der Datenbank (Derby DB) an eine ExpandableListView. Dazu nutzen wir die bestehende Business Logik der Applikation und integrieren diese.

Wir zeigen die Umsetzung der Tipp Liste "MyBets":

android_mybets.png
android_mybets.png (27.8 KiB) Viewed 5095 times


Der Source Code sieht folgendermaßen aus:

Code: Select all
@Override
public void onCreate(Bundle pSavedInstanceState)
{
   super.onCreate(pSavedInstanceState);
   
   setContentView(R.layout.mybets);
   
   try
   {
      SubConnection con = ((MasterConnection)((PackungApplication)getApplication())
                          .getConnection()).createSubConnection
                          ("com.sibvisions.apps.packung.screens.MyBets");
      con.open();
      
      setConnection(con);
      
      RemoteDataSource dataSource = new RemoteDataSource(con);
      dataSource.open();
      
      rdbMatchdays = new RemoteDataBook();
      rdbMatchdays.setDataSource(dataSource);
      rdbMatchdays.setName("matchdays");
      rdbMatchdays.setReadOnly(true);
      rdbMatchdays.open();
      
      rdbMatchdays.getRowDefinition().setTableColumnNames(new String[] {"MATCHDAY",
                                                                        "SORT_ID"});
      
      rdbBets = new RemoteDataBook();
      rdbBets.setDataSource(dataSource);
      rdbBets.setName("bets");
      rdbBets.setMasterReference(new ReferenceDefinition(new String[] {"MADA_ID"},
                                                         rdbMatchdays,
                                                         new String[] {"ID"}));
      rdbBets.open();
      
      rdbBets.getRowDefinition().setTableColumnNames(new String[] {"MATCHBEGIN",
                                                                   "IMAGENAME1",
                                                                   "TEAM1",
                                                                   "BET_GOALS1",
                                                                   "IMAGENAME2",
                                                                   "TEAM2",
                                                                   "BET_GOALS2"});
      
      adapter = new TreeAdapter(MyBets.this,
                                rdbMatchdays,
                                rdbBets,
                                android.R.layout.simple_expandable_list_item_2,
                                R.layout.mybets_childrow);
      adapter.setGroupColumnViewResources(new int[] {android.R.id.text1,
                                                     android.R.id.text2});
      adapter.setChildColumnViewResources(new int[] {R.id.matchbegin,
                                                     R.id.team1_icon,
                                                     R.id.team1,
                                                     R.id.score1,
                                                     R.id.team2_icon,
                                                     R.id.team2,
                                                     R.id.score2});
      adapter.setValueFormatter(new TreeAdapter.ValueFormatter()
      {
         public Object formatValue(View pView, IDataRow pRow,
                                   String pColumn, Object pValue)
         {
            if ("IMAGENAME1".equals(pColumn) || "IMAGENAME2".equals(pColumn))
            {
               if (pValue == null)
               {
                  return new Integer(R.drawable.flag_white);
               }
               else
               {
                  return FileUtil.removeExtension((String)pValue);
               }
            }
            else if ("SORT_ID".equals(pColumn))
            {
               return sdfMatchday.format(pValue);
            }
            else if ("MATCHBEGIN".equals(pColumn))
            {
               return sdfTime.format(pValue);
            }
            
            return pValue;
         }
      });
                  
      ExpandableListView list = (ExpandableListView)findViewById(R.id.mybets_list);
      list.setAdapter(adapter);
      list.expandGroup(0);
   }
   catch (Throwable th)
   {
      showError(th.getMessage());
   }
}


Zuerst wird die Verbindung zum Server Objekt (com.sibvisions.apps.packung.screens.MyBets) hergestellt, das die Business Logik enthält. Mit dieser Verbindung werden die RemoteDataBooks konfiguriert um die Daten aus der Datenbank zu binden. Abschließend wird ein TreeAdapter auf eine ExpandableListView gesetzt um die Gruppierte Ansicht der Spiele pro Spieltag anzuzeigen.


Zum Abschluß zeigen wir Ihnen, wie einfach die Änderung von Daten durchgeführt werden kann. Dazu verwenden wir die Tipp Maske:

android_placebet.png
android_placebet.png (46.03 KiB) Viewed 5094 times


Die Daten Änderung wurde mit folgendem Source Code umgesetzt:

Code: Select all
public void onClick(DialogInterface pDialog, int pButton)
{
   try
   {
      rdbBets.setValues(new String[] {"BET_GOALS1", "BET_GOALS2"},
                        new Object[] {BigDecimal.valueOf(npTeam1.getCurrent()),
                                      BigDecimal.valueOf(npTeam2.getCurrent())});
      
      rdbBets.saveAllRows();
   }
   catch (ModelException me)
   {
      showError(me.getMessage());
   }
}

Wir übernehmen die gesetzten Tore aus dem Dialog, in die aktuelle Zeile unseres RemoteDataBooks und speichern die Änderungen. Das ist ausreichend um den Tipp in die Datenbank zu übernehmen.
User avatar
Development@SIB
 
Posts: 311
Joined: Mon Sep 28, 2009 1:54 pm

Return to Integration