webForumDet fria alternativet

Spara array i databas

Java

10 svar · 380 visningar · startad av AG

Medlem sedan mars 20001 266 inlägg
Frågan#1

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

Medlem sedan nov. 20022 355 inlägg
#2

Du kan inte bara köra en loop på arrayen? Kanske inte den bästa lösningen heller!!

Medlem sedan juni 20008 205 inlägg
#3

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.

Medlem sedan mars 20001 266 inlägg
#4

Ä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

Medlem sedan juni 20008 205 inlägg
#5

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);
Medlem sedan mars 20001 266 inlägg
#6

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

Medlem sedan juni 20008 205 inlägg
#7

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().

Medlem sedan mars 20001 266 inlägg
#8

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

Medlem sedan juni 20008 205 inlägg
#9

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.

Medlem sedan mars 20001 266 inlägg
#10

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

Medlem sedan mars 20001 266 inlägg
#11

Mitt fel, missade en sak i databasen, nu fungerar det. Tack spango för hjälpen.

Andreas

255 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)