Hallo zusammen,
ich habe folgendes Problem: Ich will eine feste Anzahl von Zeilen in einer SQLite DB ändern. Die Anzahl wird zufällig, anhand eines Prozentsatzes ausgewählt. Ich habe das Ganze soweit, dass alles funktioniert, außer dass die Anzahl an geschriebenen Werten in der Datenbank zu hoch ist. Hier zuerst der Code, danach gebe ich euch ein Beispiel.
"vonBis" ist dabei ein String, der mitgegeben wird, zum Beispiel: "66 AND 70".
"wahrM" bzw. "wahrW" ist die Wahrscheinlichkeit, mit der die einzelnen Zeilen auf 3 gesetzt werden sollen, bei der Altersklasse zwischen 66 und 70 sind das für Männer 5%, für Frauen 20%.
"count" gibt die Anzahl von Reihen mit bestimmten Eigenschaften als int zurück (s.u.).
"blankUpdate" updated die DB (s.u.).
Hier die "count" Methode:
Und hier die "blankUpdate" Methode:
Als Beispiel:
Anzahl von männlichen Personen zwischen 66 und 70: 2105
Prozent, die davon geschrieben werden sollen: 5%
CountM nach der for-Schleife: 130
Nach ausführen des Codes liefert nachfolgende SELECT-Abfrage in der DB 935 Zeilen zurück.
Weiß jemand, woran die Differenz liegen könnte? Ist was an meinen DB-Anfragen falsch? Ich finde meinen Fehler einfach nicht..
ich habe folgendes Problem: Ich will eine feste Anzahl von Zeilen in einer SQLite DB ändern. Die Anzahl wird zufällig, anhand eines Prozentsatzes ausgewählt. Ich habe das Ganze soweit, dass alles funktioniert, außer dass die Anzahl an geschriebenen Werten in der Datenbank zu hoch ist. Hier zuerst der Code, danach gebe ich euch ein Beispiel.
"vonBis" ist dabei ein String, der mitgegeben wird, zum Beispiel: "66 AND 70".
"wahrM" bzw. "wahrW" ist die Wahrscheinlichkeit, mit der die einzelnen Zeilen auf 3 gesetzt werden sollen, bei der Altersklasse zwischen 66 und 70 sind das für Männer 5%, für Frauen 20%.
"count" gibt die Anzahl von Reihen mit bestimmten Eigenschaften als int zurück (s.u.).
"blankUpdate" updated die DB (s.u.).
Java:
public static void verwitwetStmt(String vonBis, int wahrM, int wahrW) {
String select;
String preparedStmt;
Random r = new Random();
int rnd;
int countW = 0;
int countM = 0;
// Zählen aller Männer in einem bestimmten Alter.
int anzahl = DBUpdater.count("Jahre", "Jahre BETWEEN " + vonBis + " AND Geschlecht IS 0");
// Verteilen des "verwitwet" Zustand gemäß der Wahrscheinlichkeit in der jeweiligen Altersgruppe.
for (int i = 0; i < anzahl; i++) {
rnd = r.nextInt(100);
if (rnd <= wahrM)
countM++;
}
System.out.println(anzahl + ", " +countM);
// Statement für die Veränderung in der DB
select = "SELECT ID FROM individuen WHERE Jahre BETWEEN " + vonBis + " AND Familienstand IS NULL "
+ "AND Geschlecht IS 0 ORDER BY RANDOM() LIMIT " + Integer.toString(countM) + ";";
preparedStmt = "UPDATE individuen SET Familienstand = ? WHERE ID = ?";
DBUpdater.blankUpdate(select, preparedStmt, 3);
anzahl = DBUpdater.count("Jahre", "Jahre BETWEEN " + vonBis + " AND Geschlecht IS 1");
for (int i = 0; i < anzahl; i++) {
rnd = r.nextInt(100);
if (rnd <= wahrW)
countW++;
}
System.out.println(wahrW);
select = "SELECT ID FROM individuen WHERE Jahre BETWEEN " + vonBis + " AND Familienstand IS NULL "
+ "AND Geschlecht IS 1 ORDER BY RANDOM() LIMIT " + Integer.toString(countW) + ";";
preparedStmt = "UPDATE individuen SET Familienstand = ? WHERE ID = ?";
DBUpdater.blankUpdate(select, preparedStmt, 3);
}
Hier die "count" Methode:
Java:
ublic static int count(String spalte, String whereStmt) {
DBController dbc = DBController.getInstance();
dbc.initDBConnection();
int anzahl = 0;
try {
Statement stmt = DBController.connection.createStatement();
String select = "SELECT COUNT(" + spalte + ") FROM individuen WHERE " + whereStmt + ";";
ResultSet rs = stmt.executeQuery(select);
select = rs.getString(1);
anzahl = Integer.parseInt(select);
rs.close();
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
return anzahl;
}
Und hier die "blankUpdate" Methode:
Java:
public static void blankUpdate(String selectQuery, String preparedStatement, int wert) {
DBController dbc = DBController.getInstance();
dbc.initDBConnection();
try {
Statement stmt = DBController.connection.createStatement();
ResultSet rs = stmt.executeQuery(selectQuery);
PreparedStatement ps = DBController.connection.prepareStatement(preparedStatement);
while (rs.next()) {
ps.setInt(1, wert);
ps.setInt(2, rs.getInt(1));
ps.addBatch();
}
DBController.connection.setAutoCommit(false);
ps.executeBatch();
DBController.connection.setAutoCommit(true);
ps.close();
stmt.close();
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
Als Beispiel:
Anzahl von männlichen Personen zwischen 66 und 70: 2105
Prozent, die davon geschrieben werden sollen: 5%
CountM nach der for-Schleife: 130
Nach ausführen des Codes liefert nachfolgende SELECT-Abfrage in der DB 935 Zeilen zurück.
Code:
SELECT Familienstand FROM individuen WHERE Familienstand IS 3 AND Geschlecht is 0 and Jahre between 66 and 70
Weiß jemand, woran die Differenz liegen könnte? Ist was an meinen DB-Anfragen falsch? Ich finde meinen Fehler einfach nicht..
Zuletzt bearbeitet: