SQL - Insert um einen Eintrag jeweils verzögert

  • Antworten:2
  • Bentwortet
elochai
  • Forum-Beiträge: 6

03.05.2015, 19:57:59 via Website

Hi zusammen,

ich habe mir folgende Testapp für eine DB-Verbindung geschrieben. Mein Problem ist jedoch, dass die Anzahl der Einträge in der Datenbank laut Ausgabe/Log immer um einen Eintrag vermindert ist, als diese eigentlich sein sollte.

Kann mir hier jemand weiterhelfen?

Vielen Dank!

relevanter Teil aus der MainActivity

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    this.db = new Database(getApplicationContext());
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        db.insert();
        return true;
    }

    return super.onOptionsItemSelected(item);
}

relevater Teil aus der DB-Klasse

public class Database extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "my_db";
private static final String TABLE_NAME = "test";
private static final String TEST_VALUE = "test_value";
private static final int DATABASE_VERSION = 2;
private static final String TABLE_CREATE =
        "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" +
                "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " +
                TEST_VALUE + " TEXT);";


Database(Context context){
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    try {
        db.execSQL(TABLE_CREATE);
        Log.e("DB_SUCCESS", "" + TABLE_CREATE);
    } catch (Exception e) {
        Log.e("DB_ERROR", e.getMessage());
    }
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

private void setQuery(String p_query) {
    SQLiteDatabase db = this.getWritableDatabase();
    Log.e("DB_QUERY", "" + p_query);
    db.execSQL(p_query);
    Log.e("DB_COUNT", "" + getRowsCount());
}

public void insert() {
    String query = "INSERT INTO " + TABLE_NAME + " (" + TEST_VALUE +") VALUES ('3')";
    this.setQuery(query);

}

public int getRowsCount(){
    SQLiteDatabase db = this.getWritableDatabase();
    String query = "SELECT * FROM " + TABLE_NAME;
    Cursor cursor = db.rawQuery(query, null);
    int count = 0;
    if (cursor.moveToFirst()) {
        while (cursor.moveToNext()) {
            count++;
        }
    }

    return count;
}

}

— geändert am 03.05.2015, 20:05:36

Antworten
Sven R.
  • Forum-Beiträge: 1.904

04.05.2015, 07:47:05 via App

elochai

[...] while (cursor.moveToNext()) {
count++;
} [...]

Es liegt an der Loop hier. Bevor du die erste Row registrierst(mit count++) bewegst du den Cursor schon weiter. Wenn man sich das jetzt mal im Kopf vorstellt: Cursor an erster Position (wegen moveToFirst), dann wird er an die 2. Position bewegt, dann wird count++(=1), dann Cursor 3. Position (count=2) usw.
Man, sieht, dass count wie von dir beschrieben hinterherhängt.
Also machst du eine do while Loop.

do { count++ } while (moveToNext)

Außerdem solltest du den Cursor vor Benutzung auf null überprüfen, könnte sein, wenn es keine Row gibt.

— geändert am 04.05.2015, 07:48:50

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
elochai
  • Forum-Beiträge: 6

04.05.2015, 16:47:59 via Website

oh mist....dankeschön :)

Antworten