{"id":374,"date":"2014-07-26T16:47:34","date_gmt":"2014-07-26T14:47:34","guid":{"rendered":"http:\/\/www.valeriofinazzo.it\/wordpress\/?p=374"},"modified":"2014-07-27T17:06:02","modified_gmt":"2014-07-27T15:06:02","slug":"android-tutorial-5-integrare-un-database","status":"publish","type":"post","link":"http:\/\/www.valeriofinazzo.it\/wordpress\/2014\/07\/android-tutorial-5-integrare-un-database\/","title":{"rendered":"ANDROID TUTORIAL &#8211; 5 \u2013 INTEGRARE UN DATABASE"},"content":{"rendered":"<p style=\"text-align: justify;\">In Android molte applicazioni necessitano di un database per conservare le informazioni per un uso successivo. Realizzeremo insieme un crud, ovvero un app che consente le tipiche operazioni di gestione di una entit\u00e0:<br \/>\ncreazione, ricerca, aggionrnamento e cancellazione.<br \/>\nIl database di riferimento \u00e8 <a title=\"sqlite\" href=\"http:\/\/www.sqlite.org\/\" target=\"_blank\">SQLite<\/a>, il package offerto da android \u00e8\u00a0<a title=\"android.database.sqlite\" href=\"http:\/\/developer.android.com\/reference\/android\/database\/sqlite\/package-summary.html\" target=\"_blank\">android.database.sqlite<\/a>.<\/p>\n<p style=\"text-align: justify;\">Per poter accedere al nostro database occorre estendere la classe\u00a0SQLiteOpenHelper, che prevede l&#8217;implementazione dei metodi creazione del database.<\/p>\n<pre class=\"lang:default decode:true \">public class DatabaseHelper extends SQLiteOpenHelper {\r\n\r\npublic static final String DB = \"gestoremarket\";\r\npublic static final int SCHEMA_VERSION = 1;\r\npublic static final String DATABASE_NAME = \"gestoremarket.db\";\r\n\r\npublic DatabaseHelper(Context context) {\r\nsuper(context, DATABASE_NAME, null, SCHEMA_VERSION);\r\n}\r\n\r\n@Override\r\npublic void onCreate(SQLiteDatabase db) {}\r\n\r\n@Override\r\npublic void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {}\r\n\r\n}<\/pre>\n<p style=\"text-align: justify;\">Il costruttore prevede la creazione di un database con una determinata versione e sono previsti i metodi che verranno lanciati alla creazione del database e\/o al suo aggiornamento., All&#8217;interno dei metodi \u00e8 possibile lanciare degli script sql per aggiornare il database.<\/p>\n<p style=\"text-align: justify;\">A questo punto dobbiamo definire la classe per la gestione della nostra tabella, tale classe implementa l&#8217;interfaccia BaseColumns, che prevede la presenza di una primary key _ID (tale approccio non \u00e8 obbligatorio, ma \u00e8 consigliato da Google per uno sviluppo pi\u00f9 armonico)<\/p>\n<p style=\"text-align: justify;\">Nel nostro caso prevediamo una classe cos\u00ec fatta<\/p>\n<pre class=\"lang:default decode:true\">public class MarketTable implements BaseColumns {\r\n\r\npublic static String TABLE_NAME = \"MARKET\";\r\npublic static String NAME = \"NAME\";\r\npublic static String CITY = \"CITY\";\r\npublic static String ADDRESS = \"ADDRESS\";\r\npublic static String CANCELLATO = \"CANCELLATO\";\r\n\r\npublic static String[] COLUMNS = new String[] {_ID, NAME, CITY, ADDRESS, CANCELLATO };\r\n\r\n}<\/pre>\n<p style=\"text-align: justify;\">Non resta che definire la classe DAO responsabile dei metodi di lettura e scrittura sul nostro db<\/p>\n<pre class=\"lang:default decode:true\">public class MarketDao {\r\n\r\nprivate DatabaseHelper databaseHelper;\r\n\r\npublic MarketDao(Context context) {\r\ndatabaseHelper = new DatabaseHelper(context);\r\n}\r\n\r\npublic List&lt;Market&gt; getAll() {\r\n \r\nSQLiteDatabase database = databaseHelper.getReadableDatabase();\r\n \r\n List&lt;Market&gt; list = new ArrayList&lt;Market&gt;();\r\n \r\n String sql = \r\n String.format(\"select \" +\r\n \"market._id, \" +\r\n \"market.name, \" +\r\n \"market.city, \" +\r\n \"market.address \" +\r\n \"from market \" +\r\n \"where market.cancellato = 0\") ;\r\n Log.i(DatabaseHelper.DATABASE_NAME, sql); \r\n Cursor cursor = database.rawQuery(sql, null);\r\n \r\n cursor.moveToFirst();\r\n while (!cursor.isAfterLast()) {\r\n Market market = getMarket(cursor);\r\n list.add(market);\r\n cursor.moveToNext();\r\n }\r\n \r\n cursor.close();\r\n \r\n database.close();\r\n \r\n return list;\r\n}\r\n\r\npublic void delete(Long id) {\r\nSQLiteDatabase database = databaseHelper.getWritableDatabase();\r\nString sql = \r\nString.format(\"update market \" +\r\n\"set cancellato = 1 \" +\r\n\" where _id = %d \", id) ;\r\nLog.i(DatabaseHelper.DATABASE_NAME, sql);\r\ndatabase.execSQL(sql);\r\ndatabase.close();\r\n}\r\n\r\npublic void save(Market item) {\r\nSQLiteDatabase database = databaseHelper.getWritableDatabase();\r\nContentValues contentValues = creaContentValues(item);\r\nif (item.getId()==null) {\r\nlong insertOrThrow = database.insertOrThrow(MarketTable.TABLE_NAME, null, contentValues);\r\nitem.setId(insertOrThrow);\r\n} else\r\ndatabase.update(MarketTable.TABLE_NAME, contentValues, \" _id = \" + item.getId(), null);\r\ndatabase.close();\r\n}\r\n\r\nprivate ContentValues creaContentValues(Market item) {\r\nContentValues contentValues = new ContentValues();\r\ncontentValues.put(MarketTable._ID, item.getId());\r\ncontentValues.put(MarketTable.NAME, item.getName());\r\ncontentValues.put(MarketTable.CANCELLATO, item.getCancellato());\r\ncontentValues.put(MarketTable.CITY, item.getCity());\r\ncontentValues.put(MarketTable.ADDRESS, item.getAddress());\r\nreturn contentValues;\r\n}\r\n}<\/pre>\n<p style=\"text-align: justify;\">Dall&#8217;analisi della classe si vede come la classe Helper\u00a0permetta di accedere al database in lettura e\/o scrittura tramite i metodi<\/p>\n<pre class=\"lang:default decode:true\">SQLiteDatabase database = databaseHelper.getWritableDatabase();<\/pre>\n<pre class=\"lang:default decode:true\">SQLiteDatabase database = databaseHelper.getReadableDatabase();<\/pre>\n<p style=\"text-align: justify;\">Ottenuta l&#8217;istanza del database la classe mette a disposizione dei metodi per la gestione dei dati, che permettono di eseguire del codice sql oppure tramite l&#8217;uso di classi container, tipo ContentValues, che consentono l&#8217;interazione con il database anche con una limitata conoscenza di sql.<\/p>\n<p style=\"text-align: justify;\">Buona sperimentazione.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In Android molte applicazioni necessitano di un database per conservare le informazioni per un uso successivo. Realizzeremo insieme un crud, ovvero un app che consente le tipiche operazioni di gestione di una entit\u00e0: creazione, ricerca, aggionrnamento e cancellazione. Il database di riferimento \u00e8 SQLite, il package offerto da android \u00e8\u00a0android.database.sqlite. Per poter accedere al nostro &hellip; <a href=\"http:\/\/www.valeriofinazzo.it\/wordpress\/2014\/07\/android-tutorial-5-integrare-un-database\/\" class=\"more-link\">Continua la lettura di <span class=\"screen-reader-text\">ANDROID TUTORIAL &#8211; 5 \u2013 INTEGRARE UN DATABASE<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[35],"tags":[36,71],"_links":{"self":[{"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/posts\/374"}],"collection":[{"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/comments?post=374"}],"version-history":[{"count":12,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/posts\/374\/revisions"}],"predecessor-version":[{"id":386,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/posts\/374\/revisions\/386"}],"wp:attachment":[{"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/media?parent=374"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/categories?post=374"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/tags?post=374"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}