sql >> Databáze >  >> RDS >> SQLite

Lze položky databáze přidané z položek smazat tlačítkem?

Alternativní odpověď

Následuje kód pro docela základní, ale fungující příklad. Jde však ještě o něco dále tím, že obsahuje ListView a povolení smazání dlouhým kliknutím na položku v ListView .

To však nepoužívá fragmenty.

Existují 3 kusy kódu, MainActivity (MainActivity.java ), podtřída SQLiteOpenHelper CrimeDBHelper (CrimeDBHelper.java ) a rozložení pro MainActivity, activity_main.xml :-

activity_main.xml

To je docela přímočaré. Všimněte si, že obsahuje ListView na konci.

<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

Většina je podobná, kromě dodatečné metody getCrimeList() , vrátí kurzor, který obsahuje všechna data z tabulky zločinů (používá se k naplnění 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();
        }

    }
}

První věc, kterou je třeba si všimnout, je řádek long lastcrimeid; , toto je deklarováno na úrovni třídy, takže je velmi dostupné v celém (problém, který jste měli s long databaseID ).

Můžete si také všimnout SimpleCursorAdapter sca; toto bude použito pro ListView (v podstatě umístí data z kurzoru do ListView ).

Měli byste být obeznámeni s velkou částí následujícího kódu. Stručně řečeno:-

  • volá se super.onCreate.
  • Aktivita je nastavena tak, aby používala rozložení activity_main.xml.
  • Po načtení rozvržení se získají ID přidružená k zobrazením.
  • Kurzor se získá získáním aktuálních zločinů z databáze (může být žádný, to není problém).

  • je přidán posluchač tlačítka pro přidání trestného činu. Všimněte si, že toto používá vrácené _id přidaného řádku dvakrát (ve skutečnosti 3krát, protože se odpovídajícím způsobem změní text tlačítek pro odstranění ).

    • lastcrimeid je nastaven návratem addCrime() metoda.
    • mDltCrime.setTag(lastcrimeid); nastaví značku tlačítka pro odstranění na _id přidaného řádku.

    • Všimněte si také, že existují dva další řádky, jmenovitě crimelist = dbhlpr.getCrimeList(); a sca.swapCursor(crimelist); .

      • První nahradí kurzor tím, co je nyní v databázi (tj. zahrnuje řádek, který byl přidán), druhý řekne ListView, aby použil nový kurzor, takže ListView zobrazí, co je nyní v databázi ( toto se znovu použije při mazání řádku).
    • poté se přidá posluchač tlačítka pro tlačítko mazání. To může fungovat dvěma způsoby. lastcrimeid lze použít nebo alternativně lze použít fázi tlačítka jako obě drží _id řádku, který má být smazán. Kód má první zakomentovaný, takže se použije druhý způsob (tj. načte se hodnota v tagu tlačítka).

      • Všimněte si, že tato druhá metoda má nevýhodu v tom, že hodnota může být null, což by způsobilo výjimku nulového ukazatele, proto if (view.getTag != null) .
    • Stejně jako výše pro obnovení ListView .

    • Dále je SimpleCursorAdapter nastaven, vyžaduje 5 parametrů:-

      • Rozvržení, které má být použito (android.R.layout.simple_list_item_1), je standardní rozvržení.
      • data, která mají být použita ve formě kurzoru. POZNÁMKA! sloupec s názvem _id MUSÍ existovat (obecně je dobré vždy použít _id INTEGER PRIMARY KEY z tohoto důvodu. ) Všimněte si, že dostáváme Cursor crimelist prostřednictvím getCrimeList metoda.
      • Sloupce v kurzoru, ze kterých se mají načíst data.
      • Zobrazení v rozložení, kam budou umístěna načtená data.
      • Hodnota, jejíž účel si nepamatuji. Nicméně 0 je vhodné použít. Nekódování tohoto 5. parametru pravděpodobně povede k zastaralé zprávě.
      • (Všimněte si, že běžně používám Custom CursorAdapters, protože jsou mnohem flexibilnější, takže jen zřídka používám Simples).
  • Poté je ListView řečeno, aby použil adaptér podle mCrimeList.setAdapter(sca); .

  • Poté onItemLongClickListener je přidán do ListView, který smaže zločin, na který bylo dlouho kliknuto (dlouhé l je _id hodnotu, tedy důvod, proč CursorAdapter potřebuje _id a proto dbhlpr.deleteCrime(l); ).

    • Opět ListView je obnoveno.
  • Nakonec, když je kurzor používán, zatímco aktivita zůstává používána onDestory metoda se používá k uzavření kurzoru (kurzory by měly být vždy uzavřeny, když skončíte s).

Takhle to vypadá (ne hezké, ale funkční) se třemi přidanými zločiny (tlačítko smazat odstraní Zločin století zločin). Dlouhým kliknutím na jakýkoli zločin uvedený v seznamu tento zločin smažete. Kliknutím na přidat přidáte další položku pro Crime of the Century, pokud nebudou změněna data.



  1. Podmíněný SUM na Oracle

  2. Příklady SQRT() v SQL Server

  3. Jak změnit výchozí profil pošty databáze pro uživatele v SQL Server (T-SQL)

  4. 5 tipů, jak udržet databázi v bezpečí