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