Het Android-platform biedt een breed scala aan opslagopties voor gebruik binnen uw apps. In deze tutorialserie gaan we een aantal van de gegevensopslagfaciliteiten van de Android SDK verkennen door een eenvoudig project te bouwen: een ASCII-kunsteditor.
Dit is het laatste deel in een tutorialserie over het maken van een ASCII-editor-app voor Android. In de eerste drie delen hebben we de gebruikersinterface gemaakt, ASCII-afbeeldingen voor gebruikers van de toepassing geïmplementeerd als afbeeldingsbestanden en een database opgezet om opgeslagen afbeeldingen op te slaan. Hiermee konden gebruikers kiezen uit de lijst met opgeslagen foto's om weer in te laden voor weergave, exporteren en bewerken. In deze zelfstudie helpen we u bij het opslaan van foto's in de database, het verwijderen van eerder opgeslagen foto's en het starten van nieuwe foto's.
Deze zelfstudiereeks over het maken van een eenvoudige ASCII Art Editor bestaat uit vier delen:
We zullen deze keer volledig in de hoofdactiviteitsklasse van de applicatie werken. Voeg de volgende invoer toe aan de bovenkant van de klas:
importeer java.text.SimpleDateFormat; importeer java.util.Calendar; import android.app.AlertDialog; import android.content.ContentValues; import android.content.DialogInterface;
Wij zullen klikken op de opslaan, verwijderen, en nieuwe toetsen. In jouw hoofd onCreate methode, stel de klasse in om klikken te verwerken:
Knop saveASCIIBtn = (Button) findViewById (R.id.save_btn); saveASCIIBtn.setOnClickListener (deze); Knop newBtn = (Button) findViewById (R.id.new_btn); newBtn.setOnClickListener (deze); Knop deleteBtn = (Button) findViewById (R.id.delete_btn); deleteBtn.setOnClickListener (deze);
We hebben deze knoppen toegevoegd aan de lay-outbestanden eerder in de serie. In de bij klikken methode, voeg na de bestaande code uw keten van voorwaardelijke blokken toe voor deze extra drie knoppen:
// gebruiker heeft op de nieuwe knop else geklikt als (v.getId () == R.id.new_btn) // gebruiker op save-knop else if (v.getId () == R.id.save_btn) heeft geklikt // gebruiker heeft op delete button else if (v.getId () == R.id.delete_btn) geklikt
We zullen code toevoegen aan elk van deze blokken om de functionaliteit te implementeren.
Laten we beginnen met de gemakkelijkste functie, gebruikers die op nieuwe knop. In het voorwaardelijke blok in bij klikken voor de nieuwe knop, stel het tekstveld opnieuw in op een lege tekenreeks die gereed is voor gebruikersinvoer:
textArea.setText ( "");
Vergeet niet dat we een variabele hebben gebruikt om de ID van de momenteel weergegeven afbeelding bij te houden als deze uit de database is geladen - stel deze ook opnieuw in:
currentPic = -1;
Laten we naar het voorwaardelijke blok gaan bij klikken voor de opslaan knop. Wanneer de gebruiker op de opslaan knop, er zijn twee mogelijkheden. Of ze slaan een nieuwe afbeelding op die nog niet in de database is opgeslagen of ze slaan een afbeelding op uit de database en worden vervolgens bewerkt. Als de gebruiker een afbeelding uit de database opslaat, in plaats van een nieuw item in de database op te slaan, zullen we het bestaande record bijwerken.
Krijg eerst de inhoud van de tekst Bewerken:
String ingevoerdTxt = textArea.getText (). ToString ();
Om de gegevens te modelleren die we aan de database willen toewijzen, hetzij als invoegsel voor een nieuwe afbeelding, hetzij als update voor een bestaande, maken we een object Inhoudswaarden:
ContentValues picValues = nieuwe ContentValues ();
De nieuwe gegevens bevatten de tekst uit het tekstveld, dus voeg deze toe aan het object Inhoudswaarden met behulp van de tabelkolomnaam die we de laatste keer hebben gedefinieerd, opgeslagen als een openbare variabele in de helperklasse van de database:
picValues.put (ImageDataHelper.ASCII_COL, ingevoerdText);
We gaan een string gebruiken inclusief de huidige datum en tijd voor de naam van de afbeelding, dus bouw die volgende:
Date theDate = Calendar.getInstance (). GetTime (); SimpleDateFormat dateFormat = nieuwe SimpleDateFormat ("yyyy-MM-dd_hh.mm.ss"); String fileName = dateFormat.format (theDate);
Dit is wat de gebruiker ziet in de lijst met opgeslagen afbeeldingen. Voeg het toe aan de inhoudswaarden met dezelfde techniek:
picValues.put (ImageDataHelper.CREATED_COL, bestandsnaam);
Krijg een verwijzing naar de database:
SQLiteDatabase savedPicsDB = imgData.getWritableDatabase ();
Nu moeten we afstemmen wat er gebeurt met de vraag of de huidige foto nieuw is of niet. Voeg een voorwaardelijke verklaring toe:
if (currentPic<0) else
De variabele zal kleiner zijn dan nul als de huidige afbeelding nog niet in de database staat (als we deze instellen op -1). Als de momenteel weergegeven afbeelding uit de database is geladen, zal deze variabele de ID van de afbeelding in de database bevatten, in welk geval de anders zal uitvoeren. Binnen in de als blokkeren, zullen we de afbeelding opslaan als een nieuw databaserecord:
long insertNum = savedPicsDB.insert ("pics", null, picValues);
Dit is een invoeginstructie omdat het een nieuw record is. We geven de tabelnaam en de inhoudswaarden door die we hebben gemaakt. De middelste parameter is voor een kolomnaam, maar we hebben deze niet nodig. We halen het resultaat van de invoeging op als een lange waarde, de ID van de nieuw ingevoegde record. Werk de variabele bij zodat eventuele nieuwe bewerkingen naar dezelfde databaserecord worden geschreven:
currentPic = (int) insertNum;
Voer nu een bevestigingsbericht uit naar de gebruiker, op voorwaarde dat de invoeging een succes was:
if (insertNum> = 0) Toast.makeText (getApplicationContext (), "Afbeelding opgeslagen in database!", Toast.LENGTH_SHORT) .show ();
Laten we nu kijken naar de anders, voor het bijwerken van een afbeelding die al in de database is opgeslagen:
int savedNum = savedPicsDB.update ("pics", picValues, ImageDataHelper.ID_COL + "=?", new String [] "" + currentPic);
Deze keer gebruiken we een bijwerken statement, doorgeven van de tabelnaam, inhoudswaarden en waar details. De waar een deel van de instructie geeft de ID-kolom en de overeenkomende waarde weer, waarbij de huidige ID van de foto wordt opgegeven, zodat de juiste record wordt bijgewerkt. De methode verwacht een stringarray voor de laatste parameter, zelfs als er maar één waarde is zoals in dit geval. Bevestig de update voor de gebruiker:
if (savedNum> 0) Toast.makeText (getApplicationContext (), "Afbeelding opgeslagen in database!", Toast.LENGTH_SHORT) .show ();
We werken de naam van de afbeelding bij evenals de inhoud, maar u kunt ervoor kiezen om de naam te laten als een weergave van wanneer de foto oorspronkelijk is gemaakt als u dat liever hebt. Na de anders, sluit de verbindingen:
savedPicsDB.close (); imgData.close ();
Laten we nu het verwijderen van de huidige foto implementeren. Als de huidige afbeelding uit de database is geladen, verwijderen we de record. Anders leegt u gewoon het tekstveld. In het voorwaardelijke gedeelte van de bij klikken methode voor de delete-knop, voeg als volgt een test toe:
if (currentPic> = 0) // afbeelding is geladen vanuit de database - vraag gebruiker om te bevestigen else // afbeelding is niet geladen vanuit database
In de als sectie die we zullen verwijderen uit de database. Laat de gebruiker eerst bevestigen met behulp van een waarschuwingsvenster:
AlertDialog.Builder confirmBuilder = new AlertDialog.Builder (this);
Stel het dialoogvensterbericht en de annuleerbare status in:
confirmBuilder.setMessage ("Verwijder de opgeslagen afbeelding?"); confirmBuilder.setCancelable (false);
Nu moeten we specificeren wat er moet gebeuren wanneer de gebruiker ervoor kiest om door te gaan met de verwijdering, door de positieve knop te definiëren:
confirmBuilder.setPositiveButton ("Yes", new DialogInterface.OnClickListener () public void onClick (DialogInterface dialog, int id) );
Hier definiëren we een nieuwe kliklistener samen met de bijbehorende bij klikken methode. Binnen in de bij klikken methode, we kunnen de opgeslagen foto verwijderen - krijg een verbinding met de database:
SQLiteDatabase savedPicsDB = imgData.getWritableDatabase ();
Voer nu de verwijdering uit:
int deleteResult = savedPicsDB.delete ("pics", ImageDataHelper.ID_COL + "=?", nieuwe tekenreeks [] "" + currentPic);
We specificeren de tabelnaam, de ID-kolom en de waarde die erin past, zodat we de juiste record verwijderen. Als de verwijdering succesvol was, bevestig dan aan de gebruiker:
if (deleteResult> 0) Toast.makeText (getApplicationContext (), "Picture deleted", Toast.LENGTH_SHORT) .show ();
Nog steeds in de dialoog interface klik luisteraar bij klikken methode, reset de afbeelding-ID-variabele, leeg het tekstveld en sluit de databaseverbindingen:
currentPic = -1; textArea.setText ( ""); savedPicsDB.close (); imgData.close ();
Plaats nu na het blok waarin je de positieve knop hebt ingesteld de negatieve knop:
confirmBuilder.setNegativeButton ("Nee", nieuwe DialogInterface.OnClickListener () openbare ongeldige onClick (dialoog DialogInterface, int id) dialog.cancel (););
In dit geval annuleren we eenvoudig het dialoogvenster. Nu kunnen we doorgaan en het laten zien:
AlertDialog alert = confirmBuilder.create (); alert.show ();
Nu om het verwijderingsgedeelte van de activiteit te voltooien bij klikken methode, ga naar uw anders verklaring voor wanneer de huidige afbeelding niet uit de database is geladen. In dit geval zullen we eenvoudig de tekst Bewerken legen:
textArea.setText ( "");
We hebben onze databaseverbindingen gesloten in elk blok dat we hebben gebruikt om records te zoeken, in te voegen, te verwijderen of bij te werken. In het geval dat de gebruiker de app verlaat terwijl een verbinding open is, moeten we ervoor zorgen dat alle verbindingen zijn gesloten. Voeg de toe onDestroy methode voor uw activiteit:
@Override public void onDestroy ()
Sluit hierin de database-helper en bel vervolgens de superklasmethode:
imgData.close (); super.onDestroy ();
Nu kunt u uw app testen! Controleer of het correct nieuwe foto's bewaart, bestaande foto's bijwerkt en afbeeldingen op verzoek van de gebruiker verwijdert door er een paar op te slaan en er vervolgens mee te experimenteren.
De eenvoudige app-editor voor ASCII is nu voltooid. Wanneer u de app uitvoert, moet u in staat zijn teksttekens in te voeren, afbeeldingen op te slaan, ze als afbeeldingsbestanden te exporteren, eerder opgeslagen afbeeldingen te laden, bewerken en verwijderen en de weergavekleuren te configureren. De download van de broncode bevat alle Java- en XML-bestanden waaraan we tijdens de serie hebben gewerkt.
Er zijn veel manieren waarop u deze app kunt verbeteren als u deze verder wilt verkennen. U zou bijvoorbeeld de vormgeving van de gebruikersinterface kunnen verbeteren. U kunt controleren of de gebruiker een opgeslagen foto wil overschrijven voordat een bestaande databaserecord wordt bijgewerkt, waardoor deze de optie heeft om een nieuwe afbeelding op te slaan. Een bijzonder productieve verbetering zou zijn om de code uit te breiden naar inhoudaanbieders en / of fragmenten om gegevens effectief te laden en tablets te targeten. U kunt ook het proces voor het opslaan van foto's verbeteren, bijvoorbeeld door de gebruiker toe te staan een naam te kiezen voor elke foto die ze opslaan.
.