webForumDet fria alternativet

Spara array i databas

10 svar · 378 visningar · startad av AG

AGMedlem sedan mars 20001 229 inlägg
#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

Mc FettoMedlem sedan nov. 20021 920 inlägg
#2

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
#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.

AGMedlem sedan mars 20001 229 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

spangoMedlem sedan juni 20006 147 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);
AGMedlem sedan mars 20001 229 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

spangoMedlem sedan juni 20006 147 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().

AGMedlem sedan mars 20001 229 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

spangoMedlem sedan juni 20006 147 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.

AGMedlem sedan mars 20001 229 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

AGMedlem sedan mars 20001 229 inlägg
#11

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

Andreas

Genererad på 371 ms · cache AV · v20260730165559-full.f96bc7eb