अब मैं उन सूचीदृश्य को नए अपडेटएक्टिटी में चयनित मान प्राप्त करना चाहता हूं ताकि मैं संपादित या हटा सकूं। यह कैसे करें।
यहां एक कार्यशील उदाहरण दिया गया है जो अपडेट करता है (अपडेटएक्टिविटी पर जाता है) और हटाता है (किसी आइटम के लॉन्ग क्लिक पर)। यह एक CursorAdapter, अर्थात् स्टॉक SimpleCursorAdapter का उपयोग करता है। SQLite डेटा के लिए कर्सर एडेप्टर का उपयोग करना बहुत आसान है।
सबसे पहले डेटाबेस हेल्पर :-
class DatabaseHelper extends SQLiteOpenHelper {
public DatabaseHelper(@Nullable Context context) {
super(context, "mydatabase", null, 1);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS mytable (_id INTEGER PRIMARY KEY, name TEXT, surname TEXT, phone TEXT)");
/* Add some test data */
add("Fred","Bloggs","0000000000",sqLiteDatabase);
add("Jane","Doe","1111111111",sqLiteDatabase);
add("Mary","Johnston","2222222222",sqLiteDatabase);
add("Tom","cobboly","3333333333",sqLiteDatabase);
add("Anne","Walker","4444444444",sqLiteDatabase);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
public long update(long id, String name, String surname, String phone) {
long rv = 0;
ContentValues cv = new ContentValues();
if (name != null && name.length() > 0) cv.put("name",name);
if (surname != null && surname.length() > 0) cv.put("surname",surname);
if (phone != null && phone.length() > 0) cv.put("phone",phone);
if (cv.size() > 0) rv = this.getWritableDatabase().update("mytable",cv,"_id=?",new String[]{String.valueOf(id)});
return rv;
}
public long delete(long id) {
return this.getWritableDatabase().delete("mytable","_id=?",new String[]{String.valueOf(id)});
}
public Cursor getAll() {
return this.getWritableDatabase().query("mytable",null,null,null,null,null,null);
}
public Cursor getById(long id) {
return this.getWritableDatabase().query("mytable",null,"_id=?",new String[]{String.valueOf(id)},null,null,null);
}
private long add(String name, String surname, String phone, SQLiteDatabase db) {
ContentValues cv = new ContentValues();
cv.put("name",name);
cv.put("surname",surname);
cv.put("phone",phone);
return db.insert("mytable",null,cv);
}
public long add(String name, String surname, String phone) {
return add(name,surname,phone,this.getWritableDatabase());
}
}
- महत्वपूर्ण नोट कर्सर एडेप्टर को एक आईडी कॉलम की आवश्यकता होती है और इसका नाम _id . होना चाहिए ।
- ध्यान दें यह कुछ परीक्षण डेटा जोड़ता है।
- सभी एक्सेस विधियां शामिल हैं
- getAll तालिका से सभी पंक्तियों के साथ एक कर्सर लौटाता है।
- अपडेट किए गए मानों के अनुसार अपडेट अपडेट करें, यह केवल मानों को अपडेट करने के लिए पूरा करता है (उदाहरण के लिए कोई संपादन उपनाम एडिटटेक्स्ट नहीं है, नल पास हो गया है इसलिए उपनाम वैसे ही रहता है।)
- getById आईडी के अनुसार सभी मानों वाला एक कर्सर लौटाता है
- चौथे पैरामीटर के बिना जोड़ना सामान्य जोड़ है, चौथा पैरामीटर वाला यह है कि DatabaaeHelper के पूरी तरह से इंस्टेंट होने से पहले इसे onCreate में उपयोग करने की अनुमति दी जाए।
ListDataActivity
public class ListDataActivity extends AppCompatActivity {
ListView listview;
SimpleCursorAdapter sca;
DatabaseHelper databaseHelper;
Cursor cursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = this.findViewById(R.id.mylistview);
databaseHelper = new DatabaseHelper(this);
setOrRefreshListView();
}
/* handles the ListView */
private void setOrRefreshListView() {
cursor = databaseHelper.getAll(); /* Gets the data to be listed */
/* If first time then setup the adapter listeners etc */
if (sca == null) {
sca = new SimpleCursorAdapter(
this,
android.R.layout.simple_expandable_list_item_2,
cursor,
new String[]{"name","phone"},
new int[]{android.R.id.text1, android.R.id.text2},
0
);
listview.setAdapter(sca); // attach the adapter to the listview
// setup On Item Click to start the update activity passing the id
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent intent = new Intent(ListDataActivity.this,UpdateActivity.class);
intent.putExtra("my_id_extra",l);
startActivity(intent);
}
});
// setup the on Item LONG Click to delete a row
listview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
databaseHelper.delete(l);
setOrRefreshListView(); // after deletion refresh the data
return true;
}
});
} else {
sca.swapCursor(cursor); // if not the first time just tell the adapter the data has changed
}
}
@Override
protected void onResume() {
super.onResume();
setOrRefreshListView(); // refresh the listview when returning to the activity
}
@Override
protected void onDestroy() {
super.onDestroy();
cursor.close(); // clean up
}
}
ListDataActivity के लिए लेआउट (बहुत ही बुनियादी सिर्फ एक ListView) :-
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ListDataActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<ListView
android:id="@+id/mylistview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/teal_200"
>
</ListView>
</LinearLayout>
- पृष्ठभूमि सेट ताकि सूची दृश्य को देखना आसान हो।
अपडेट गतिविधि :-
public class UpdateActivity extends AppCompatActivity {
DatabaseHelper databaseHelper;
EditText editName, editPhone;
Button saveButtonId,showButtonId;
long currentId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_update);
editName = this.findViewById(R.id.editName);
editPhone = this.findViewById(R.id.editPhone);
saveButtonId = this.findViewById(R.id.savebuttonId);
showButtonId = this.findViewById(R.id.showbuttonId);
databaseHelper = new DatabaseHelper(this);
currentId = this.getIntent().getLongExtra("my_id_extra",-1);
if (currentId < 0 ) {
// do something as invalid id passed
finish();
}
showData();
showButtonId.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
saveButtonId.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
databaseHelper.update(currentId,editName.getText().toString(),null,editPhone.getText().toString());
}
});
}
private void showData() {
Cursor cursor = databaseHelper.getById(currentId);
if (cursor.moveToFirst()) {
editName.setText(cursor.getString(cursor.getColumnIndex("name")));
editPhone.setText(cursor.getString(cursor.getColumnIndex("phone")));
}
cursor.close();
}
}
- शोडेटा बटन ListDataActivity पर वापस आ जाता है (मेरा मानना है कि आप यही चाहते थे)।
परिणाम :-
- नई शुरुआत कब हुई :-
-
मैरी पर क्लिक करें (और नंबर को 999999999 में एडिट करें लेकिन सेव नहीं करें) :-
-
सहेजें पर क्लिक करें (2 के समान)
-
दिखाएँ क्लिक करें :-
- लॉन्ग क्लिक फ्रेड :-
- ऐप को रीस्टार्ट करें:-