在我的项目中,我使用SQL(SQLite,因为它的android)来保存我的数据。
我遇到了一些奇怪的问题:
在我的应用程序中,我有三个选项卡,为了知道哪些数据属于我的图表中的哪个选项卡,每个选项卡都有一列。列(整数)中的数字表示该选项卡中是否以及有多少数据。 因此,当选项卡初始化时,它从图表中读取,并使用相关列,它可以告诉需要读取哪些数据以及有多少数据。
当我从服务器检索数据时(服务器的数据库与手头的问题无关),我检查数据是新的还是我的SQL数据库中已有类似数据。如果它是新的,我将它添加到SQL图表并将1放在相关列中。如果它已经存在,它会检查SQL中的数据是否已更新(如果需要,它会更新数据)并将1添加到相关列(如果数据不在SQL DB中,则将其中的1列添加到其中)
现在我的问题是: 当它从SQL DB中读取以查看列中的数字时,它可以向其添加1然后更新图表,它始终返回1 ,而不管该时刻列中的实际数字(我知道它不是真的1,因为当我从我应用程序中其他地方的同一列中读取数据库时,它确实读取了实际数字。)
因为在我的应用程序的其他地方它并没有发生我试图看看这些地方之间有什么区别,但我没有发现任何错误(唯一的区别是我使用了WritableDatabase而不仅仅是ReadableDatabase)时间,但据我所知,这应该不是问题,至少在这种情况下不是这样。)
出现问题的代码(问题出在COL_CART上):
writable = db.getWritableDatabase();
Cursor cursor = writable.query(
ShopContract.ShopChart.TABLE_NAME,
new String[]{ShopContract.ShopChart.COL_NAME, ShopContract.ShopChart.COL_PRICE, ShopContract.ShopChart.COL_PIC, ShopContract.ShopChart.COL_CART},
ShopContract.ShopChart.COL_PROD_ID + " = '" + product.getProd_id() +"'",
null,
null,
null,
null
);
if(cursor.moveToFirst()){
//check if the data match, if not, replace.
if(!cursor.getString(cursor.getColumnIndex(ShopContract.ShopChart.COL_NAME)).equals(product.getName())){
ContentValues values = new ContentValues();
values.put(ShopContract.ShopChart.COL_NAME,product.getName());
update(values);
}
if(cursor.getDouble(cursor.getColumnIndex(ShopContract.ShopChart.COL_PRICE)) != product.getPrice()){
ContentValues values = new ContentValues();
values.put(ShopContract.ShopChart.COL_PRICE,product.getPrice());
update(values);
}
if(!cursor.getString(cursor.getColumnIndex(ShopContract.ShopChart.COL_PIC)).equals(product.getPicture())){
ContentValues values = new ContentValues();
values.put(ShopContract.ShopChart.COL_PIC,product.getPicture());
update(values);
}
//check how many there are already in cart (already in the cursor) and update it to be ++
Log.d(TAG, "run: the number in col_cart is: " + cursor.getInt(cursor.getColumnIndex(ShopContract.ShopChart.COL_CART)));
int inCart = cursor.getInt(cursor.getColumnIndex(ShopContract.ShopChart.COL_CART)) + 1; // because of the new product we just added
Log.d(TAG, "run: inCart = " + inCart);
ContentValues values = new ContentValues();
values.put(ShopContract.ShopChart.COL_CART,inCart);
Log.d(TAG, "run: change cart");
update(values);
编辑: 这是更新方法代码(可写在上面的代码中初始化):
private SQLiteDatabase writable;
private void update(ContentValues values){
writable.update(ShopContract.ShopChart.TABLE_NAME, values, ShopContract.ShopChart.COL_PROD_ID + " = '" + product.getProd_id() +"'",null);
}