sql >> データベース >  >> RDS >> SQLite

アイテムから追加されたデータベースエントリをボタンで削除できますか?

    代替回答

    以下は、かなり基本的な、しかし実用的な例のコードです。ただし、 ListView を組み込むことで、さらに進んでいます。 ListViewのアイテムをロングクリックして削除を許可する 。

    ただし、これはフラグメントを使用しません。

    MainActivityの3つのコードがあります (MainActivity.java )、SQLiteOpenHelperサブクラス CrimeDBHelper CrimeDBHelper.java )およびMainActivityのレイアウトactivity_main.xml :-

    activity_main.xml

    これは非常に簡単です。 ListViewが含まれていることに注意してください 最後に。

    <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

    追加のメソッドgetCrimeList()を除いて、ほとんどが似ています。 、これは、犯罪テーブルからのすべてのデータを含むカーソルを返します(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();
            }
    
        }
    }
    

    最初に注意するのは、long lastcrimeid;という行です。 、これはクラスレベルで宣言されているため、全体で非常に利用可能です( long databaseIDで発生していた問題 )。

    SimpleCursorAdapter sca;にも気付くかもしれません。 これはListViewに使用されます 基本的には、カーソルからのデータをListViewに配置します

    次のコードの多くに精通している必要があります。要約すると:-

    • super.onCreateが呼び出されます。
    • アクティビティは、activity_main.xmlレイアウトを使用するように設定されています。
    • レイアウトが読み込まれると、ビューに関連付けられたIDが取得されます。
    • データベースから現在の犯罪を取得するカーソルが取得されます(ない場合もありますが、これは問題ではありません)。

    • 犯罪を追加するためのボタンリスナーが追加されました。これは返された_idを使用することに注意してください 追加された行の2回(削除ボタンのテキストがそれに応じて変更されるため、実際には3回 )。

      • lastcrimeid addCrime()の戻り値によって設定されます メソッド。
      • mDltCrime.setTag(lastcrimeid); 削除ボタンのタグを_idに設定します 追加された行の。

      • また、crimelist = dbhlpr.getCrimeList();という2つの追加行が存在することにも注意してください。 およびsca.swapCursor(crimelist);

        • 1つ目はカーソルを現在データベースにあるもの(つまり、追加された行を含む)に置き換え、2つ目はListViewに新しいカーソルを使用するように指示するため、ListViewはデータベースに現在あるものを表示します(これは、行を削除するときに再び使用されます。
      • 次に、削除ボタンのボタンリスナーが追加されます。これは2つの方法で機能します。 lastcrimeid 両方を_idに保持するために使用することも、ボタンのタグを使用することもできます。 削除する行の。コードには前者がコメントアウトされているため、後者の方法が使用されます(つまり、ボタンのタグの値が取得されます)。

        • この後者の方法には、値がnullになる可能性があるという欠点があることに注意してください。これにより、nullポインター例外が発生するため、if (view.getTag != null)
      • 上記のようにListViewを更新します 。

      • 次に、SimpleCursorAdapterがセットアップされ、5つのパラメーターが必要です。-

        • 使用するレイアウト(android.R.layout.simple_list_item_1)はストックレイアウトです。
        • カーソルの形式で使用されるデータ。ノート! _idという名前の列 存在する必要があります(通常、常に_id INTEGER PRIMARY KEYを使用することをお勧めします このため。 )カーソルcrimelistを取得することに注意してください getCrimeList経由 メソッド。
        • データの取得元となるカーソル内の列。
        • 取得したデータが配置されるレイアウトのビュー。
        • 目的を思い出せない値。ただし、0を使用しても問題ありません。この5番目のパラメーターをコーディングしないと、非推奨のメッセージが表示される可能性があります。
        • (私は通常、カスタムCursorAdaptersを使用します。これは、はるかに柔軟性があり、Simplesを使用することはめったにないためです)。
    • 次に、ListViewは、mCrimeList.setAdapter(sca);に従ってアダプタを使用するように指示されます。 。

    • 次に、onItemLongClickListener ListViewに追加され、ロングクリックされた犯罪が削除されます(longlは_id です) 値、したがってCursorAdapterが _idを必要とする理由 したがって、なぜdbhlpr.deleteCrime(l);

      • もう一度ListView 更新されます。
    • 最後に、アクティビティが使用されている間にカーソルが使用されるため、onDestory メソッドはカーソルを閉じるために使用されます(カーソルは終了時に常に閉じる必要があります)。

    これは、3つの犯罪が追加された(きれいではありませんが機能的な)外観です(削除ボタンは世紀の犯罪を削除します) 犯罪)。リストされている犯罪を長押しすると、その犯罪は削除されます。 [追加]をクリックすると、データが変更されない限り、Crime oftheCenturyの別のエントリが追加されます。



    1. MySQLで最後に更新された行のIDを取得するにはどうすればよいですか?

    2. INNERJOIN以外の結合を使用した3つのテーブル結合

    3. 文字列がJSONであるかどうかをテストする方法は?

    4. EBSR12の開始および停止スクリプト