Pregunta

I have a table with two columns first is date and the second is a counter. I do not have a primary key but the date acts as one. So my code checks if the current date exists in the table, if so it will only increment the counter other wise it will add a new entry. The existence of the current date is only possible at the last row. here is the code:

SQLiteOpenHelper implementation: public class SqliteHelperInstance extends SQLiteOpenHelper {

public static final String DATABASE_NAME = "app_stats";
public static final String TABLE_NAME = "day_stats";
public static final String COLUMN_DATE = "date";
public static final String COLUMN_CIGCOUNT = "cigcount";
public static final int DATABASE_VERSION = 1;

private static final String CREATE_DB = "create table " + TABLE_NAME + " ( " +  COLUMN_DATE + " text, "
+ COLUMN_CIGCOUNT + " integer );";

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

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL(CREATE_DB);

}
}

The implementation of database manager:

public class DbManager {

private SqliteHelperInstance sqlHelper;
private SQLiteDatabase database;
private String[] columns =  { SqliteHelperInstance.COLUMN_DATE, SqliteHelperInstance.COLUMN_CIGCOUNT};
 public DbManager(Context context){
    sqlHelper = new SqliteHelperInstance(context);
}
 public void addEntry(Calendar cal){
    ContentValues values = new ContentValues();
    String dateEntry = dateFormatter(cal);
Cursor cursor = database.query(SqliteHelperInstance.TABLE_NAME, null, null, null, null, null, 
            SqliteHelperInstance.COLUMN_DATE + " DESC LIMIT 1");
    //check if the last entered date is equal to the current date
    if(cursor.moveToFirst()){
        String lastDate = cursor.getString(0);
        if(lastDate.equalsIgnoreCase(dateEntry)){
            //the cigNum should be updated for the current date
            int cigNum = cursor.getInt(1);
            cigNum ++;

            values.put(SqliteHelperInstance.COLUMN_DATE,lastDate);
            values.put(SqliteHelperInstance.COLUMN_CIGCOUNT, cigNum);
            int i = database.update(SqliteHelperInstance.TABLE_NAME, values,SqliteHelperInstance.COLUMN_DATE + " = " + lastDate , null);
            if(i == 0){
                Log.d("Tag", "No row is affected");
            }
        }
        else{
            //the last date is different than current day so we need to add a new entry
            DbEntry newEntry = new DbEntry();
            newEntry.setDate(dateEntry);
            values.put(SqliteHelperInstance.COLUMN_DATE, dateEntry);
            values.put(SqliteHelperInstance.COLUMN_CIGCOUNT, newEntry.getCigNum());
            database.insert(SqliteHelperInstance.TABLE_NAME, null, values);
        }
    }
    else{
        //its the first time that the application is loading
        DbEntry newEntry = new DbEntry();
        newEntry.setDate(dateEntry);
        newEntry.setCignum(1);
        values.put(SqliteHelperInstance.COLUMN_DATE, dateEntry);
        values.put(SqliteHelperInstance.COLUMN_CIGCOUNT, newEntry.getCigNum());
        Log.i(null, "values are set");
        database.insert(SqliteHelperInstance.TABLE_NAME, null, values);
    }


}

But when I run the application, I keep getting 0 row affected by the update function.I assume the comparison in the where clause is not returning any particular row. can anyone help me with this issue?

¿Fue útil?

Solución

Try getting the lastDate like this:

String lastDate = cursor.getString(cursor.getColumnIndex(SqliteHelperInstance.COLUMN_DATE));

Also, you should use parameterized queries:

int i = database.update(SqliteHelperInstance.TABLE_NAME, values,SqliteHelperInstance.COLUMN_DATE + " = ?", new String[]{ lastDate });

Other than that, I'm not sure what could be wrong.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top