Android Studio vs Omnis Studio
(articolo di Francisco Ramos dell’Università Pontificia di Salamanca, 15 dicembre 2017)
In questo articolo voglio confrontare che cosa significa realizzare una semplice applicazione per un dispositivo Android, con due diversi strumenti per lo sviluppo di “App”: Android Studio (utilizzabile solo per la piattaforma android e gratuito) e Omnis Studio (multi-piattaforma e a pagamento).
Vogliamo che l’applicazione sia in grado di creare un database SQLite sul dispositivo, con tre campi: ID, Nome e Cognome e quattro pulsanti per l’iterazione con l’utente: “Cerca”, “Inserisci”, “Aggiorna” e “Elimina” , aspetto e codice necessari sono mostrati di seguito.
Aspetto con Android Studio
Aspetto con Omnis Studio
Per aggiungere gli elementi dell’interfaccia in entrambi i casi è stato necessario solo trascinare e rilasciare i componenti dalle rispettive palette, ma al momento della rotazione del dispositivo, “Android Studio” ha rchiesto una programmazione aggiuntiva, mentre con “Omnis Studio” non è stato necessaria alcuna programmazione.
Successivamente indicheremo il codice che è stato necessario scrivere in ciascuno dei due casi, iniziando con la creazione del DB SQLite sul dispositivo:
Creazione del BBDD in Android Studio
public class Estructura_BBDD {
private Estructura_BBDD() {}
public static final String TABLE_NAME = “datosPersonales”;
public static final String NOMBRE_COLUMNA1 = “id”;
public static final String NOMBRE_COLUMNA2 = “nombre”;
public static final String NOMBRE_COLUMNA3 = “apellido”;
public static final String SQL_CREATE_ENTRIES =
“CREATE TABLE ” + Estructura_BBDD.TABLE_NAME + ” (” +
Estructura_BBDD.NOMBRE_COLUMNA1 + ” INTEGER PRIMARY KEY,” +
Estructura_BBDD.NOMBRE_COLUMNA2 + ” TEXT,” +
Estructura_BBDD.NOMBRE_COLUMNA3 + ” TEXT)”;
public static final String SQL_DELETE_ENTRIES =
“DROP TABLE IF EXISTS ” + Estructura_BBDD.TABLE_NAME;
}
Creazione del BBDD in Omnis Studio
Do $cinst.$sqlobject.$execute(‘CREATE TABLE Empleados (Id INTEGER UNIQUE, Nombre TEXT, Apellido TEXT)’)
Returns IDcreatetable
Una nota prima di continuare con la programmazione associata a ciascun pulsante, nel caso di “Andriod Studio” è stato necessario aggiungere altro codice per mettere i pulsanti in modalità “OnClickListener”, qualcosa di totalmente inutile in “Omnis Studio”. Vediamo il codice associato ad ogni pulsante:
Pulsante “Cerca” in Android Studio
botonBuscar.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
SQLiteDatabase db = helper.getReadableDatabase();
String
Estructura_BBDD.NOMBRE_COLUMNA2,
Estructura_BBDD.NOMBRE_COLUMNA3 };
String selection = Estructura_BBDD.NOMBRE_COLUMNA1 + ” = ?”;
String[] selectionArgs = { textoId.getText().toString() };
try {
Cursor c = db.query(
Estructura_BBDD.TABLE_NAME,
projection,
selection,
selectionArgs,
null,
null,
null
);
c.moveToFirst();
textoNombre.setText(c.getString(0));
textoApellido.setText(c.getString(1));
}catch (Exception e){
Toast.makeText(getApplicationContext(),“No se han encontrado registros.”, Toast.LENGTH_LONG).show();
}
}
});
Pulsante “Cerca” in Omnis Studio
On evClick
Do lRow.$define(i_ID;i_Nombre;i_Apellido)
Do lRow.$assigncols(i_ID;i_Nombre;i_Apellido)
Do $cinst.$sqlobject.$selectfetch(“Select * from Empleados where Id = @[i_ID]”;lRow;kFetchAll)
Returns IDselectfetch
Pulsante “Inserisci” in Android Studio
botonInsertar.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(Estructura_BBDD.NOMBRE_COLUMNA1, textoId.getText().toString());
values.put(Estructura_BBDD.NOMBRE_COLUMNA2, textoNombre.getText().toString());
values.put(Estructura_BBDD.NOMBRE_COLUMNA3, textoApellido.getText().toString());
long newRowId = db.insert(Estructura_BBDD.TABLE_NAME, null, values);
Toast.makeText(getApplicationContext(),“Insertado ID: ” + newRowId, Toast.LENGTH_LONG).show();
}
});
Pulsante “Inserisci” in Omnis Studio
On evClick
Do lRow.$define(i_ID;i_Nombre;i_Apellido)
Do lRow.$assigncols(i_ID;i_Nombre;i_Apellido)
Do $cinst.$sqlobject.$insert(“INSERT INTO Empleados (Id, Nombre, Apellido) VALUES (@[i_ID],@[i_Nombre],@[i_Apellido])”;lRow)
Returns IDinsert
Pulsante “Aggiorna” in Android Studio
botonActualizar.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(Estructura_BBDD.NOMBRE_COLUMNA2, textoNombre.getText().toString());
values.put(Estructura_BBDD.NOMBRE_COLUMNA3, textoApellido.getText().toString());
String selection = Estructura_BBDD.NOMBRE_COLUMNA1 + ” LIKE ?”;
String[] selectionArgs = { textoId.getText().toString() };
int count = db.update(
Estructura_BBDD.TABLE_NAME,
values,
selection,
selectionArgs);
Toast.makeText(getApplicationContext(),“Registro actualizado.”, Toast.LENGTH_LONG).show();
}
});
Pulsante “Aggiorna” in Omnis Studio
On evClick
Do lRow.$define(i_ID;i_Nombre;i_Apellido)
Do lRow.$assigncols(i_ID;i_Nombre;i_Apellido)
Do $cinst.$sqlobject.$update(“UPDATE Empleados SET Nombre=@[i_Nombre], Apellido=@[i_Apellido] where Id = @[i_ID]”;lRow;lRow)
Returns IDupdate
Pulsante “Elimina” in Android Studio
botonBorrar.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
SQLiteDatabase db = helper.getWritableDatabase();
String selection = Estructura_BBDD.NOMBRE_COLUMNA1 + ” LIKE ?”;
String[] selectionArgs = { textoId.getText().toString() };
db.delete(Estructura_BBDD.TABLE_NAME, selection, selectionArgs);
Toast.makeText(getApplicationContext(),“Registro borrado.”, Toast.LENGTH_LONG).show();
textoId.setText(“”);
textoNombre.setText(“”);
textoApellido.setText(“”);
}
});
Pulsante “Elimina” in Omnis Studio
On evClick
Do lRow.$define(i_ID;i_Nombre;i_Apellido)
Do lRow.$assigncols(i_ID;i_Nombre;i_Apellido)
Do $cinst.$sqlobject.$delete(“DELETE FROM Empleados WHERE Id = @[i_ID]”;lRow)
Returns IDdelete
Si noti che nel codice Android ho deliberatamente evitato di incorporare il codice necessario per gestire le eccezioni, tranne nel caso del pulsante “Cerca” in cui viene utilizzato un “try-catch”, per controllare il fatto che il record cercato potrebbe non essere trovato . Omnis definisce un metodo per trattare le eccezioni chiamate “$ sqldone”, mostriamo di seguito un esempio di utilizzo:
; Si esegue ogni volta che finisce una operazione SQL (asíncrona)
; Abbandona il método con il messaggio di errore, se si produce.
Do $cinst.$sqlobject.$getlasterrortext() Returns lErr
If lErr<>”OK”
Calculate i_ID as 0
Calculate i_Nombre as ”
Calculate i_Apellido as ”
Do $cinst.$showmessage(lErr;”Errore”)
Quit method
End If
; Si esegue uno o un’altro proceso secondo il risultato
Switch pID
Case IDselecttables
If pResult.$linecount=0
Do $cinst.$creaTabla() ;; Se non existe si crea la tabella
End If
Case IDselectfetch
Calculate lRows as pResult.$linecount
If lRows=0
Calculate i_ID as 0
Calculate i_Nombre as ”
Calculate i_Apellido as ”
Do $cinst.$showmessage(“No existe el ID”;”Risposta”)
Quit method
End If
Calculate i_Nombre as pResult.C2
Calculate i_Apellido as pResult.C3
Case IDcreatetable
Do $cinst.$showmessage(“Tabla creada”;” Risposta”)
Case IDinsert
Do $cinst.$showmessage(“Inserción realizada”;” Risposta”)
Case IDdelete
Calculate i_ID as 0
Calculate i_Nombre as ”
Calculate i_Apellido as ”
Do $cinst.$showmessage(“Entrada borrada”;” Risposta”)
Case IDupdate
Do $cinst.$showmessage(“Actualización realizada”;” Risposta”)
Default
Calculate i_ID as 0
Calculate i_Nombre as ”
Calculate i_Apellido as ”
Do $cinst.$showmessage(“Errore non aspettato”)
End Switch
A volte i programmatori e le aziende dedicate allo sviluppo e alla manutenzione del software ci chiedono perché pagare uno strumento, quando ce n’è un altro gratuito? Posso dire con sicurezza che spesso ciò che è “economico” risulta poi costoso. Omnis Studio consente lo sviluppo di applicazioni per dispositivi mobili (Android, iOS e Windows), applicazioni desktop (MacOS, Windows, Linux) o applicazioni Web, senza la necessità di utilizzare più strumenti oltre Omnis Studio stesso. L’esempio di efficacia che abbiamo esposto, confronta uno strumento che consente solo lo sviluppo per dispositivi Android, quindi il codice risultante non può essere eseguito in (per esempio) un dispositivo iOS, con il codice di Omnis che invece può essere senza alcuna dmodifica, su dispositivi iOS o Windows 10.
Giudicate voi stessi se in fquesto caso “economico” è costoso, ho lavorato con Omnis Studio per circa 20 anni, un periodo in cui le tecnologie hanno subito molti e diversi cambiamenti che hanno fatto apparire e scomparire linguaggi di programmazione e piattaforme, mentre Omnis Studio ha saputo adattarsi ai tempi con grande cura e lungimiranza.
La programmazione con Omnis Studio fa sì che mi piaccia il lavoro che faccio.