sql >> Database >  >> RDS >> SQLite

Kunnen database-items die zijn toegevoegd uit items worden verwijderd met de knop?

Alternatief antwoord

Het volgende is de code voor een vrij eenvoudig, maar werkend voorbeeld. Het gaat echter een beetje verder door een ListView . op te nemen en verwijdering toestaan ​​door lang te klikken op een item in de ListView .

Dit gebruikt echter geen fragmenten.

Er zijn 3 stukjes code, de MainActivity (MainActivity.java ), De SQLiteOpenHelper-subklasse CrimeDBHelper (CrimeDBHelper.java ) en de lay-out voor de MainActivity, activity_main.xml :-

activity_main.xml

Dit is vrij rechttoe rechtaan. Merk op dat het een ListView . bevat aan het einde.

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="The Crime Thing"
    android:layout_gravity="center"
    android:textStyle="bold"/>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <TextView
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="Crime Title"
        />
    <EditText
        android:id="@+id/crimetitle"
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <TextView
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="Crime Date"
        />
    <EditText
        android:id="@+id/crimedate"
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <TextView
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="Suspect"
        />
    <EditText
        android:id="@+id/crimesuspect"
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <TextView
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="Crime Solved?"
        />
    <CheckBox
        android:id="@+id/crimesolved"
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="wrap_content" />
</LinearLayout>
<Button
    android:id="@+id/addcrime"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="ADD CRIME"/>
<Button
    android:id="@+id/dltcrime"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="DLT CRIME (ID=?)"/>
<ListView
    android:id="@+id/crimelist"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
</ListView>

CrimeDBHelper.java

De meeste zijn vergelijkbaar, behalve de aanvullende methode getCrimeList() , dit geeft een cursor terug die alle gegevens uit de misdaadtabel bevat (gebruikt voor het vullen van de ListView).

public class CrimeDBHelper extends SQLiteOpenHelper {

    public static final String DBNAME = "crimesdb";
    public static final int DBVERSION = 1;
    public static final String CRIMESTABLE = "crimes";
    public static final String CRIMEID_COL = "_id";
    public static final String CRIMETITLE_COL = "crimetitle";
    public static final String CRIMEDATE_COL = "crimedate";
    public static final String CRIMESUSPECT_COL = "crimesuspect";
    public static final String CRIMESOLVED_COL = "crimesolved";


    public static final String TABLECRTSQL =
            "CREATE TABLE " + CRIMESTABLE + "(" +
                    CRIMEID_COL + " INTEGER PRIMARY KEY," +
                    CRIMETITLE_COL + " TEXT," +
                    CRIMEDATE_COL + " TEXT, " +
                    CRIMESUSPECT_COL + " TEXT, " +
                    CRIMESOLVED_COL + " INTEGER" +
                    ");";

    public CrimeDBHelper(Context context) {
        super(context, DBNAME, null, DBVERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(TABLECRTSQL);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {
    }

    public long addCrime(String crimetitle, String crimedate, String crimesuspect, int crimesolved) {

        SQLiteDatabase db = getWritableDatabase();

        ContentValues cv = new ContentValues();
        cv.put(CRIMETITLE_COL,crimetitle);
        cv.put(CRIMEDATE_COL,crimedate);
        cv.put(CRIMESUSPECT_COL,crimesuspect);
        cv.put(CRIMESOLVED_COL,crimesolved);
        return db.insert(CRIMESTABLE,null,cv);
    }

    public int deleteCrime(long crimeid) {
        SQLiteDatabase db = getWritableDatabase();
        String whereclause = CRIMEID_COL + "=?";
        String[] whereargs = {Long.toString(crimeid)};
        return db.delete(CRIMESTABLE,whereclause,whereargs);
    }

    public Cursor getCrimeList() {
        SQLiteDatabase db = getWritableDatabase();
        return db.query(CRIMESTABLE,null,null,null,null,null,null,null);
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    EditText mCrimeTitle;
    EditText mCrimeDate;
    EditText mCrimeSuspect;
    CheckBox mCrimeSolved;

    Button mAddCrime;
    Button mDltCrime;
    ListView mCrimeList;

    CrimeDBHelper dbhlpr = new CrimeDBHelper(this);
    Cursor crimelist;
    SimpleCursorAdapter sca;

    long lastcrimeid;

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

        mCrimeTitle = (EditText) findViewById(R.id.crimetitle);
        mCrimeDate = (EditText) findViewById(R.id.crimedate);
        mCrimeSuspect = (EditText) findViewById(R.id.crimesuspect);
        mCrimeSolved = (CheckBox) findViewById(R.id.crimesolved);
        mCrimeList = (ListView) findViewById(R.id.crimelist);
        mAddCrime = (Button) findViewById(R.id.addcrime);
        mDltCrime = (Button) findViewById(R.id.dltcrime);

        crimelist = dbhlpr.getCrimeList();

        // Setup Button to Add a crime
        mAddCrime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int solved = 0;
                if (mCrimeSolved.isChecked()) {
                    solved = 1;
                }
                lastcrimeid =  dbhlpr.addCrime(
                        mCrimeTitle.getText().toString(),
                        mCrimeDate.getText().toString(),
                        mCrimeSuspect.getText().toString(),
                        solved
                );
                mDltCrime.setText("DLT CRIME (ID=" + Long.toString(lastcrimeid) + ")");
                mDltCrime.setTag(lastcrimeid);
                crimelist = dbhlpr.getCrimeList();
                sca.swapCursor(crimelist);
            }
        });

        // Setup button to delete the latest Crime added
        mDltCrime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //dbhlpr.deleteCrime(lastcrimeid); can do it this way
                if (view.getTag() != null) {
                    dbhlpr.deleteCrime((long)view.getTag());
                    crimelist = dbhlpr.getCrimeList();
                    sca.swapCursor(crimelist);
                }
            }
        });

        sca = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_1,
                crimelist,
                new String[]{CrimeDBHelper.CRIMETITLE_COL},
                new int[]{android.R.id.text1},
                0
        );
        mCrimeList.setAdapter(sca);

        mCrimeList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
                dbhlpr.deleteCrime(l);
                crimelist = dbhlpr.getCrimeList();
                sca.swapCursor(crimelist);
                return true;
            }
        });

    }

    protected void onDestroy() {
        super.onDestroy();
        if (crimelist != null) {
            crimelist.close();
        }

    }
}

Het eerste dat opvalt is de regel long lastcrimeid; , dit wordt op klasniveau gedeclareerd en is dus overal beschikbaar (het probleem dat u had met long databaseID ).

Mogelijk merkt u ook SimpleCursorAdapter sca; dit wordt gebruikt voor de ListView (in feite plaatst het de gegevens van de cursor in de ListView ).

U moet bekend zijn met veel van de volgende code. Samengevat:-

  • super.onCreate heet.
  • De activiteit is ingesteld om de layout activity_main.xml te gebruiken.
  • Als de lay-out is geladen, worden de id's die bij de weergaven horen, verkregen.
  • Er wordt een cursor verkregen die de huidige misdaden uit de database haalt (mogelijk geen, dit is geen probleem).

  • de knoplistener voor het toevoegen van een misdaad is toegevoegd. Merk op dat dit de geretourneerde _id . gebruikt van de toegevoegde rij twee keer (eigenlijk 3 keer omdat het de tekst van de verwijderknoppen dienovereenkomstig verandert ).

    • lastcrimeid wordt ingesteld door de terugkeer van de addCrime() methode.
    • mDltCrime.setTag(lastcrimeid); stelt de tag van de verwijderknop in op de _id van de toegevoegde rij.

    • Merk ook op dat er twee extra regels bestaan, namelijk crimelist = dbhlpr.getCrimeList(); en sca.swapCursor(crimelist); .

      • De eerste vervangt de cursor door wat zich nu in de database bevindt (d.w.z. inclusief de rij die is toegevoegd), de tweede vertelt de ListView om de nieuwe cursor te gebruiken, zodat de ListView laat zien wat er nu in de database staat ( dit wordt opnieuw gebruikt bij het verwijderen van een rij).
    • de knoplistener voor de verwijderknop wordt dan toegevoegd. Dit kan op twee manieren werken. De lastcrimeid kan worden gebruikt of als alternatief kan het tage van de knop worden gebruikt omdat beide de _id . vasthouden van de rij die moet worden verwijderd. De code heeft de eerste uitgecommentarieerd, dus de laatste methode wordt gebruikt (d.w.z. de waarde in de tag van de knop wordt opgehaald).

      • Merk op dat deze laatste methode het nadeel heeft dat de waarde null kan zijn, wat een null-pointeruitzondering zou veroorzaken, vandaar de if (view.getTag != null) .
    • Zoals hierboven voor het vernieuwen van de ListView .

    • Vervolgens wordt de SimpleCursorAdapter ingesteld, er zijn 5 parameters voor nodig:-

      • de te gebruiken lay-out (android.R.layout.simple_list_item_1) is een standaardlay-out.
      • de te gebruiken gegevens in de vorm van een cursor. NOTITIE! een kolom met de naam _id MOET bestaan ​​(in het algemeen is het een goed idee om altijd _id INTEGER PRIMARY KEY te gebruiken om deze reden. ) Merk op dat we een cursor crimelist . krijgen via de getCrimeList methode.
      • De kolom(men) in de cursor waaruit de gegevens moeten worden opgehaald.
      • De weergave(n) in de lay-out waar de opgehaalde gegevens worden geplaatst.
      • Een waarde waarvan ik me het doel niet kan herinneren. Maar 0 is prima te gebruiken. Het niet coderen van deze 5e parameter zal waarschijnlijk resulteren in een verouderd bericht.
      • (Opmerking:ik gebruik normaal gesproken Custom CursorAdapters omdat ze veel flexibeler zijn, dus gebruik zelden Simples).
  • Vervolgens wordt de ListView verteld om de adapter te gebruiken volgens mCrimeList.setAdapter(sca); .

  • Dan een onItemLongClickListener wordt toegevoegd aan de ListView, die de misdaad verwijdert waarop lang is geklikt (lange l is de _id waarde, vandaar een reden waarom een ​​CursorAdapter _id . nodig heeft en daarom waarom dbhlpr.deleteCrime(l); ).

    • Nogmaals de ListView is vernieuwd.
  • Ten slotte, aangezien de cursor wordt gebruikt terwijl de activiteit in gebruik blijft onDestory methode wordt gebruikt om de cursor te sluiten (cursors moeten altijd worden gesloten als u klaar bent met).

Dit is hoe het eruit ziet (niet mooi maar functioneel), met drie toegevoegde misdaden (de verwijderknop zou de De misdaad van de eeuw verwijderen misdaad). Als u lang op een misdaad in de lijst klikt, wordt die misdaad verwijderd. Als u op Toevoegen klikt, wordt er nog een item voor Misdaad van de Eeuw toegevoegd, tenzij de gegevens zijn gewijzigd.



  1. Bestel varchar string als numeriek

  2. Java SQL FOUT:Relatietabelnaam bestaat niet

  3. Verkrijg de korte naam van de maand in PostgreSQL

  4. Hoe de implementatie van PostgreSQL-database te automatiseren