<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CodePlay &#187; java</title>
	<atom:link href="http://codeplay.hu/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://codeplay.hu</link>
	<description>Kitaláljuk, lefejlesztjük, telepítjük</description>
	<lastBuildDate>Wed, 21 Dec 2011 14:48:53 +0000</lastBuildDate>
	<language>hu</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Mi lesz veled Java?</title>
		<link>http://codeplay.hu/developer/2010/11/mi-lesz-veled-java/</link>
		<comments>http://codeplay.hu/developer/2010/11/mi-lesz-veled-java/#comments</comments>
		<pubDate>Fri, 05 Nov 2010 10:39:35 +0000</pubDate>
		<dc:creator>almergabor</dc:creator>
				<category><![CDATA[Szoftverfejlesztés]]></category>
		<category><![CDATA[fejlesztés]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[sun]]></category>

		<guid isPermaLink="false">http://codeplay.hu/?p=116</guid>
		<description><![CDATA[Az utóbbi idők fontosabb Java történései: Oracle megvette a Sun-t, így a Java-t is James Gosling a Java szülőatyja otthagyta Sun-t (vagyis már az Oracle-t) Oracle perli a Google-t az Android-os Java miatt (hogy pontosan miért, az számomra elég zavaros) Apple bejelentette, hogy a Mac-es Java-t nem fejlesztik tovább És egyáltalán kevesebbet hallani a Java-ról [...]]]></description>
			<content:encoded><![CDATA[<p>Az utóbbi idők fontosabb Java történései:</p>
<ol>
<li>Oracle megvette a Sun-t, így a Java-t is</li>
<li>James Gosling a Java szülőatyja otthagyta Sun-t (vagyis már az Oracle-t)</li>
<li>Oracle perli a Google-t az Android-os Java miatt (hogy pontosan miért, az számomra elég zavaros)</li>
<li>Apple bejelentette, hogy a Mac-es Java-t nem fejlesztik tovább</li>
<li>És egyáltalán kevesebbet hallani a Java-ról</li>
</ol>
<p>Ezt a témát jártam körbe kicsit részletesebben.</p>
<p><span id="more-116"></span></p>
<p><strong>1.</strong> Ezzel talán az a gond, hogy az Oracle miután megvette a Bea-t, már akkor is gondban volt, hogy mit csináljon azokkal a termékeivel, amikből kettő lett neki, és ez helyzet csak romlott a Sun megvételével, ahol megint csak hasonló termékek voltak. Mintha maga az Oracle sem tudná, hogy például, akkor most Weblogic, vagy Glassfish, vagy IAS. (Na jó, az IAS, csak vicc volt <img src='http://codeplay.hu/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</p>
<ul>
<li>Tavaly az Oracle fejlesztői konferencián az előadónak csak záporoztak a kérdések, hogy akkor most IAS-t kell-e használni, vagy Weblogic-ot. A vicc az egészben az volt, hogy pont azokban a napokban látott napvilágot az Sun felvásárlásának a híre, és valaki még a GlassFish-re is rákérdezett, persze az előadó csak az IAS és Weblogic témára tudott mit mondani, mégpedig, hogy Weblogic-ot érdemes használni, az IAS már csak egy ideig lesz támogatva.</li>
<li>A nagy cégekre általában azt mondják, hogy maga az ördög. Ez most sincs másként, mivel az Oracle, így már egy nagyon-nagyon nagy cég lett.</li>
<li>Az ilyen cégek lépéseit mindenki nagyon kritikusan figyeli. Legyen szó akár a Google-ről, az Apple-ről, vagy éppen az Oracle-ről.</li>
<li>Az Oracle adatbázis licenszekről tudjuk, hogy elég drágák, és nem lapul mindenkinek a fiókjában pár darab, így ha lehet, minden informatikai vezető kétszer is meggondolja, hogy kell-e neki Oracle, vagy használjon valami mást, mondjuk MySQL-t.</li>
<li>Mivel még korábban a Sun megvette a MySQL-t, ami így megint csak az Oracle kezében landolt, a lehetőségek tovább szűkültek, mivel  az Oracle ebből is jó kis pénzt szeretne behúzni.</li>
<li>Elég csak megnézni a jelenlegi MySQL árakat: <a href="http://mysql.com/products/">http://mysql.com/products/</a></li>
<li>Egy Clusteres MySQL kb. évi 2 millió forint.</li>
<li>Hogy az emberek mennyire ugranak mindenre amit az Oracle változtat, mutatja a napokban felkapott hír, miszerint a MySQL Classic Edition már nem tartalmazza az InnoDB storage engine-t: <a href="http://www.infoq.com/news/2010/11/MySQL-Classic-InnoDB">http://www.infoq.com/news/2010/11/MySQL-Classic-InnoDB</a></li>
<li>Már több helyen olvastam, hogy ha új projektet indítasz, akkor inkább PostgreSQL-t használj, vagy valamilyen NoSQL terméket.</li>
</ul>
<p><br class="spacer_" /></p>
<p><strong>2.</strong> Hogy James Gosling (http://en.wikipedia.org/wiki/James_Gosling) otthagyta az Oracle-t, inkább csak szimbolikus jelentőséggel bír, de mindenképpen érdekes dolog. A Java fejlesztők körében (persze csak akik egyáltalán tudtak róla), így nem lett sokkal népszerűbb az Oracle.</p>
<p><br class="spacer_" /></p>
<p><strong>3.</strong> A Google felhasznált valamilyen kódrészleteket a Java forrásából. Ezért perel az Oracle: <a href="http://www.infoq.com/news/2010/08/oracle_sues_google">http://www.infoq.com/news/2010/08/oracle_sues_google</a></p>
<p>Az ügy egyébként elég bonyolultnak tűnik, viszont egy érdekes felvetést olvastam valahol: az egész azért van, hogy a Google megvegye a Java-t az Oracle-től, mivel az nem tud vele mit kezdeni, a Google pedig az Android miatt picit felkavarná a Java körüli állóvizet. Nem tudom mennyi igaz belőle, mindenesetre érdekes.</p>
<p><br class="spacer_" /></p>
<p><strong>4. </strong>Mivel egyre több Java fejlesztő használ Mac-et, így sokaknak fájó az a bejelentés, hogy az új Mac OS X Lion operációs rendszerben, már nem lesz alapból megtalálható a Java. Mivel az Apple fejleszti a Mac-es Java-t, és gondolom az Oracle megint csak kicsit pénzéhesen sokat kért, amire Steve Jobs beintett.</p>
<p><br class="spacer_" /></p>
<p><strong>5.</strong> Egyre kevesebbet lehet hallani a Java-ról. Régebben, alig bírtam a Google Reader-em Java-s híreivel, manapság jó ha kéthetente van egy-egy érdekes hír. Mintha már mindenki mindent leírt volna amit tudott a Java-ról. Nincs miről írni, mert nem történik semmi Érdemes megnézni, hogy például az  O&#8217;Reilly kiadónál nincs előkészületben egyetlen Java-s könyv se: <a href="http://oreilly.com/java/index.html">http://oreilly.com/java/index.html</a></p>
<p>Ami még érdekes, hogy maga a Java nyelv és a körülötte lévő technológiák jóval bonyolultabbak, mint kellene.</p>
<p>Ha valaki manapság egy átlag Java-s web-es projektbe belecsöppen, akkor körülbelül a következő dolgokkal találkozhat, amikről tudnia kell:</p>
<ul>
<li>Java</li>
<li>Spring</li>
<li>Hibernate</li>
<li>Struts2</li>
<li>Maven</li>
</ul>
<p>Az előbb felsorolt technológiák mindegyikéről külön könyvek jelentek meg, mindegyik technológia megtanulása hónapokba telik.</p>
<p>Betanulási idő, és legtöbbször sajnos fejlesztési idő szempontjából a PHP, Python vagy akár a Ruby, még mindig sokkal jobb választásnak tűnik, mint a Java (leszámítva a nagyvállalati környezetet).</p>
<p>Bruce Tate könyve elég érdekesen írja le ezt az egész folyamatot, igaz ő a Ruby szempontjából közelíti meg a dolgot, de próbál objektív maradni: <a href="http://pragprog.com/titles/fr_j2r/from-java-to-ruby">http://pragprog.com/titles/fr_j2r/from-java-to-ruby</a></p>
<p>Azt mondja, hogy a feladatok nagy részére sokkal ésszerűbb mást használni, esetében Ruby-t, mind Java-t.</p>
<p><br class="spacer_" /></p>
<p>Most, hogy ezeket így leírtam, azon gondolkodom, hogy mindezt csak önigazolásként gyűjtöttem-e össze. Azért, mert nem látom a jövőmet a Java-ban.</p>
<p>Nem tudom.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeplay.hu/developer/2010/11/mi-lesz-veled-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android onItemClick probléma ListView és Button használatakor</title>
		<link>http://codeplay.hu/developer/2010/07/android-onitemclick-problema-listview-es-button-hasznalatakor/</link>
		<comments>http://codeplay.hu/developer/2010/07/android-onitemclick-problema-listview-es-button-hasznalatakor/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 23:16:26 +0000</pubDate>
		<dc:creator>kepes</dc:creator>
				<category><![CDATA[Szoftverfejlesztés]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[fejlesztés]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Mobil]]></category>

		<guid isPermaLink="false">http://codeplay.hu/?p=40</guid>
		<description><![CDATA[Népszerű és mindenképp használatra javasolt komponens Androidon a ListView. Gyakorlatilag a legtöbbet használt UI elem, bárhmely programot használunk, rendszeresen feltűnik különböző formákban. Lényege, hogy a képernyőn megjelenő elemeket egy listába rendezzük, és ezt a listát görgethetjük le-fel ha nem fér ki minden elem a képernyőre. Használata relative egyszerű, amíg nem akarunk egyedi megjelenést, például Button vagyCheckbox komponenseket [...]]]></description>
			<content:encoded><![CDATA[<p>Népszerű és mindenképp használatra javasolt komponens Androidon a <code>ListView</code>. Gyakorlatilag a legtöbbet használt UI elem, bárhmely programot használunk, rendszeresen feltűnik különböző formákban. Lényege, hogy a képernyőn megjelenő elemeket egy listába rendezzük, és ezt a listát görgethetjük le-fel ha nem fér ki minden elem a képernyőre. Használata relative egyszerű, amíg nem akarunk egyedi megjelenést, például <code>Button</code> vagy<code>Checkbox</code> komponenseket belerakni, mert ekkor azonnal beleütközünk a problémába, a <code>ListView onItemClick</code>event handler nem hívódik meg kattintáskor.</p>
<p><span id="more-40"></span>Az Internet tele van a problémával, de teljes egészében leírt megoldást ritkán találni. Általában utalások vannak rá, hogy tároljunk ID-t a Tag mezőben, vagy írjuk át az <code>Adapter</code>-t, de mik is ezek az utalások tulajdonképpen?</p>
<p>A feladat amit kitaláltam egy olyan <code>ListView</code> megjelenítés, ami a <code>SimpleAdaptert</code>-t használja adatforrásnak, így a layout betölthető XML-ből egyszrűen. A layout tartalmaz egy gombot, amit megnyomva az Activity onClick metódusa hívódik meg. A probléma itt következik: az <code>onClick</code> az <code>onItemClick</code>-el ellentétben nem kapja meg melyik soron kattintottunk. Valahonnan pedig illene tudni, hiszen nem minden soron ugyanazt szeretnénk végrehajtani.</p>
<p>Az ötelt a fent amlített netes leírások alapján adja magát, tároljuk le az onClick-et meghívó View Tag-jében (<code>View.setTag(Object o)</code>) a szükséges azonosítót, így az onClick-ben a paraméterként megkapott View-tól le tudjuk kérdezni.</p>
<p>Minden ListView a lista elemeit egy Adapter osztálytól kapja (<code>ListView.setAdapter()</code>) a <code>getView()</code> metóduson keresztül. Az adapter kis átírásával megoldható, hogy a lista elemeibe bekerüljön a az Id a megfelelő Tag property-be, amikor a ListView meghívja a <code>getView()</code>-t. Leszármaztattam hát a <code>SimpleAdaptert</code>-t:</p>
<pre class="brush: java">public class ClickableButtonListAdapter extends SimpleAdapter {	

	private static final String HASHMAP_ID = "_id";

	public ClickableButtonListAdapter(Context context,
			List&lt;? extends Map&lt;String, ?&gt;&gt; data, int resource, String[] from,
			int[] to) {
		super(context, data, resource, from, to);

	}

	@SuppressWarnings("unchecked")
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		View view = super.getView(position, convertView, parent);
		setViewTag(view, ((HashMap&lt;String,String&gt;) getItem(position)).get(HASHMAP_ID) );
		return view;
	}

	private void setViewTag(View view, Object tag) {
		view.setTag(tag);
		if (view instanceof ViewGroup) {
			for (int i=0; i &lt; ((ViewGroup) view).getChildCount(); i++) {
				setViewTag(((ViewGroup) view).getChildAt(i), tag);
			}
		}
	}
}
</pre>
<p>A példában a lista elemei HashMap-ek, így ebből szedem ki az Id-t. A <code>HahMap</code>-ben az Id mező az &#8220;_id&#8221; elemben van, így ezt keresem ki, és rakom a Tag-be. A <code>setViewTag()</code> rekurzív metódus végigmegy az összes megjelenítendő View elemen és beállítja a Tag-et, így bármelyikre definiálhatjuk majd az onClick-et, mindig megkapjuk a Tag-ben a kiválasztott sor Id-ját.</p>
<p>Az <code>Activity</code>-ben az <code>onClick()</code> igen egyszerű:</p>
<pre class="brush: java">public void onClick(View v) {
         Toast.makeText(this, "onClick id: " + v.getTag(), Toast.LENGTH_SHORT).show();
}</pre>
<p>Nem mondom, hogy szép megoldás, de használható. Jobban tetszene, ha az Android megfelelően támogatná az egyedi ListView létrehozását esetleg azzal, hogy az onItemClick meghívódna, és eldönthetném, hogy mit akarok kezdeni az eseménnyel.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeplay.hu/developer/2010/07/android-onitemclick-problema-listview-es-button-hasznalatakor/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Android és adatbázis</title>
		<link>http://codeplay.hu/developer/2010/05/android-es-adatbazis/</link>
		<comments>http://codeplay.hu/developer/2010/05/android-es-adatbazis/#comments</comments>
		<pubDate>Sat, 22 May 2010 22:55:14 +0000</pubDate>
		<dc:creator>kepes</dc:creator>
				<category><![CDATA[Szoftverfejlesztés]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[fejlesztés]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Mobil]]></category>

		<guid isPermaLink="false">http://codeplay.hu/?p=31</guid>
		<description><![CDATA[Előző bejegyzésekben már írtam a HTC Desire felhasználhatóságáról, tapasztalataimról, mint end-user. Mivel szoftverfejlesztőként is érdekelt a telefon és az Android, ezért amint megvolt a készülék, azonnal elkezdtem nézni az Android SDK-t. Elsőként szerettem volna egy egyszerű kis alkalmazást összerakni, amely tartalmaz beviteli mezőket, és egy listát, ahol a már felvitt elemek módosíthatók. A lista természetesen [...]]]></description>
			<content:encoded><![CDATA[<p>Előző bejegyzésekben már írtam a HTC Desire felhasználhatóságáról, tapasztalataimról, mint end-user. Mivel szoftverfejlesztőként is érdekelt a telefon és az Android, ezért amint megvolt a készülék, azonnal elkezdtem nézni az <a href="http://developer.android.com">Android SDK</a>-t. Elsőként szerettem volna egy egyszerű kis alkalmazást összerakni, amely tartalmaz beviteli mezőket, és egy listát, ahol a már felvitt elemek módosíthatók.<span id="more-31"></span></p>
<p>A lista természetesen legyen a tapifonokon már megszokott szépen gördíthető lista, a beviteli képernyő standard beviteli mezőkből álljon össze. Egy ilyen alkalmazás leírását a <a href="http://developer.android.com">Developer portál </a>elég jól leírja a <a href="http://developer.android.com/guide/index.html">Guideokban </a>erre nem térek most ki. Ami szerintem egy kicsit elbonyolított, és nem épp lényegre törő rész ebben az útmutatóban az az <a href="http://developer.android.com/guide/topics/data/data-storage.html">adatok tárolása</a>, ezen belül is az Androidba beépített <a href="http://www.sqlite.org">SQLite</a> adatbázis kezelő <a href="http://developer.android.com/guide/topics/data/data-storage.html#db">leírása</a>. Ezt egy külön részben tovább boncolgatja a <a href="http://developer.android.com/resources/tutorials/notepad/index.html">Notepad tutorial</a>, de itt sajnos már belekeverik a <a href="http://developer.android.com/guide/topics/providers/content-providers.html">Content Provider</a>-eket is, így nem kapunk kellő instrukciót, hogyan is kellene használni az adatbázist.</p>
<p>A neten található leírások általában azt a módszert erőltetik, hogy a <a href="http://developer.android.com/reference/android/database/Cursor.html">Cursor</a> objektumon végig iterálva, vagy azt felhasználva a <a href="http://developer.android.com/reference/android/widget/ListView.html">ListView </a>objektumhoz a <a href="http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html">SimpleCursorAdatpter</a> segítségével kezeljük mi az adatbázis kapcsolatot, a kurzort és az ezzel járó minden nyűgös dolgot. Ez nekem nem igazán tetszett, hiszen a Java világában már jópár éve létezik az <a href="http://en.wikipedia.org/wiki/Object-relational_mapping">ORM</a> technika, amit általában egy J2EE alkalmazásban a <a href="http://www.hibernate.org/">Hibernate</a>-el szoktunk használni (vagy <a href="http://java.sun.com/developer/technicalArticles/J2EE/jpa/">JPA</a> kinek mi tetszik). Így nincs szükség az adatbázis kapcsolat közvetlen kezelésér, kurzorok bezárogatására, adatbázis kivételek kezelésére. Bánatomra a Hibernate és a JPA nem tűnik jó megoldásnak Android alatt, mert a Hibernate nem kezeli megfelelően az SQLite-ot, és különben is miért lövünk ágyúval verébre?</p>
<p>Így arra gondoltam, ORM technikát nem felejtem el, de az itt felmerülő igényeknek megfelelően alakítom ki. Amit meghatároztam igényként:</p>
<ul>
<li>Lightweight megoldás, lehetőleg J2EE technológiák nélkül</li>
<li>Az alkalmazás felületének és üzelti logikájának elkülönítése az adatbázistól</li>
<li>Az adatbázis POJO objektumokon keresztül reprezentált</li>
</ul>
<p>Nem tűnik nagy feladatnak, mégis sokat segít majd később. Elsőként kitaláltam egy alkalmazást. Mindig is szerettem a helyzetmeghatározással foglalkozni, tároljunk hát térkép pontokat adatbázisban.</p>
<p>A tábla szerkezete:</p>
<ul>
<li>id</li>
<li>név</li>
<li>szélesség</li>
<li>hosszúság</li>
<li>magasság</li>
</ul>
<p>Az adatbázis műveletekhez létrehoztam egy <a href="http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html">SQLiteOpenHelper </a>osztályt a <a href="http://developer.android.com/guide/topics/data/data-storage.html#db">developer portálon megfogalmazottak</a> szerint:</p>
<pre class="brush: java">public class DatabaseHelper extends SQLiteOpenHelper {

private static final String TAG = "DatabaseHelper";
private static final String DATABASE_NAME = "mydatabase.db";
private static final int DATABASE_VERSION = 1;

public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + MapPoint.TABLE_NAME + " (" +
MapPoint._ID + " integer primary key," +
MapPoint.NAME + " text," +
MapPoint.LATITUDE + " real," +
MapPoint.LONGTITUDE + " real," +
MapPoint.ALTITUDE + " integer);");
}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

Log.w(TAG, "Upgrading database from version " + oldVersion + " to "

+ newVersion + ", which will destroy all old data");

db.execSQL("DROP TABLE IF EXISTS mappoint");

onCreate(db);

}

}
</pre>
<p>Az osztályból látszik, hogy szükséges egy MapPoint nevű osztály. Az ORM-ben ez az osztály lesz a Model osztályom. Így néz ki:</p>
<pre class="brush: java">public class MapPoint implements BaseColumns {

 public static String NAME = "name";
 public static String LATITUDE = "latitude";
 public static String LONGTITUDE = "longtitude";
 public static String ALTITUDE = "altitude";

 public static String TABLE_NAME = "mappoint";

 public static final String DEFAULT_SORT_ORDER = "name";

 private Long _id;
 private String name;
 private Double latitude;
 private Double longtitude;
 private Integer altitude;

 public Long get_id() {
 return _id;
 }
 public void set_id(Long _id) {
 this._id = _id;
 }
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public Double getLatitude() {
 return latitude;
 }
 public void setLatitude(Double latitude) {
 this.latitude = latitude;
 }
 public Double getLongtitude() {
 return longtitude;
 }
 public void setLongtitude(Double longtitude) {
 this.longtitude = longtitude;
 }
 public Integer getAltitude() {
 return altitude;
 }
 public void setAltitude(Integer altitude) {
 this.altitude = altitude;
 }
}
</pre>
<p>A Model osztály az Adroidos <a href="http://developer.android.com/reference/android/provider/BaseColumns.html">BaseColumn</a>-ból származik, ami miatt egy _ID nevű mező van definiálva benne. Ez azért jó, mert ilyen mezője minden SQLite adatbázs táblának kell legyen, és így nem kell külön foglalkozni vele.<br />
 A Model osztályban nem biztos, hogy jó helyen vannak a statikus tulajdonságok, de egyelőre itt hagyom őket. Ezeket a Notepad tutorial a ContentProvider-be rakja, de nekünk ilyenünk nem lesz.</p>
<p>Végül a legfontosabb elem, a DAO osztály következik. Ez az osztály intézi el végül is az ORM-et, lekéri az adatbázisból a rekordokat, map-eli őket a Model osztályba, jelen esetben a MapPoint-be.</p>
<pre class="brush: java">public class MapPointDao {

 private DatabaseHelper databaseHelper;

 public MapPointDao(Context context) {
 this.databaseHelper = new DatabaseHelper(context);
 }

 public int deleteById(long id) {
 return -1;
 }

 public long insert(MapPoint mapPoint) {
 ContentValues values = new ContentValues();
 values.put(MapPoint.NAME, mapPoint.getName());
 values.put(MapPoint.LATITUDE, mapPoint.getLatitude());
 values.put(MapPoint.LONGTITUDE, mapPoint.getLongtitude());
 values.put(MapPoint.ALTITUDE, mapPoint.getAltitude());

 SQLiteDatabase db = databaseHelper.getWritableDatabase();        

 long rowId = db.insertOrThrow(MapPoint.TABLE_NAME, MapPoint.NAME, values);
 db.close();

 if (rowId &gt; 0) {
 return rowId;
 }

 throw new SQLException("Failed to insert row into ");
 }

 public List find(boolean distinct, String[]  columns,
 String  selection, String[]  selectionArgs, String  groupBy, String  having,
 String  orderBy, String  limit) {

 MapPoint mapP = new MapPoint();
 mapP.set_id(new Long(1));
 mapP.setAltitude(new Integer(2));
 mapP.setLongtitude(new Double(200));

 findByExample(mapP);

 if (TextUtils.isEmpty(orderBy)) {
 orderBy = MapPoint.DEFAULT_SORT_ORDER;
 }

 SQLiteDatabase db = databaseHelper.getReadableDatabase();
 Cursor c = db.query(distinct, MapPoint.TABLE_NAME, columns, selection, selectionArgs, groupBy, having,
 orderBy, limit);

 List list = new ArrayList();

 while (c.moveToNext()) {
 MapPoint mapPoint = new MapPoint();

 mapPoint.set_id(c.getLong(c.getColumnIndex(MapPoint._ID)));
 mapPoint.setName(c.getString(c.getColumnIndex(MapPoint.NAME)));
 mapPoint.setAltitude(c.getInt(c.getColumnIndex(MapPoint.ALTITUDE)));
 mapPoint.setLatitude(c.getDouble(c.getColumnIndex(MapPoint.LATITUDE)));
 mapPoint.setLongtitude(c.getDouble(c.getColumnIndex(MapPoint.LONGTITUDE)));

 list.add(mapPoint);
 }
 c.close();
 db.close(); 

 return list;
 }

 public List find(String  selection, String[]  selectionArgs) {
 return find(false,null,selection, selectionArgs, null, null, null, null);
 }

 public List findAll() {
 return find(null,null);
 }

 public int update(MapPoint mapPoint) {
 return -1;
 }

 public List&lt;Map&lt;String, String&gt;&gt; convertForAdapter(List&lt;MapPoint&gt; mapPointList) {
 List&lt;Map&lt;String, String&gt;&gt; list = new ArrayList&lt;Map&lt;String, String&gt;&gt;();
 for (int i=0; i&lt;mapPointList.size(); i++) {
 Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();

 map.put(MapPoint._ID, String.valueOf(mapPointList.get(i).get_id()));
 map.put(MapPoint.NAME, mapPointList.get(i).getName());
 map.put(MapPoint.LATITUDE, String.valueOf(mapPointList.get(i).getLatitude()));
 map.put(MapPoint.LONGTITUDE, String.valueOf(mapPointList.get(i).getLongtitude()));
 map.put(MapPoint.ALTITUDE, String.valueOf(mapPointList.get(i).getAltitude()));
  list.add(map);
 }
 return list;
 }
}
</pre>
<p>A DAO osztály-t nem fejeztem be, csak a find() és insert() metódusokat programoztam le, a delete() és update() mindeninek házi feladat <img class="wp-smiley" src="http://codeplay.hu/wp-includes/images/smilies/icon_smile.gif" alt=":)" /> . Az igazság az, hogy már most rájöttem ez nem egészen lesz így jó, mert a DAO osztályt így minden adatbázis táblára létre kell hoznom, minden mezőt egyesével map-elni kell. Nem szeretem az ilyet.</p>
<p>A DAO minden lekérdező metódusa a Model osztályt, vagy az ebből generált lista objektumot adja vissza lekérdezésnél. A módosító metódusok általában azt adják vissza, mennyi rekord módosult, az insert() pedig az új rekord id-t.</p>
<p>Lényeges kiemelni a DAO osztály convertForAdapter() metódusát, ami a <a href="http://developer.android.com/reference/android/widget/SimpleAdapter.html">SimpleAdatpter </a>számára fog használható objektumstruktúrát előállítani. A find() által visszaadott List objektumból egy más struktúrájú listát állít elő, aminek az elemei már nem Model osztályok.</p>
<p>Végül lássuk, hogyan jelenik meg az Activity-ben a ListView. Az egész Activity-t nem másolom ide be, csak egyes részeit.</p>
<pre class="brush: java"> private ListView listMapPoints;

 private List mapPointList;
 private MapPointDao mapPointDao;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);

 this.listMapPoints = (ListView) findViewById(R.id.listMapPoints);

 mapPointDao = new MapPointDao(this);                

 refreshList();
 }

 private void refreshList() {
 mapPointList = mapPointDao.findAll();

 int[] i = { R.id.textName, R.id.textDesc };
 String[] s = { "name", "_id" };

 this.listMapPoints.setAdapter(
 new SimpleAdapter(this, mapPointDao.convertForAdapter(mapPointList),
 R.layout.pointlistitem,s,i));
 }
</pre>
<p>Először az onCreate()-ben kikeressük a ListView objektumot a layout fájlból, majd létrehozzuk a DAO-t. A refreshList() metódusban programoztam le az lista elemek lekérdezését, mert így a refresh esetleg máshonnan is meghívható. Például egy dialógus ablakot definiálhatunk, ami törölni tud lista elemeket, és a törlés után jó ha a lista frissül.</p>
<h3>Miért jó?</h3>
<ul>
<li>Szerintem elég lightweight lett, nem igényel külső lib-et</li>
<li>Az adatbázis kezelés a program egyetlen pontján van, nem kell az Activity-ben foglalkozni a kurzorral</li>
<li>POJO osztályok</li>
<li>Elkülönül az üzleti logika, a megjelenítés és a perzisztencia réteg (MVC)</li>
</ul>
<h3>Problémák</h3>
<p>Természetesen ezzel nem állítottam elő egy Hibernate funkcionalitású ORM-et. A fentebbi programban elférnének a következő kiegészítések:</p>
<ul>
<li>A DAO egyes metódusainak paraméterezése történhetne Model osztállyal, így szűrőket lehetne megadni. Például findByExample(Model model) vagy deleteByExample(Model model)</li>
<li>Jó lenne a DAO-t generikusra megírni, hogy ne kelljen mindig a mapeléseket megírni</li>
<li>A DatabaseHelper az adatbázis szkriptet betölthetné külső fájlból vagy resource-ból</li>
<li>A DAO-ban az adatbázis kapcsolatokat nem kellene mindig bezárni, egyszer kéne a konstruktorban létrehozni, és a nyitottat használni</li>
<li>Jó lenne megoldani a foreign key-ek kezelését a Model-ben és a DAO-ban, hogy ne kelljen többször bekérdezni, ha például egy lista több táblából épül fel.</li>
<li>Hibakezelés és logolás</li>
</ul>
<p>Tovább fogom fejleszteni kis alkalmazásomat, így a fentebbi problémákra megoldást fogok kidolgozni, amit hasonló módon publikálni fogok.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeplay.hu/developer/2010/05/android-es-adatbazis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Digital Reality szerződés</title>
		<link>http://codeplay.hu/news/2010/05/digital-reality-szerzodes/</link>
		<comments>http://codeplay.hu/news/2010/05/digital-reality-szerzodes/#comments</comments>
		<pubDate>Mon, 17 May 2010 22:51:38 +0000</pubDate>
		<dc:creator>kepes</dc:creator>
				<category><![CDATA[Hírek]]></category>
		<category><![CDATA[digital reality]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[partner]]></category>

		<guid isPermaLink="false">http://codeplay.hu/?p=27</guid>
		<description><![CDATA[Ma aláírtuk keretszerződésünket az ország legnagyobb, nemzetközi hírnevű  játékszoftver fejlesztő cégével, a Digital Reality-vel. A CodePlay java-s tudását szeretnék kihasználni projektjeikben, amikről egyelőre többet nem mondhatunk. Szigorúan titkos! Írok azonban néhány gondolatot az irodáról, ami azt hiszem elég mély benyomást tett ránk, talán összevethető a hírhedt Google irodákkal.A DR neve valószínűleg mindenki számára ismerősen cseng, aki [...]]]></description>
			<content:encoded><![CDATA[<p><br class="spacer_" /></p>
<p>Ma aláírtuk keretszerződésünket az ország legnagyobb, nemzetközi hírnevű  játékszoftver fejlesztő cégével, a <a href="http://www.digitalreality.hu/">Digital Reality-vel</a>. A CodePlay java-s tudását szeretnék kihasználni projektjeikben, amikről egyelőre többet nem mondhatunk. Szigorúan titkos! Írok azonban néhány gondolatot az irodáról, ami azt hiszem elég mély benyomást tett ránk, talán összevethető a hírhedt Google irodákkal.<span id="more-27"></span>A DR neve valószínűleg mindenki számára ismerősen cseng, aki játszott PC-vel. Azoknak talán még inkább, akik ezt a 90-es években űzték, mint én. Mindig is szívesen emlékszem vissza a PC-s játékok hőskorára, amikor barátaimmal még talán a 386SX előtt ülve játszottuk végig az első magyar fejlesztésű játékokat, a <a href="http://en.wikipedia.org/wiki/Digital_Reality">Reuniont és az Imperium Galactica</a>-t. Ma meglepődve tapasztaltam, hogy a cég szépen kinőtte magát, nem egy kis hazai cégről beszélünk.</p>
<p>Ezt tükrözi a Kerepesi út szomszédságában levő iroda is, ahova belépve azonnal észrevehető volt egy olyan “feeling” amit eddig nem tapasztaltunk, csak a neten olvashattunk róla esetleg a Google irodáival kapcsolatban. Megérne egy külön képriportot az rengeteg dolog, amivel az itt dolgozók életét próbálják jobbá tenni. Az első szembeötlő a darts gép volt, ami még nem olyan egetverő újítás, más irodában is láttunk már (nálunk is van a falon, bár nem gép <img src="http://codeplay.hu/wp-includes/images/smilies/icon_smile.gif" alt=":)" /> ), de a ping-pong asztal és a meglehetősen nagy, mint később kiderült 120 fős előadó és vetítő terem mellett már nem lehet elmenni. Itt valamit másképp gondolnak, az biztos. Az iroda kinézete meglehetősen modern, hatalmas üveg falak választják el az irodát a folyosótól, amikre még írni is lehet tábla helyett. Vicces volt látni a felrajzolt kockákat és nyilakat az üveg felületekre, látszik, programozók ülnek az asztaloknál.<br />
 A tárgyalóban, ahol a megbeszélés zajlott, hatalmas plazmatévé, 5.1 hangrendszer és legalább három játékgép volt. Ez gondolom természetes lehet egy játékszoftver fejlesztő cégnél, de azért nekünk megakadt a szemünk rajta. Egy xbox még csak-csak elmegy, de ez már sok egy picit. Azt hiszem az i-re a pontot a megbeszélés közben tartott szünet tette fel, amikor is gyanútlanul kinéztünk az ablakon, és előbukkant a műfüves focipálya és kosárpálya, amihez még talán egy kisebb lelátó is volt. Azt hiszem kénytelen leszek a Rákóczi úton az udvart műfűvel borítani, hogy lépést tudjunk tartani.</p>
<p>Szeretem azt hinni, hogy a szoftverfejlesztés egy kicsit “más” munka. Talán a művészethez hasonló, kreatív tevékenység, amihez a szokványos értelemben vett “munkakörülmények” nem megfelelőek. Öröm volt látni, hogy mások is így gondolják. Ha nem is mindenki játszik mindennap az xbox-al, vagy van minden nap focimeccs, de a lehetőség adott, hogy kikapcsoljon az ember, és ezzel növelje teljesítményét és kreativitását a munkában.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeplay.hu/news/2010/05/digital-reality-szerzodes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>KELER Zrt. eIsin igénylő rendszer bevezetés</title>
		<link>http://codeplay.hu/news/2010/05/keler-zrt-eisin-igenylo-rendszer-bevezetes/</link>
		<comments>http://codeplay.hu/news/2010/05/keler-zrt-eisin-igenylo-rendszer-bevezetes/#comments</comments>
		<pubDate>Sat, 01 May 2010 22:47:45 +0000</pubDate>
		<dc:creator>kepes</dc:creator>
				<category><![CDATA[Hírek]]></category>
		<category><![CDATA[alkalmazás]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[keler]]></category>
		<category><![CDATA[partner]]></category>
		<category><![CDATA[projekt]]></category>

		<guid isPermaLink="false">http://codeplay.hu/?p=23</guid>
		<description><![CDATA[Április folyamán bevezetésre került a KELER Zrt-nél a CodePlay által fejlesztett Internetes keretrendszer, valamint az eIsin Internetes ISIN azonosító igénylő rendszer, amely elérhető a https://isin.keler.hu címen. A megrendelő visszajelzései alapján az eIsin-t számos ügyfelük kezdte el használni, így nagyban leegyszerűsítve az ISIN igénylési folyamatot, valamint a hozzá kapcsolódó fizetési procedúrát. Az eIsin rendszer alkalmas az országban [...]]]></description>
			<content:encoded><![CDATA[<p>Április folyamán bevezetésre került a KELER Zrt-nél a CodePlay által fejlesztett Internetes keretrendszer, valamint az eIsin Internetes ISIN azonosító igénylő rendszer, amely elérhető a <a href="https://isin.keler.hu/">https://isin.keler.hu</a> címen. A megrendelő visszajelzései alapján az eIsin-t számos ügyfelük kezdte el használni, így nagyban leegyszerűsítve az ISIN igénylési folyamatot, valamint a hozzá kapcsolódó fizetési procedúrát.</p>
<p>Az eIsin rendszer alkalmas az országban forgalomban levő részvények, kötvények, és értékpapírok kibocsátásához szükséges Isin azonosító igénylésére. A rendszerbe bejelentkezett felhasználó az értékpapír adatok valamint a kibocsátó megadásával indíthatja el az igénylési folyamatot, melynek során on-line bankkártyás fizetéssel egyenlítheti ki számláját, majd a folyamat végén azonnal hozzáfér új Isin kódjához. A rendszerhez kapcsolatban van a KELER Zrt. hátér rendszereivel, valamint mindenre kiterjedő naplózó és monitorozó rendszert tartalmaz. A szoftver alapjául szolgáló Internetes keretrendszer képes további KELER-es szolgáltatások egyszerű, gyors Internetes publikálására.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeplay.hu/news/2010/05/keler-zrt-eisin-igenylo-rendszer-bevezetes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

