MySQL triggers #1

Om man vill att en kolumn ska uppdateras med en tidsstämpel för tidpunkten vid en UPDATE kan man göra ett av följande om en kolumn för tiddsstämpel redan finns:

1: Kör ALTER TABLE för att anpassa kolumnens DEFAULT-värde:

ALTER TABLE `[tabell]` CHANGE `[kolumn]` `[kolumn]` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP 

2: Skapa en TRIGGER för att hantera uppdateringen:

CREATE TRIGGER [namn_på_trigger] BEFORE UPDATE on `[tabell]` FOR EACH ROW SET NEW.[kolumn] = NOW();

Om man vill att en kolumn ska uppdateras med en tidsstämpel för tidpunkten vid en INSERT kan man göra ett av följande om en kolumn för tidsstämpel redan finns:

1: Använd samma metod som förra punktlistan, alternativ 1.

2: Skapa en TRIGGER för att hantera inläggen:

CREATE TRIGGER [namn_på_trigger] BEFORE INSERT ON `[tabell]` FOR EACH ROW SET NEW.[kolumn] = NOW();

AndroidManifest.xml-fel

Androidmanifestet är en nyckelspelare i det här med Androidutveckling eftersom den definierar upp vilka aktiviteter som ska finnas tillgängliga, vilka rättigheter till enheten applikationen ska ha och massvis med annat.
Får man fel här kan det hända att man kör applikationen och till synes inte får ut något användbart i loggen.
I det här fallet kan det dock dyka upp ett loggat fel likt

W/ResourceType(53): Resources don't contain package for resource number 0x7f0700e5

i en eller flera rader.
Det underliga och lite snikna här är att applikationen kompilerar, installeras och körs. Men det kan te sig lite olika resultat

  • Det loggade felet ovan
  • Det finns ingen launcher-ikon
  • Det loggas inget (som ser ut att vara sammankopplat med applikationen man kör)
  • Min aktivitet visas/körs aldrig

Svaren till alla dessa händelser är (tills någon säger annorlunda): Ditt Androidmanifest är fel! Så se nu till att kolla lite närmre på det och försäkra dig om att det som står där i faktiskt är något som Android förstår och kan köra.

Mini(gvim)upptäckt

Idag fick jag lära mig om

:hardcopy

(som rätt och slätt kan förkortas till)

:ha

Vill man inte råka ut för en tragiskt tråkig utskriftsdialog, så kan man rätt och slätt skriva

:ha!

och få ut sakerna på standardskrivaren.

Nu vill jaga bara veta hur man använder detta för att skriva ut en specifik fil utan att behöva öppna den.

Logga (System.out.print) allt!

Satt och försökte hjälpa en snubbe med ett problem rörande Spinners i Android. Tydligen kraschade appen han byggde varje gång man tryckte på Spinnern och valen skulle visas. Enligt stacktracen var det ett NullPointerException, men det som gjorde det hela svårare var att Spinnern faktiskt innehöll minst ett val.

Efter ungefär en trkvarts, timmes felsökande visar det sig att det körs två loopar, baserat på databasresultat. Varje iteration i första loopen lägger in ett val i listan, varje iteration i andra loopen drar ifrån ett antal val i listan. I detta fallet visade det sig att första loopen gjordes med en check

for(int i = 1; i <= list.getsize(); i++) { //Lägg till val }

Den andra loopen använde sig av

for(int i = 0; i < list2.getsize(); i++) { //Dra ifrån val }

Det intressanta i de här looparna är att den första lägger till hela listans resultat + 1. Detta innebar att det hamnat ett null-objekt i listan, som loop två inte kunde ta bort.
Det enda som skvallrade om något kring detta var att skriva ut loggar över vad som inträffade. Det hade tagit ungefär 15 minuter att lösa detta, om man hade börjat direkt med att logga vad som skedde. Så, till alla er som sitter där ute och tror/litar på att ni vet vad er kod gör, _utan_ att se loggarna: Tänk om. Ni har ingen aning.

EditText med allt annat än strängar

Det här förbryllade mig ett tag. Jag försökte sätta ett värde i en EditText och fick glada skutt från logcat:en

E/AndroidRuntime( 3712): java.lang.RuntimeException: Unable to start activity ComponentInfo{se.sigtuna.android.uvbaisk/se.sigtuna.android.uvbaisk.UvbaiskQuestions1Activity}: android.content.res.Resources$NotFoundException: String resource ID #0x0
E/AndroidRuntime( 3712): Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x0

Det tog mig ca tjugo minuter att till slut prova

editText.setText(String.valueOf(myObject.intId))

istället för

editText.setText(myObject.intId)

Så, kids. Se till att bara, bara, BARA skicka in strängar till en EditText, oavsett om logcat vill säga att den saknar en resurs, likt det som kan hänta om man anger tex en widget som tillhör en annan aktivitet än den som syns just nu……

Positioneringsbedrövelse med ZoomButtonsController

Jag har suttit och försökt få ordning på det här till och från i flera dagar, men det tycks inte finnas någon annan lösning än:

Om du vill placera knapparna till en ZoomButtonsController någon annanstans än centrerad i botten på skärmen: Glöm det!

Jag använder mig av ZoomButtonsControllern i en klass som extendar en ImageView och med Internets hjälp har jag konstaterat att det till dags dator inte är möjligt att placera om knapparna.

Det tråkiga i den här kråksången är att ZoomButtonsControllern är en i övrigt bra klass som bland annat implementerar godbitar som fade in/ut när de visas. Det alternativ man har att använda sig av istället är klassen ZoomControls, som är en enklare form av ZoomButtonsController, men i en layout-mässigt bättre widget.

Men för all del, ni får gärna öppna mina ögon för att komma åt möjligheten att påverka placeringen. Det hade jag högljutt tackat för!

Androidemulatorn startar inte på grund av sökvägsproblem

Androids AVD-hanterare kan ibland ställa till lite trubbel, beroende på om man valt att installera saker och ting på nytt, om man använder Windows XP/7/Linux/[Något annat]. Min miljö är Windows 7 x64 och jag får ibland upp detta fel

PANIC: Could not open: C:\Users\drlaban\.android/avd/Android2.1.ini

Den som är lite uppmärksam ser att det kan vara lite härligt blandat mellan Windows/Linux-slasharna, men en sak som inte är alltför tydlig är det faktum att jag i min Windows-miljö flyttat alla “Mina *”-mappar till en annan disk. Detta hanteras inte så himla bra av AVD och ställer alltså till det när man skapar emulator-avbildningar.

Så, vad göra? Det hela är mycket enkelt:

  • Skapa en miljövariabel som heter ANDROID_SDK_HOME som pekar ut sökvägen till den disk/mapp som innehåller mappen “.android”
  • Starta om AVD-managern, skapa om avbildningarna och kör på som det var tänkt från början.

Min bild i Meddelande-appen i Android

Googles appar kan lämna en del att önska ibland och en sån sak är till exempel den lilla bilden som ska synas i Meddelande-appen när man skickar SMS eller MMS till folk.
Alltsomoftast visas en grå ruta istället för din egen bild på utgående meddelanden, medan inkommande meddelanden (oftast) inte har några problem alls med att visa en bild på personen om det finns någon.
Jag vet inte hur det är i IceCreamSandwich, men anledningen till att det blir så i Gingerbread beror (säkert bland annat) på att Android inte vet vilket nummer du har. Och Android bygger det på ditt nummer som du har på SIM-kortet, av alla ställen. Du kan kolla om du har ett telefonnummer satt genom att gå via Home -> Meny-knappen -> Settings -> About phone -> Status och kika under My phone number. Står det inget eller Unknown där så måste man fixa det.

Så, för att fixa det:

1: Ta fram/Låna en gammal/annan telefon där man kan redigera något som kallas Mitt nummer (undvik Android-telefoner för detta)
2: Sätt in SIM-kortet i den gamla telefonen och starta den
3: Beroende på hur telefonen fungerar kan man lägga in Mitt nummer i någon del av telefonen, ta dig dit
4: Lägg in ditt nummer och spara
5: Sätt tillbaks SIM-kortet i din Android-telefon
6: Kolla så att det nu står ett nummer i Status enligt ovan
7: Om det fortfarande saknas en bild på dig, lägg till dig själv i Kontakt-listan med exakt samma nummer som du gjort i steg 4
(8: Om det fortfarande saknas en bild på dig, kontrollera att du verkligen har en bild på ditt Google-konto och försök att skicka ett nytt meddelande och kolla igen.)