Autore Topic: Gestire DB remoto via AppEngine  (Letto 3799 volte)

Offline IacopoDeeNosee

  • Utente junior
  • **
  • Post: 128
  • Respect: +33
    • Google+
    • iacopodeenosee
    • Mostra profilo
    • visualhunter
  • Dispositivo Android:
    Samsung Nexus S - GT-I9023
  • Play Store ID:
    IacopoDeeNosee
  • Sistema operativo:
    Arch linux x86_64
Gestire DB remoto via AppEngine
« il: 01 Settembre 2011, 19:25:51 CEST »
+2
In questo post vedrò di mostrare un semplice esempio di come sia possibile gestire un RDBMS remoto tramite AppEngine,ricordo che il servizio è offerto da Google in forma gratuita purché non si superino 1GB di dati persistenti e le 5000 entità(record).
Per configurare Eclipse seguita questa guida: Using the Google Plugin for Eclipse - Google App Engine - Google Code
Per creare/attivare un account AppEngine seguite questa guida: Creating your App Engine Account - Google Developer Codelabs
questa è la classe del client che si interfaccia con l'app pubblicata su AppEngine:
Codice (Java): [Seleziona]
public class Test_RestCommActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
               
                final EditText etInputNumber = (EditText) findViewById(R.id.et_actMain_inputnumber);
                final EditText etInputKey = (EditText) findViewById(R.id.et_actMain_inputkey);
                final EditText etInputName = (EditText) findViewById(R.id.et_actMain_inputname);
               
                final TextView tvResponse = (TextView) findViewById(R.id.tv_actMain_response);

                Button btnSend = (Button) findViewById(R.id.btn_actMain_send);
                btnSend.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View view) {
                                /*
                                 * insert new entity
                                 */

                                HTTPRestClient client = new HTTPRestClient("http://_______.appspot.com/test_restserver");
                                //HTTPRestClient client = new HTTPRestClient("http://10.0.2.2:8888/test_restserver");
                               
                                client.AddParam("insert_key", etInputKey.getText().toString());                        
                                client.AddParam("insert_name", etInputName.getText().toString());                                                      
                                client.AddParam("insert_num", etInputNumber.getText().toString());

                                try {
                                        client.Execute(RequestMethod.GET);
                                } catch (Exception e) {
                                        tvResponse.setText(e.getMessage());
                                }

                                tvResponse.setText(getString(R.string.tv_label_return) + "\n" + client.getResponse());
                        }
                });
               
                Button btnGetAllData = (Button) findViewById(R.id.btn_actMain_getallrecord);
                btnGetAllData.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View view) {
                                /*
                                 * request all data record
                                 */

                                HTTPRestClient client = new HTTPRestClient("http://_______.appspot.com/test_restserver");
                                //HTTPRestClient client = new HTTPRestClient("http://10.0.2.2:8888/test_restserver");
                               
                                client.AddParam("get_all_data","");

                                try {
                                        client.Execute(RequestMethod.GET);
                                } catch (Exception e) {
                                        tvResponse.setText(e.getMessage());
                                }

                                tvResponse.setText(getString(R.string.tv_label_return) + "\n" + client.getResponse());
                        }
                });
               
                Button btnEraseAllData = (Button) findViewById(R.id.btn_actMain_eraseallrecord);
                btnEraseAllData.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View view) {
                                /*
                                 * erase all data record
                                 */

                                HTTPRestClient client = new HTTPRestClient("http://_______.appspot.com/test_restserver");
                                //HTTPRestClient client = new HTTPRestClient("http://10.0.2.2:8888/test_restserver");
                               
                                client.AddParam("erase_all_data","");

                                try {
                                        client.Execute(RequestMethod.GET);
                                } catch (Exception e) {
                                        tvResponse.setText(e.getMessage());
                                }

                                tvResponse.setText(getString(R.string.tv_label_return) + "\n" + client.getResponse());
                        }
                });
               
                Button btnEraseData = (Button) findViewById(R.id.btn_actMain_delete);
                btnEraseData.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View view) {
                                /*
                                 *erase a specific entity
                                 */

                                EditText etKey = (EditText) findViewById(R.id.et_actMain_get_delete_input);
                               
                                HTTPRestClient client = new HTTPRestClient("http://_______.appspot.com/test_restserver");
                                //HTTPRestClient client = new HTTPRestClient("http://10.0.2.2:8888/test_restserver");
                               
                                client.AddParam("delete_data_by_key",etKey.getText().toString());

                                try {
                                        client.Execute(RequestMethod.GET);
                                } catch (Exception e) {
                                        tvResponse.setText(e.getMessage());
                                }

                                tvResponse.setText(getString(R.string.tv_label_return) + "\n" + client.getResponse());
                        }
                });
               
                Button btnGetData = (Button) findViewById(R.id.btn_actMain_get);
                btnGetData.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View view) {
                                /*
                                 *get data from specific entity
                                 */

                                EditText etKey = (EditText) findViewById(R.id.et_actMain_get_delete_input);
                               
                                HTTPRestClient client = new HTTPRestClient("http://_______.appspot.com/test_restserver");
                                //HTTPRestClient client = new HTTPRestClient("http://10.0.2.2:8888/test_restserver");
                               
                                client.AddParam("get_data_by_key",etKey.getText().toString());

                                try {
                                        client.Execute(RequestMethod.GET);
                                } catch (Exception e) {
                                        tvResponse.setText(e.getMessage());
                                }

                                tvResponse.setText(getString(R.string.tv_label_return) + "\n" + client.getResponse());
                        }
                });
               
        }
Questa è la classe servlet che si interfaccia col DB:
Codice (Java): [Seleziona]
@SuppressWarnings("serial")
public class Test_RestServerServlet extends HttpServlet {
        public void doGet(HttpServletRequest req, HttpServletResponse resp)
                        throws IOException {

                String strKey = null, strName = null, strNum = null;
                boolean actGetAll, actEraseAll, actGetId, actEraseId;
                actGetAll = actEraseAll = actGetId = actEraseId = false;

                resp.setContentType("text/plain");

                if (req.getParameterMap().containsKey("insert_key")) {
                        strKey = new String(req.getParameter("insert_key"));
                }
                if (req.getParameterMap().containsKey("insert_name")) {
                        strName = new String(req.getParameter("insert_name"));
                }
                if (req.getParameterMap().containsKey("insert_num")) {
                        strNum = new String(req.getParameter("insert_num"));
                }
                if (req.getParameterMap().containsKey("get_all_data")) {
                        actGetAll = true;
                        resp.getWriter().println(getallData());
                }
                if (req.getParameterMap().containsKey("get_data_by_key")) {
                        actGetId = true;
                        resp.getWriter().println(
                                        getDataByKey(req.getParameter("get_data_by_key")));
                }
                if (req.getParameterMap().containsKey("delete_data_by_key")) {
                        actEraseId = true;
                        resp.getWriter().println(
                                        deleteDataByKey(req.getParameter("delete_data_by_key")));
                }
                if (req.getParameterMap().containsKey("erase_all_data")) {
                        actEraseAll = true;
                        eraseallData();
                }

                if (strKey != null || strName != null || strNum != null) {
                        /*
                         * insert data into JPA system
                         */

                        insertData(strKey, strName, strNum);

                        resp.getWriter().println(
                                        "OK,Receive INSERT REQ :3 data\n" + strKey.toString()
                                                        + " - " + strName.toString() + " - "
                                                        + strNum.toString());

                } else if (actGetAll == true) {
                        resp.getWriter().println("\nGet all request");
                } else if (actEraseAll == true) {
                        resp.getWriter().println("\nErase all request");
                } else if (actEraseId == true) {
                        resp.getWriter().println("\nErase ID request");
                } else if (actGetId == true) {
                        resp.getWriter().println("\nGet ID request");
                } else
                        resp.getWriter().println("\nERROR REST REQUEST!!!");

        }

        private void insertData(String strKey, String strName, String strNum) {
                EntityManager em = EMF.get().createEntityManager();

                try {
                        em.getTransaction().begin();
                        em.persist(new TestDataRecord(strKey, strName, strNum));
                        em.getTransaction().commit();

                } finally {
                        em.close();
                }
        }

        private String getallData() {
                EntityManager em = EMF.get().createEntityManager();
                StringBuilder strblT = new StringBuilder();

                try {
                        final List<TestDataRecord> list = em.createQuery(
                                        "select d from TestDataRecord d").getResultList();

                        int numRecord = list.size();
                        strblT.append("\nRecord found:" + String.valueOf(numRecord));

                        for (TestDataRecord current : list) {
                                strblT.append("\nkey :" + current.getDataKey() + "\nname :"
                                                + current.getDataName() + "\nnum :"
                                                + current.getDataNum() + "------\n");
                        }

                        return strblT.toString();

                } finally {
                        em.close();
                }
        }

        private void eraseallData() {
                EntityManager em = EMF.get().createEntityManager();

                try {
                        Query q = em.createQuery("DELETE FROM TestDataRecord m");
                        q.executeUpdate();

                } finally {
                        em.close();
                }
        }

        private String getDataByKey(String strKey) {
                EntityManager em = EMF.get().createEntityManager();

                try {
                        Query q = em
                                        .createQuery("SELECT d FROM TestDataRecord d WHERE d.dataKey =  ?1");
                        q.setParameter(1, strKey);
                        try {
                                TestDataRecord tdrT = (TestDataRecord) q.getSingleResult();

                                return tdrT.getDataKey() + " - " + tdrT.getDataName() + " - "
                                                + tdrT.getDataNum();
                        } catch (NoResultException e) {
                                return "ERROR - not found record";
                        }
                } finally {
                        em.close();
                }
        }

        private String deleteDataByKey(String strKey) {
                EntityManager em = EMF.get().createEntityManager();

                try {
                        Query q = em
                                        .createQuery("SELECT d FROM TestDataRecord d WHERE d.dataKey =  ?1");
                        q.setParameter(1, strKey);

                        try {

                                em.getTransaction().begin();
                                TestDataRecord tdrT = (TestDataRecord) q.getSingleResult();
                                em.remove(tdrT);
                                em.getTransaction().commit();

                                return "REMOVE OK";
                        } catch (NoResultException e) {
                                return "ERROR - not found record";
                        }
                } finally {
                        em.close();
                }
        }
}
Questa è la classe che Identifica l'elemento base del DB:
Codice (Java): [Seleziona]
@Entity
public class TestDataRecord {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Key key;
        private String dataKey;
        private String dataName;
        private String dataNum;

        /*
         * methods for access to a data from app
         */

        public TestDataRecord(String strKey,String strName,String strNum){
                setDataKey(strKey);
                setDataName(strName);
                setDataNum(strNum);
        }
        public Key getKey() {
                return key;
        }
        public String getDataKey() {
                return dataKey;
        }
        public void setDataKey(String strT) {
                this.dataKey = strT;
        }
        public String getDataName() {
                return dataName;
        }
        public void setDataName(String strT) {
                this.dataName = strT;
        }
        public String getDataNum() {
                return dataNum;
        }
        public void setDataNum(String strT) {
                this.dataNum = strT;
        }
}

Se vi servono qui trovate i manuali: Getting Started: Java - Google App Engine - Google Code
Nel progetto del client ho usato una classe che trovate qua: Calling Web Services in Android using HttpClient | lukencode
vi allego i sorgenti dei due progetti da importare su eclipse,funzionanti a patto di modificare il nome della app pubblicata su AppEngine.8y3
Test_Android_AppEngine.zip - 6.4 MB

Offline ALEX88-ANDR0!D

  • Utente normale
  • ***
  • Post: 173
  • The Special One
  • Respect: +13
    • Google+
    • droidev88
    • Mostra profilo
  • Dispositivo Android:
    HTC DESIRE HD
  • Sistema operativo:
    WINDOWS 7
Re:Gestire DB remoto via AppEngine
« Risposta #1 il: 01 Settembre 2011, 20:15:27 CEST »
0
ottimo tutorial  !! +1  meritatissimo.

riguardo
Citazione
gestire un RDBMS remoto tramite AppEngine,ricordo che il servizio è offerto da Google in forma gratuita purché non si superino 1GB di dati persistenti e le 5000 entità(record).
correggetemi se sbaglio , se uno ha più accaunt google può creare per ogniuno questo AppEngine accaunt quindi in teoria si potrebbero utilizzare 2 o + per la stessa app  , non essendo espertissimo , cmq 1gb di dati / 5000 record si riescono ad arrivare molto velocemente oppure e difficile arrivare a tale soglia .... grazie
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline IacopoDeeNosee

  • Utente junior
  • **
  • Post: 128
  • Respect: +33
    • Google+
    • iacopodeenosee
    • Mostra profilo
    • visualhunter
  • Dispositivo Android:
    Samsung Nexus S - GT-I9023
  • Play Store ID:
    IacopoDeeNosee
  • Sistema operativo:
    Arch linux x86_64
Re:Gestire DB remoto via AppEngine
« Risposta #2 il: 01 Settembre 2011, 20:52:40 CEST »
0
se il tuo scopo e poter usare più servlet hostate su AppEngine con la stessa AppAndroid lo puoi fare,visto che nella versione gratuita puoi pubblicare 10 applicazioni(vado a memoria) ognuna delle quali non può vedere i dati delle altre.
cmq 1gb di dati / 5000 record si riescono ad arrivare molto velocemente oppure e difficile arrivare a tale soglia .... grazie
dipende da che genere di App vuoi fare tu...
io sto studiando questa soluzione perché la vorrei utilizzare su di un app-quiz che sto per pubblicare per tenere una sorta di classifica e delle statistiche,non credo che questa app possa essere scaricata da più di 1000 utenti in breve tempo e il peso di ogni record è minimo perciò penso di starci abbondante nei limiti.
Tornando al codice,prendilo come un punto di partenza visto che è ridotto all'osso e che sono nuovo a questo genere di implementazione.Divertiti  ;-) 8y3