En este artículo voy a tratar de explicar de forma detallada cómo utilizar Google Sheet, que es la hoja de cálculo online de Google, como base de datos para nuestra aplicación. Por ahora, los datos se introducirán directamente en Google Sheet y la app los descargará en formato JSON.
Google Apps Script
Tipos de script
Creación del script
A continuación debemos publicar el script en formato web app. Para ello, en el menú superior seleccionamos Publicar - Implementar como aplicación web.
En el campo Who has access to the app debemos seleccionar entre la diferentes opciones. Si deseas que cualquiera pueda ejecutar el script has de seleccionar Anyone, even anonymous.
Durante la fase de publicación debemos autorizar la ejecución del script:
Una vez haz hecho click en Desploy, nos aparecerá la url que debemos llamar desde nuestra web añadiendo el id de la hoja de cálculo. Por ejemplo, en mi caso sería (he ocultado parte de la url]:
https://script.google.com/macros/s/AKfycbz********Jnw4pUUIDUU-VjrViXH7ahgqN1********EX/exec?id=[id de la hoja de cálculo]
]}
Código en Android
En android, debemos crear una estructura de datos como la de la hoja de cálculo. Para ello, creamos una nueva clase denominada TipsObjectModel:
public class TipsObjectModel {
private String date;
private String title;
private String description;
private String link;
private String keyword;
private String type;
private String version;
public TipsObjectModel(String date, String title, String description,String link, String keyword, String type, String version) {this.date = date;
this.title = title;
this.description = description;
this.link = link;
this.keyword = keyword;
this.type = type;
this.version = version;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
public String getKeyword() {
return keyword;
}
public void setKeyword(String keyword) {
this.keyword = keyword;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
}
import java.util.ArrayList;
public class TipsDataModel {
ArrayList< TipsObjectModel > data = new ArrayList < TipsObjectModel > ();
public TipsDataModel(ArrayList<TipsObjectModel> data) {
this.data = data;
}
public ArrayList<TipsObjectModel> getData() {
return data;
}
public void setData(ArrayList<TipsObjectModel> data) {
this.data = data;
}
}
Para deserializar el formato JSON en un objeto Java utilizaremos la biblioteca de código abierto gson. Para ello importamos dicha biblioteca:
implementation 'com.google.code.gson:gson:2.8.6'
La aplicación debe de tener acceso a internet por lo que debemos dar los permisos adecuados:
<uses-permission android:name="android.permission.INTERNET" />
A continuación puedes descargar la base de datos en formato JSON. Para ello voy a utilizar el siguiente código utilizando HttpURLConnection que es es el cliente HTTP estándar para Android, utilizado para enviar y recibir datos a través de la web. Es una implementación concreta de URLConnection para HTTP (RFC 2616).
Declaro el objeto tips:
private TipsDataModel tips;
Llamo a la función loadTips()
private void loadTips() {
String url = "https://script.google.com/macros/s/.../exec?id=...";
new DownloadJSONTips().execute(url);
}
private class DownloadJSONTips extends AsyncTask<String, Void, String> {
Exception error;
@Override
protected String doInBackground(String... urls) {
try {
return downloadUrl(urls[0],"UTF-8");
} catch (IOException e) {
error = e;
return "ERROR";
}
}
@Override
protected void onPostExecute(String result) {
if (result.equals("ERROR")) {
Toast.makeText(TipsActivity.this, "ERROR downloading Tips",Toast.LENGTH_SHORT).show();
} else {
Gson gson = new GsonBuilder().create();
try {
tips = gson.fromJson(result, TipsDataModel.class);
showTips();
} catch (IllegalStateException | JsonSyntaxException exception) {
Toast.makeText(TipsActivity.this, "ERROR downloading Tips",Toast.LENGTH_SHORT).show();
}
}
}
}
//Conecta y descarga
public String downloadUrl(String myurl, String charset) throws IOException {
InputStream is = null;
try {
URL url = new URL(myurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(20000 /* milisegundos */);
conn.setConnectTimeout(45000 /* milisegundos */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Inicia la consulta
conn.connect();
int response = conn.getResponseCode();
if (response != 200) {
return "ERROR";
} else {
is = conn.getInputStream();
//Para descargar la página web completa
BufferedReader reader;
if (charset.equals("ISO-8859-1")) reader = new BufferedReader(new InputStreamReader (is, StandardCharsets.ISO_8859_1));
else reader = new BufferedReader (new InputStreamReader(is, StandardCharsets.UTF_8));
StringBuilder webPage = new StringBuilder();
String data;
while ((data = reader.readLine()) != null) {
webPage.append(data).append("\n");
}
return webPage.toString();
}
} finally {
if (is != null) {
is.close();
}
}
}
private void showTips() {
Log.d("TIPS_LOG", String.valueOf(tips.getData().size())); .....
}
No hay comentarios:
Publicar un comentario