Я не могу извлекать и удалять данные из Sq-lite

#android #android-sqlite

#Android #android-sqlite

Вопрос:

Я создал базу данных для выполнения функции добавления в корзину. Это мой вспомогательный класс базы данных.

 public class SQLiteHandler extends SQLiteOpenHelper {

    private static final String TAG = SQLiteHandler.class.getSimpleName();
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = "soulcluster";

    // User table name
    private static final String TABLE_USER = "user";

    private static final String TABLE_PRODUCT = "product";

    private static final String TABLE_ADD_TO_CART = "addtocart";

    // User Table Columns names
    private static final String KEY_NAME = "name";
    private static final String KEY_EMAIL = "email";
    private static final String KEY_PASSWORD = "password";

    private static final String KEY_PRODUCT_ID = "id";
    private static final String KEY_PRODUCT_IMAGE = "image";
    private static final String KEY_PRODUCT_NAME = "productname";
    private static final String KEY_PRODUCT_PRICE = "productprice";
    private static final String KEY_PRODUCT_DESCRIPTION = "productdescription";


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

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_USER_TABLE = "CREATE TABLE "
                  TABLE_USER   "("
                  KEY_NAME   " TEXT,"
                  KEY_EMAIL   " TEXT UNIQUE,"
                  KEY_PASSWORD   " TEXT"   ")";

        String CREATE_PRODUCT_TABLE = "CREATE TABLE "
                  TABLE_PRODUCT   "("
                  KEY_PRODUCT_ID   " TEXT PRIMARY KEY,"
                  KEY_EMAIL   " TEXT,"
                  KEY_PRODUCT_IMAGE   " BLOB NOT NULL,"
                  KEY_PRODUCT_NAME   " TEXT NOT NULL,"
                  KEY_PRODUCT_PRICE   " TEXT NOT NULL,"
                  KEY_PRODUCT_DESCRIPTION   " TEXT NOT NULL"   ")";

        String CREATE_ADD_TO_CART_TABLE = "CREATE TABLE "
                  TABLE_ADD_TO_CART   "("
                  KEY_PRODUCT_ID   " TEXT PRIMARY KEY,"
                  KEY_PRODUCT_IMAGE   " BLOB NOT NULL,"
                  KEY_PRODUCT_NAME   " TEXT NOT NULL,"
                  KEY_PRODUCT_PRICE   " TEXT NOT NULL,"
                  KEY_PRODUCT_DESCRIPTION   " TEXT NOT NULL"   ")";

        db.execSQL(CREATE_USER_TABLE);
        db.execSQL(CREATE_PRODUCT_TABLE);
        db.execSQL(CREATE_ADD_TO_CART_TABLE);
        Log.d(TAG, "Database tables created"   CREATE_USER_TABLE   " "   CREATE_PRODUCT_TABLE   " "   CREATE_ADD_TO_CART_TABLE);
    }
public void addToCart(String product_id, byte [] image, String productName, String productPrice, String productDescription){
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues contentValues = new ContentValues();
        contentValues.put(KEY_PRODUCT_ID, product_id);
        contentValues.put(KEY_PRODUCT_IMAGE, image);
        contentValues.put(KEY_PRODUCT_NAME, productName);
        contentValues.put(KEY_PRODUCT_PRICE, productPrice);
        contentValues.put(KEY_PRODUCT_DESCRIPTION, productDescription);

        long id = db.insert(TABLE_ADD_TO_CART, null, contentValues);
        db.close();

        Log.d(TAG, "New product added into Add to cart "   product_id   " "   image   " "   productName   " "   productPrice   " "   productDescription   " "  id);
    }

    public void deleteAddToCartItem(String id){
        try {
            SQLiteDatabase db = this.getWritableDatabase();
            String query = "delete from "   TABLE_ADD_TO_CART   " where id='"   id   "'";
            Log.d("", "Id is here "   id);
            db.execSQL(query);
            db.close();
        }catch (Exception e){
            Log.d("", " Something is wrong");
        }

    }
public ArrayList<AddToCartItems> fetchProduct()
    {
        ArrayList<AddToCartItems> product = new ArrayList<>();
        SQLiteDatabase db = this.getWritableDatabase();

        String query = "select * from "   TABLE_ADD_TO_CART  ;
        Cursor cursor =  db.rawQuery(query, null);

        if(cursor.moveToFirst()){

            do{
                AddToCartItems addToCartItems = new AddToCartItems();
                addToCartItems.setId(cursor.getString(0));
                addToCartItems.setImageArray(cursor.getBlob(1));
                addToCartItems.setName(cursor.getString(2));
                addToCartItems.setPrice(cursor.getString(3));
                addToCartItems.setDescription(cursor.getString(4));

                product.add(addToCartItems);
                Log.d("", "check -----"   cursor.getString(cursor.getColumnIndex("productname"))   " "   cursor.getString(cursor.getColumnIndex("id")));
                cursor.moveToNext();
                Log.d("", "Inside fetching method"   " "   cursor.getCount()   " "   product.size() );
                System.out.print(cursor.getCount());
            }while (cursor.moveToNext());


        /*    for (int a = 0; a < cursor.getCount(); a  ){

            }*/
        }
        Log.d("", "Checkimh product size "   product.size());
        db.close();
        return product;
    }  

Я только что опубликовал требуемые методы.
В моем классе адаптера при нажатии кнопки добавить в корзину товар будет добавлен в базу данных.

 holder.add_to_cart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), items.getItem_Image());
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
                byte[] bitmapdata = stream.toByteArray();

                Date d = new Date();
                SimpleDateFormat sm = new SimpleDateFormat("yyyymmddhhmmss");
                String productID = sm.format(d);

                db.addToCart(productID, bitmapdata, items.getItem_name(), items.getItem_price(), items.getDescription());
                //AppController.getInstance().addToCartItemses(items.getItem_Image(), items.getItem_name(), items.getItem_price(), items.getDescription());
                Log.d(""," ShopAdapter "   " "   bitmapdata   " "   productID   " "   items.getItem_Image()   " "  items.getItem_name()  " "  items.getItem_price()  " "  items.getDescription());
            }
        });  

вот этот метод. Я использовал изображение как кнопку, и при нажатии на это изображение срабатывает запрос вставки.

Это метод удаления в следующем классе адаптера активности

 holder.delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                db.deleteAddToCartItem(addToCartItemses.get(position).getId());
                addToCartItemses.remove(position);
                notifyDataSetChanged();
            }
        });  

Почему мои запросы не выполняются.

Комментарии:

1. Какой метод аутентификации firebase вы используете?

2. Я использую createUserWithEmailAndPassword, а также сохраняю данные, но я не могу использовать идентификатор электронной почты в качестве идентификатора, который выдает мне ошибку.

3. Что я должен использовать для уникального идентификатора

4. Все, что вам нужно сделать, это получить предварительно назначенный uid с помощью firebase, как я упоминал в своем ответе.

Ответ №1:

Вам не нужно специально использовать что-либо для уникального идентификатора пользователя, поскольку каждому зарегистрированному пользователю присваивается уникальный идентификатор, и вы можете получить его следующим образом :

 FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
    // Name, email address, and profile photo Url
    String name = user.getDisplayName();
    String email = user.getEmail();
    Uri photoUrl = user.getPhotoUrl();

    // The user's ID, unique to the Firebase project. Do NOT use this value to
    // authenticate with your backend server, if you have one. Use
    // FirebaseUser.getToken() instead.
    String uid = user.getUid();
}
  

Этот фрагмент кода можно найти в официальных документах firebase здесь

Дайте мне знать, если эта информация поможет вам.

Комментарии:

1. Каждый раз происходит сбой аутентификации?

2. Используйте прослушиватель по завершении, чтобы перехватить исключение setValue из базы данных, чтобы точно определить, почему данные не сохраняются в противном случае. Если вы успешно аутентифицируете пользователя, вы можете получить уникальный идентификатор , как описано в ответе

3. Это было решено. Я забыл установить правила. Но что, если я хочу получить идентификатор конкретного пользователя при входе в систему

4. Вы имеете в виду, кроме пользователя, который вошел в систему?

5. Для того же пользователя. Если я войду в систему, мне понадобится мой uid для обновления данных