SQLite
 sql >> डेटाबेस >  >> RDS >> SQLite

क्या आइटम से जोड़ी गई डेटाबेस प्रविष्टियां बटन से हटाई जा सकती हैं?

वैकल्पिक उत्तर

निम्नलिखित एक बहुत ही बुनियादी, लेकिन काम करने वाले उदाहरण के लिए कोड है। हालांकि, ListView . को शामिल करके यह थोड़ा और आगे जाता है और ListView . में किसी आइटम को LongClick करके हटाने की अनुमति देना ।

हालांकि, यह अंशों का उपयोग नहीं करता है।

कोड के 3 भाग होते हैं, MainActivity (MainActivity.java ), SQLiteOpenHelper उपवर्ग CrimeDBHelper (CrimeDBHelper.java ) और MainActivity के लिए लेआउट, activity_main.xml :-

activity_main.xml

यह काफी सीधा-सादा है। ध्यान दें कि इसमें एक सूची दृश्य . शामिल है अंत में।

<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() , यह एक कर्सर लौटाता है जिसमें अपराध तालिका से सभी डेटा होता है (सूची दृश्य को पॉप्युलेट करने के लिए उपयोग किया जाता है)।

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 . का उपयोग करता है जोड़ी गई पंक्ति में दो बार (वास्तव में 3 बार जब यह डिलीट बटन टेक्स्ट को तदनुसार बदलता है )

    • lastcrimeid addCrime() . की वापसी से निर्धारित होता है विधि।
    • mDltCrime.setTag(lastcrimeid); हटाएं बटन का टैग _id . पर सेट करता है जोड़ी गई पंक्ति का।

    • यह भी ध्यान दें कि दो अतिरिक्त लाइनें मौजूद हैं, अर्थात् crimelist = dbhlpr.getCrimeList(); और sca.swapCursor(crimelist);

      • पहला कर्सर को अब डेटाबेस में मौजूद चीज़ों से बदल देता है (अर्थात जोड़ी गई पंक्ति को शामिल करता है), दूसरा ListView को नए कर्सर का उपयोग करने के लिए कहता है, इसलिए ListView को यह दिखाने का कारण बनता है कि डेटाबेस में अब क्या है ( पंक्ति को हटाते समय इसका पुन:उपयोग किया जाता है)।
    • डिलीट बटन के लिए बटन श्रोता को तब जोड़ा जाता है। यह दो तरह से काम कर सकता है। lastcrimeid उपयोग किया जा सकता है या वैकल्पिक रूप से बटन के टैग का उपयोग किया जा सकता है क्योंकि दोनों _id को होल्ड करते हैं हटाई जाने वाली पंक्ति का। कोड ने पूर्व टिप्पणी की है, इसलिए बाद वाली विधि का उपयोग किया जाता है (यानी बटन के टैग में मान पुनर्प्राप्त किया जाता है)।

      • ध्यान दें कि इस बाद वाली विधि का नुकसान यह है कि मान शून्य हो सकता है, जो एक शून्य सूचक अपवाद का कारण होगा, इसलिए if (view.getTag != null)
    • ListView . को रीफ़्रेश करने के लिए ऊपर के रूप में ।

    • अगला SimpleCursorAdapter सेटअप है, इसमें 5 पैरामीटर हैं:-

      • उपयोग किया जाने वाला लेआउट (android.R.layout.simple_list_item_1) एक स्टॉक लेआउट है।
      • कर्सर के रूप में उपयोग किया जाने वाला डेटा। टिप्पणी! _id . नामक कॉलम मौजूद होना चाहिए (आम तौर पर _id INTEGER PRIMARY KEY का हमेशा उपयोग करना एक अच्छा विचार है इस कारण से। ) ध्यान दें कि हमें एक कर्सर मिलता है crimelist getCrimeList . के माध्यम से विधि।
      • कर्सर में वह कॉलम जिससे डेटा पुनर्प्राप्त किया जाना है।
      • लेआउट में वह दृश्य जहां पुनर्प्राप्त डेटा रखा जाएगा।
      • एक मूल्य जिसका मुझे उद्देश्य याद नहीं है। हालांकि 0 का उपयोग करना ठीक है। इस 5वें पैरामीटर को कोड न करने से संभवतः पदावनत संदेश हो जाएगा।
      • (ध्यान दें कि मैं आमतौर पर कस्टम कर्सर एडेप्टर का उपयोग करता हूं क्योंकि वे बहुत अधिक लचीले होते हैं, इसलिए शायद ही कभी सिंपल का उपयोग करें)।
  • फिर ListView को mCrimeList.setAdapter(sca); के अनुसार एडेप्टर का उपयोग करने के लिए कहा जाता है ।

  • फिर एक onItemLongClickListener सूची दृश्य में जोड़ा जाता है, जो उस अपराध को हटा देगा जिस पर लंबे समय तक क्लिक किया गया था (लंबा l _id है) मान, इसलिए एक कारण है कि एक CursorAdapter को _id . की आवश्यकता क्यों है और इसलिए क्यों dbhlpr.deleteCrime(l); )।

    • फिर से सूची दृश्य ताज़ा किया जाता है।
  • अंत में, जैसा कि गतिविधि के उपयोग में रहने के दौरान कर्सर का उपयोग किया जाता है onDestory कर्सर को बंद करने के लिए विधि का उपयोग किया जाता है (समाप्त होने पर कर्सर हमेशा बंद रहना चाहिए)।

यह ऐसा दिखता है (सुंदर नहीं बल्कि कार्यात्मक), तीन अपराध जोड़े जाने के साथ (हटाएं बटन द क्राइम ऑफ द सेंचुरी को हटा देगा। अपराध)। किसी भी सूचीबद्ध अपराध को लंबे समय तक क्लिक करने से वह अपराध हट जाएगा। जब तक डेटा नहीं बदला जाता, तब तक ऐड क्लिक करने से क्राइम ऑफ द सेंचुरी के लिए एक और प्रविष्टि जुड़ जाएगी।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Android में PhoneGap/Cordova का उपयोग करके पहले से भरे हुए SQLite डेटाबेस तक नहीं पहुंच सकता

  2. Arraylist से Listview में SQLite db मान कैसे प्राप्त करें?

  3. जब पहली बार डेटाबेस खोलकर ऑनक्रिएट को ट्रिगर किया जाता है, तो SQLite हेल्पर ऑनक्रिएट से SQLite डेटाबेस नहीं खोल सकता

  4. संपादन टेक्स्ट और बटन का उपयोग करके डेटाबेस में डेटा संग्रहीत करना

  5. SQLiteOpenHelper onCreate विधि को कब कहा जाता है?