ElvisMedlem sedan maj 200547 inlägg
Försöker knåpa lite med databashantering för i mobiltelefoner med J2ME, och har ett problem som jag inte förstår.
Har kikat på en exempelsida med kodexempel (http://www.java2s.com/ExampleCode/J2ME/Database-Persistence.htm) och på sidan med tillhörande javaklasser (http://www.wmlscript.it/j2me/api20/).
Det jag försöker skapa är en funktion som läser igenom datat i en databas. Varje post som består av en enda sträng (mer avancerad än så är inte databashanteringen i J2ME), och strängarna ska lagras i en array som sedan retuneras, så att jag kan lägga in värdena i en listmeny.
Koden nedan fungerar i och för sig bra att bygga vidare på, så länge ingen post raderas. För då kan man inte längre ha någon räknare från 1, 2, 3..., eftersom visa ID:n då kommer att saknas.
Har hittat metoderna getRecord(int recordId) och getNextRecordID() att arbeta med, men får det inte att fungera.
För att getRecord(int recordId) ska fungera för att läsa igenom databasen, måste man veta id för respektive post. Detta fungerar i kombination med getNextRecordID() där man kan hämta id för nästkommande post. Men hur får jag fram id för den första posten i databasen, eftersom det är där jag måste starta min genomsökning av databasen? Det id:et behöver ju nödvändigtvis inte ha värdet 1.
Vet liksom inte hur jag ska komma vidare, eller så har jag kanske missat något som jag borde förstå?
public void readRecords()
{
try
{
byte[] recData = new byte[5];
int len;
for (int i = 1; i <= rs.getNumRecords(); i++)
{
if (rs.getRecordSize(i) > recData.length)
recData = new byte[rs.getRecordSize(i)];
len = rs.getRecord(i, recData, 0);
System.out.println("Record #" + i + ": " + new String(recData, 0, len));
System.out.println("------------------------------");
}
}
catch (Exception e)
{
db(e.toString());
}
}
phonkworksMedlem sedan juli 2001228 inlägg
Hej!
Borde det inte vara så att när du anropar;
getNextRecordID()
första gången så får du första id't?
Precis som med;
rs.next()
i J2SE så stegar man fram till första raden vid första anropet.
mvh
phonk
ElvisMedlem sedan maj 200547 inlägg
Har kikat vidare på detta, men får ingen ordning på det.
Din lösning fungerar nog, om man är in intresserad av id:et i sig. Utgår man däremot från innehållet i en post, att man exempelvis söker igenom databasen efter en post som man vet innehåller ordet "WebForum". När man väl hittat posten genom sökning, vill man utöver innehållet i posten även sända med det unika id:et för posten, så blir det problem. Använder jag getNextRecordID() så får jag id:et för nästa post, och inte den post som jag fått fram genom sökning.
Kikar man exempelvis på detta kodexempel, så kan man se att det går att hantera innehållet i posten, men att det blir svårigheter om man även vill skriva ut postens unika ID. (http://www.corej2me.com/DeveloperResources/sourcecode/rms/sorting/index.shtml)
Jag skulle vilja ha möjlighet att leta igenom alla poster på ett bra och smidigt sättt, och sedan retunera den funna posten med både innehåll och unikt ID.
Tycker nog för övrigt, utifrån den begränsade kunskap som jag har, att databashanteringen i J2ME är väldigt eftersatt och faktisk ganska så dålig. Hade nog färväntat mig lite mer av möjligheter när det gäller databashanteringen i J2ME.
public void readRMS()
{
try
{
if (rs.getNumRecords() > 0)
{
SortCompare comp = new SortCompare();
RecordEnumeration re = rs.enumerateRecords(null, comp, false);
while (re.hasNextElement())
{
String str = new String(re.nextRecord());
System.out.println(str);
System.out.println("-------");
}
}
}
catch (Exception e)
{
db(e.toString());
}
}
phonkworksMedlem sedan juli 2001228 inlägg
Ett fulhack vore iofs att göra så här:
public void readRMS()
{
try
{
if (rs.getNumRecords() > 0)
{
SortCompare comp = new SortCompare();
RecordEnumeration re = rs.enumerateRecords(null, comp, false);
while (re.hasNextElement())
{
String str = new String(re.nextRecord());
// Här har re stegat fram till nästa record
// så id't för det record som ligger i str nu borde man få så här:
int id = re.previousRecordId();
System.out.println("REC:"+str+" ID:"+id);
System.out.println("-------");
}
}
}
catch (Exception e)
{
db(e.toString());
}
}
Vet inte riktigt vad effekten blir i Enumerationen av att anropa previousRecordId(). Det är lite luddigt beskrivet i API't. Kan inte testa här heller.
mvh
phonk
ElvisMedlem sedan maj 200547 inlägg
phonkworks skrev:
Ett fulhack vore iofs att göra så här...
Vet inte riktigt vad effekten blir i Enumerationen av att anropa previousRecordId()...
Var inne på den tankegången jag med, att man liksom skulle hoppa fram och tillbaka i recordsetet.
Men jag har kikat lite på detta, och det är nog helt enkelt så att det är lite begränsat med databashanteringen i J2ME, så fulhack bör nog i vissa fall anses tillåtna.(?)
Fast nu när mobiltelefonerna blir allt mer kraftfulla, så får man hoppas att det även kommer en uppdateringen av möjligheterna för att utveckla för mobilerna.
LimeMedlem sedan sep. 2001837 inlägg
Elvis skrev:
Tycker nog för övrigt, utifrån den begränsade kunskap som jag har, att databashanteringen i J2ME är väldigt eftersatt och faktisk ganska så dålig. Hade nog färväntat mig lite mer av möjligheter när det gäller databashanteringen i J2ME.
Problemet med databashanteringen i J2ME är att den måste vara generisk. Javamaskinen har väldigt svårt att veta vad för slags databas som telefonen använder och då är det svårt att använda de inbyggda systemen.
Om du är missnöjd med den stöd som finns i J2ME så kan du alltid bundla en annan db, t.ex. Pollyhedra, derby-me (undrar om den är officiell förresten) eller någon av de andra microdatabaserna.