Как обновить представление списка или уведомить адаптер при добавлении или удалении элемента в базу данных? - PullRequest
0 голосов
/ 08 ноября 2019

Мое приложение аварийно завершает работу после добавления или удаления элемента во второй раз. Я создал новый вид деятельности для добавления и удаления. Я довольно новичок в Android Studio, поэтому многое из этого сбивает меня с толку, и я потратил целый день, пытаясь понять это, но заранее благодарю тех, кто будет терпелив, чтобы помочь!

Это моя основная деятельность

public class MainActivity extends AppCompatActivity {

    DbHelper helper = null;
    public static final String KEY = "ITEM";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        final ListView listView = findViewById(R.id.list);
        helper = new DbHelper(this);

        final SQLiteDatabase db = helper.getReadableDatabase();
        final ArrayList<String> values = new ArrayList<>();


        Cursor c = helper.getAllItems(db);
        while (c.moveToNext()){
            values.add(c.getString(c.getColumnIndexOrThrow(ShoppingList.ItemEntity.COLUMN_NAME_ITEM)));
        }
        final MyArrayAdapter adapter = new MyArrayAdapter(this, R.layout.item_layout, values);

        listView.setAdapter(adapter);
        c.close();

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String item = parent.getItemAtPosition(position).toString();
                Intent intent = new Intent(parent.getContext(), ItemActivity.class);
                intent.putExtra(KEY, item);
                startActivity(intent);
            }
        });

        //Defined floating action button function
        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(view.getContext(), AddItemActivity.class);
                startActivityForResult(i, 1);
            }
        });

    }

Это моя AddItemActivity

public class AddItemActivity extends AppCompatActivity {

    DbHelper helper = null;

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


        helper = new DbHelper(this);
        final SQLiteDatabase db = helper.getReadableDatabase();

        Button btn = findViewById(R.id.btn_add);
        final EditText item = findViewById(R.id.item_to_add);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String toAddItem = item.getText().toString();
                long id = helper.insert(db, toAddItem);
                Toast.makeText(view.getContext(), "Item added with id = " + id, Toast.LENGTH_LONG).show();
                item.setText("");
                Intent i = new Intent();
                ((Activity)view.getContext()).setResult(Activity.RESULT_OK, i);
                finish();
            }
        });
    }
}

Это моя ItemActivity, где срабатывает кнопка удаления

public class ItemActivity extends AppCompatActivity {

    DbHelper helper = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_item);

        //Database declaration
        helper = new DbHelper(this);
        final SQLiteDatabase db = helper.getReadableDatabase();

        final TextView txt = findViewById(R.id.shop_item);
        final String item = getIntent().getExtras().getString(MainActivity.KEY, "NO DATA");

        txt.setText(item);
        Button btn = findViewById(R.id.btn_delete);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                helper.delete(db, item);
                finish();
            }
        });
    }
}

Наконец, это мой помощник базы данных, вна тот случай, если понадобится лучше контролировать проблему.

public class DbHelper extends SQLiteOpenHelper {
    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "shoppingItems.db";

    public DbHelper(Context context){
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(ShoppingList.ItemEntity.SQL_CREATE);
        Log.d("DATABASE", "Database created");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(ShoppingList.ItemEntity.SQL_DROP);
        Log.d("DATABASE", "Database dropped");
        onCreate(db);
    }
    public long insert(SQLiteDatabase db, String word){
        ContentValues values = new ContentValues();
        //we're adding an item into our column word
        values.put(ShoppingList.ItemEntity.COLUMN_NAME_ITEM, word);
        return db.insert(ShoppingList.ItemEntity.TABLE_NAME, null, values);
    }

    public Cursor getAllItems(SQLiteDatabase db){
        String[] projection = {
                ShoppingList.ItemEntity._ID,
                ShoppingList.ItemEntity.COLUMN_NAME_ITEM
        };
        return db.query(ShoppingList.ItemEntity.TABLE_NAME, projection, null, null, null,
                null, null);
    };
    public void delete(SQLiteDatabase db, String item){
        db.delete(ShoppingList.ItemEntity.TABLE_NAME,"item=?",new String[]{item});
    }
}

Я пытался добавить notify(); после добавления и удаления метода, но в итоге получилось сообщение об ошибке «объект не заблокирован потоком перед notify ()".

Я полагаю, что должен сообщить адаптеру, что изменения были сделаны, но я не могу понять, как.

Спасибо!

...