AGMedlem sedan mars 20001 229 inlägg
Har ett problem rörande att spara en array till en databas av typen MysQL.
MySQL stödjer ej 'setArray' därför måste jag göra om arrayen på något sätt.
Någon med erfarenhet av php pratade om att man kunde använda serizalize.
Dock har jag inte en aning om detta är en bra lösning, eller hur en sådan kodsnutt skulle se ut. Någon idé?
tack
Andreas
Mc FettoMedlem sedan nov. 20021 920 inlägg
Du kan inte bara köra en loop på arrayen? Kanske inte den bästa lösningen heller!!
spangoMedlem sedan juni 20006 147 inlägg
Tja, du kan ju lagra den som en BLOB/CLOB i databasen, men jag avråder. Det vore en snyggare lösning att i stället göra en till tabell där du sparade varje element för sig i en post, du kan du även söka i den tabellen utan problem. Om du ska serialisera använder du Object{In,Out}putStream.
AGMedlem sedan mars 20001 229 inlägg
Är en inputlog som skall sparas.
Hittade följande:
http://javaalmanac.com/egs/java.io/SerializeObj.html
Men har svårt att sätta in det.
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("filename.ser"));
out.writeObject(minArray);
out.close();
Vad är detta, 'filename.ser'?
Skall jag sen köra en 'setObject' på 'out'?
tack
Andreas
spangoMedlem sedan juni 20006 147 inlägg
Du får koppla det till något annat än en fil, lämpligen en PipedInputStream. Nåt sånt här (helt otestat och förmodligen felaktigt):
PipedInputStream in = new PipedInputStream();
ObjectOutputStream out = new ObjectOutputStream(new PipedOutputStream(in));
out.writeObject(arr);
out.close();
PreparedStatement ps = conn.prepareStatement("INSERT INTO tabell (arrayKolumn) VALUES (?)");
ps.setBinaryStream(1, in);
AGMedlem sedan mars 20001 229 inlägg
spango din kod fungerade nästan. Problemet är att jag behöver längden i bytes:
String[] arr = {"test", "hest", "chess"};
try{
PipedInputStream in = new PipedInputStream();
ObjectOutputStream outS = new ObjectOutputStream(new PipedOutputStream(in));
outS.writeObject(arr);
PreparedStatement ps = Conn.prepareStatement("INSERT INTO table2 (FieldName) VALUES (?)");
ps.setBinaryStream(1, in, VÄRDE_HÄR);
ps.executeUpdate();
outS.close();
out.println("Klart");
System.out.println("Klart");
}
catch(Exception exp){
out.println(exp);
System.out.println(exp);
}
tack
Andreas
spangoMedlem sedan juni 20006 147 inlägg
Hm, då blir det nog enklare att koppla objektströmmen till en ByteArrayOutputStream som man sedan gör toByteArray() på för att sedan använda PreparedStatement.setBytes().
AGMedlem sedan mars 20001 229 inlägg
Tack spango, nu börjar det likna något:
String[] arr = {"test", "hest", "chess"};
try{
PipedInputStream in = new PipedInputStream();
ObjectOutputStream outS = new ObjectOutputStream(new PipedOutputStream(in));
// Serialize to a byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
outS = new ObjectOutputStream(bos) ;
outS.writeObject(arr);
outS.close();
// Get the bytes of the serialized object
byte[] buf = bos.toByteArray();
PreparedStatement ps = Conn.prepareStatement("INSERT INTO table2 (FieldName) VALUES (?)");
ps.setBytes(1, buf);
ps.executeUpdate();
out.println("Klart");
System.out.println("Klart");
}
catch(Exception exp){
out.println(exp);
}
Jag kan sedan plocka ut fältet med "rs.getBytes("FieldName")", nu är frågan bara om det är lika "enkelt" att göra åt andra hållet?
Andreas
spangoMedlem sedan juni 20006 147 inlägg
I stället för att plocka fram bytesen med getBytes, använd getBinaryStream som du sedan kopplar en ObjectInputStream till, sedan är (borde) det bara vara att anropa readObject och vips, har du din array igen.
AGMedlem sedan mars 20001 229 inlägg
Såhär kan man tycka, med undantag att det ej fungerar när jag försöker :)
Object[] nyarr = null;
try{
ObjectInputStream inS = new ObjectInputStream(rs.getBinaryStream("FieldName"));
nyarr = (Object[]) inS.readObject();
inS.close();
}
catch(Exception exp) {
out.println(exp);
}
Får felet 'java.io.EOFException'
tack
Andreas
AGMedlem sedan mars 20001 229 inlägg
Mitt fel, missade en sak i databasen, nu fungerar det. Tack spango för hjälpen.
Andreas