Search code examples
javaandroiddatabaseandroid-sqlitezero

id is always returning 0 in Android Studio SQLite. Help me point out the problem


I'm creating a todo list app with Android Studio.

My MainActivity.java

package com.example.myapplication;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private EditText etEnterColor;
    private Button btnAddNote;
    private RecyclerView rvColors;
    private List<ColorsModel> colorsModelsList;
    private CustomColorsAdapter customColorsAdapter;
    ColorDatabaseHelper colorDatabaseHelper = new ColorDatabaseHelper(MainActivity.this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        rvColors = findViewById(R.id.recyclerview_main_colors);
        etEnterColor = findViewById(R.id.editText_main_enterColors);
        btnAddNote = findViewById(R.id.button_main_add);

        loadAdapter();
        addButton();
        deleteSwipe();

    }

    public void addButton(){
        btnAddNote.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String extractColor = etEnterColor.getText().toString();

                colorDatabaseHelper.createNote(new ColorsModel(extractColor));

                loadAdapter();
                etEnterColor.setText("");
            }
        });
    }

    public void loadAdapter(){
        colorsModelsList = new ColorDatabaseHelper(MainActivity.this).readNote();
        customColorsAdapter = new CustomColorsAdapter(colorsModelsList);
        rvColors.setAdapter(customColorsAdapter);
    }

    public void deleteSwipe(){
        ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
                Toast.makeText(MainActivity.this, "ID: " + colorsModelsList.get(viewHolder.getAdapterPosition()).getId(), Toast.LENGTH_SHORT).show();
                colorDatabaseHelper.deleteNote(colorsModelsList.get(viewHolder.getAdapterPosition()).getId());
                colorsModelsList.remove(viewHolder.getAdapterPosition());
                customColorsAdapter.notifyItemRemoved(viewHolder.getAdapterPosition());
            }
        };

        ItemTouchHelper touchHelper = new ItemTouchHelper(simpleCallback);
        touchHelper.attachToRecyclerView(rvColors);
    }
}

Here is my Database

package com.example.myapplication;

import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

import java.util.ArrayList;
import java.util.List;

public class ColorDatabaseHelper extends SQLiteOpenHelper {
    public static final String NAME = "colors.db";
    public static final int VERSION = 1;
    public static final String TABLE_COLORS = "COLORS";
    public static final String COLUMN_ID = "ID";
    public static final String COLUMN_NAME = "NAME";

    public ColorDatabaseHelper(@Nullable Context context) {
        super(context, NAME, null, VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String query = "CREATE TABLE " + TABLE_COLORS + " (" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_NAME + " TEXT);";
        db.execSQL(query);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String query = "DROP TABLE IF EXISTS " + TABLE_COLORS + ";";
        db.execSQL(query);
        onCreate(db);
    }

    public void createNote(ColorsModel colorsModel){
        SQLiteDatabase sqLiteDatabase = getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(COLUMN_NAME, colorsModel.getName());
        sqLiteDatabase.insert(TABLE_COLORS, null, contentValues);
        sqLiteDatabase.close();
    }

    public List<ColorsModel> readNote(){
        List<ColorsModel> colorsModelList = new ArrayList<>();
        SQLiteDatabase sqLiteDatabase = getReadableDatabase();
        String query = "SELECT * FROM " + TABLE_COLORS + ";";
        Cursor cursor = sqLiteDatabase.rawQuery(query, null);

        cursor.moveToFirst();
        while (!cursor.isAfterLast()){
            @SuppressLint("Range") int id = cursor.getInt(cursor.getColumnIndex(COLUMN_ID));
            @SuppressLint("Range") String name = cursor.getString(cursor.getColumnIndex(COLUMN_NAME));

            colorsModelList.add(new ColorsModel(name));
            cursor.moveToNext();
        }

        cursor.close();
        sqLiteDatabase.close();
        return colorsModelList;
    }

    public void deleteNote(int id){
        SQLiteDatabase sqLiteDatabase = getWritableDatabase();
        String whereclause = COLUMN_NAME + "='" + id + "';";
        sqLiteDatabase.delete(TABLE_COLORS, whereclause, null);

        sqLiteDatabase.close();

    }
}

The only problem is whenever I swipe any items in the list, the ID it gets is always 0. I am completely sure that all methods in my Database are working..

Example snippet of my database

Just a beginner here. Thanks!

I can solve the problem by making changes like getting the name instead of id

    public void deleteNote(**String name**){
        SQLiteDatabase sqLiteDatabase = getWritableDatabase();
        String whereclause = COLUMN_NAME + "='" + **name** + "';";
        sqLiteDatabase.delete(TABLE_COLORS, whereclause, null);

        sqLiteDatabase.close();

    }

then changing onSwiped to

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
                Toast.makeText(MainActivity.this, "ID: " + colorsModelsList.get(viewHolder.getAdapterPosition()).getName(), Toast.LENGTH_SHORT).show();
                colorDatabaseHelper.deleteNote(colorsModelsList.get(viewHolder.getAdapterPosition())**.getName()**);
                colorsModelsList.remove(viewHolder.getAdapterPosition());
                customColorsAdapter.notifyItemRemoved(viewHolder.getAdapterPosition());
            }

I want to use the ID instead of other variables but I can't figure it out somehow.


Solution

  • It seems you didn't pass the ID to new created object in readNotes function:

    colorsModelList.add(new ColorsModel(name));
    

    The ID will always be the initial value when accessing it by getID().