عملیات CRUD در اندروید با استفاده از دیتابیس SQLite و کلاس SqliteOpenHelper ، در هر پلتفرم برنامه نویسی ما ۴ عمل اصلی برای اعمال برروی داده های خود داریم که شامل Create ، Read ، Update و Delete می باشد.
در این پست از تجاری اپ ما عملیات CRUD در اندروید را با استفاده از کلاس SqliteOpenHelper که برای ارتباط با دیتابیس داخلی اندروید Sqlite است انجام خواهیم داد.با زبان های جاوا و کاتلین
ما یک کلاس model داریم که تمامی عملیات را با این کلاس انجام خواهیم داد.
توجه:
کلاس مدل درواقع همان کلاسی است که داده های دریافتی از sqlite را می توان در قالب این کلاس استفاده کرد.
کلاس مدل ما بدین صورت است:
همچنین بخوانید: معرفی نرم افزار مدیریت پایگاه داده SQLite Maestro
جاوا
public class items {
int id;
String desc;
String alarm;
String time;
public items(int id, String desc , String alarm , String time){
this.id = id;
this.desc = desc;
this.alarm = alarm;
this.time = time;
}
}
کاتلین
class Item() {
var id: Int = 0;
var desc: String = "";
var time: String = "";
var alaram: String = "";
constructor( id: Int, desc: String, time: String, alarm: String) : this() {
this.id = id
this.desc = desc
this.time = time
this.alaram = alaram
}
}
حال یک کلاس ایجاد میکنیم که از کلاس SQLiteOpenHelper ارث بری میکند که تمامی عملیات اصلی درون این کلاس انجام خواهد شد.معرفی کلاس بدین صورت خواهد شد:
جاوا
public class ItemsDatabaseHelper extends SQLiteOpenHelper {
public itemsdbh(@Nullable Context context) {
// Database Info
private static final String DATABASE_NAME = "postsDatabase";
private static final int DATABASE_VERSION = 1;
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
کاتلین
public class ItemsDatabaseHelper(val context: Context, val dbName:String, val version: Int)
: SQLiteOpenHelper(context,dbName,null,version) {
زمان ارث بری از کلاس SQLiteOpenHelper دو متد باید حتما override شوند که شامل onCreate و onUpgrade است.برای ساخت و آپدیت دیتابیس:
جاوا
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
String CREATE_USERS_TABLE = "CREATE TABLE " + TABLE_ITEMS +
"(" +
KEY_ITEM_ID + " INTEGER PRIMARY KEY," +
KEY_ITEM_DESC + " TEXT," +
KEY_ITEM_TIME + " TEXT," +
KEY_ITEM_ALARM + " TEXT," +
")";
sqLiteDatabase.execSQL(CREATE_USERS_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion != newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_ITEMS);
onCreate(db);
}
}
کاتلین
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
if (oldVersion != newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_ITEMS);
onCreate(db);
}
}
override fun onCreate(db: SQLiteDatabase) {
val CREATE_USERS_TABLE = "CREATE TABLE " + TABLE_ITEMS +
"(" +
KEY_ITEM_ID + " INTEGER PRIMARY KEY," +
KEY_ITEM_DESC + " TEXT," +
KEY_ITEM_ALARM + " TEXT," +
KEY_ITEM_TIME + " TEXT" +
")"
db.execSQL(CREATE_USERS_TABLE)
}
در ادامه عملیات CRUD در اندروید را پیاده سازی کرده ایم.
ما در متد زیر یک رکورد به جدول اضافه کردیم
همچنین بخوانید: آموزش بانک اطلاعاتی SQLite در اندروید
جاوا
public void addItem(Item item) {
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
try {
ContentValues values = new ContentValues();
values.put(KEY_ITEM_ID , item.id);
values.put(KEY_ITEM_DESC , item.desc);
values.put(KEY_ITEM_TIME , item.time);
values.put(KEY_ITEM_ALARM, item.alarm);
db.insertOrThrow(TABLE_ITEMS, null, values);
db.setTransactionSuccessful();
} catch (Exception e) {
Log.d(TAG, "Error while trying to add post to database");
} finally {
db.endTransaction();
}
}
کاتلین
public fun addItem(item: Item){
val db = writableDatabase
db.beginTransaction()
val values= ContentValues()
values.put(KEY_ITEM_ID , item.id)
values.put(KEY_ITEM_DESC , item.desc)
values.put(KEY_ITEM_TIME , item.time)
values.put(KEY_ITEM_ALARM, item.alaram)
db.insertOrThrow(TABLE_ITEMS,null,values)
db.setTransactionSuccessful()
}
همانطور که مشخصه ابتدا یک آبجکت از نوع کلاس writableDatabase ایجاد کردیم و با دستور beginTransaction متغیر را به نوعی فعال میکنیم ،سپس مقادیر مورد نیاز را با کلاس ContentValues ایجاد میکنیم و درنهایت با دستور insert رکورد را ایجاد میکنیم.
با متد زیر ما تمامی اطلاعات درون جدول را میخوانیم و درقالب لیستی از نوع کلاس مدل برمی گردانیم
جاوا
public List getAllItems() {
List list = new ArrayList<>();
String itemQuery = String.format(
"SELECT * FROM %s ",
TABLE_ITEMS
);
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery(itemQuery, null);
try {
if (cursor.moveToFirst()) {
do {
Item newPost = new Item();
newPost.id= cursor.getInt(cursor.getColumnIndex(KEY_ITEM_ID));
newPost.desc= cursor.getString(cursor.getColumnIndex(KEY_ITEM_DESC));
newPost.time= cursor.getString(cursor.getColumnIndex(KEY_ITEM_TIME));
newPost.alarm= cursor.getString(cursor.getColumnIndex(KEY_ITEM_ALARM));
list.add(newPost);
} while(cursor.moveToNext());
}
} catch (Exception e) {
Log.d(TAG, "Error while trying to get posts from database");
} finally {
if (cursor != null && !cursor.isClosed()) {
cursor.close();
}
}
return list;
}
کاتلین
public fun getAllItems(): List{
val list = ArrayList()
val itemQuery = String.format(
"SELECT * FROM %s ",
TABLE_ITEMS
)
val db = readableDatabase
val cursor = db.rawQuery(itemQuery, null)
try {
if (cursor!!.moveToFirst()) {
do {
val newPost = Item()
newPost.id= cursor.getInt(cursor.getColumnIndex(KEY_ITEM_ID))
newPost.desc= cursor.getString(cursor.getColumnIndex(KEY_ITEM_DESC))
newPost.time= cursor.getString(cursor.getColumnIndex(KEY_ITEM_TIME))
newPost.alaram= cursor.getString(cursor.getColumnIndex(KEY_ITEM_ALARM))
list.add(newPost)
} while (cursor.moveToNext())
}
} catch (e: Exception) {
Log.d(TAG, "Error while trying to get posts from database")
} finally {
if (cursor != null && !cursor.isClosed) {
cursor.close()
}
}
return list
}
در متد بالا ما کوئری Select را از جدولی که در متد onCreate ایجاد کردیم نوشتیم و با استفاده از cursor به تمامی رکوردها اشاره میکنیم و داده هارا دریافت می کنیم.در نهایت تمامی داده ها که درون list اضافه یا add شده را بر میگردانیم.
در متد زیر ما یک رکورد از جدول را براساس id آن Update میکینم.
همچنین بخوانید: آموزش گام به گام عملیات CRUD با لاراول 5.8
جاوا
public int updateUserProfilePicture(Item item) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_ITEM_ID , item.id);
values.put(KEY_ITEM_DESC , item.desc);
values.put(KEY_ITEM_TIME , item.time);
values.put(KEY_ITEM_ALARM, item.alarm);
return db.update(TABLE_ITEMS, values, KEY_ITEM_ID + " = ?",
new String[] { String.valueOf(item.id) });
}
کاتلین
public fun updateItem(item : Item): Int{
val db = this.writableDatabase
val values = ContentValues()
values.put(KEY_ITEM_DESC, item.desc)
values.put(KEY_ITEM_TIME, item.time)
values.put(KEY_ITEM_ALARM, item.alaram)
return db.update(
TABLE_ITEMS, values, KEY_ITEM_ID + " = ?", arrayOf(item.id.toString())
)
}
عملیات بروزرسانی یا آپدیت کمی شبیه به عمل Create است چرا که مقادیر را با ContentValues به دیتابیس اعمال میکنیم.
البته براساس آیدی آیتم که در where معرفی شده.
در این عملیات ما میتوانیم یا داده کل جدول را پاک کنیم و یا یک رکورد براساس آیدی آن
جاوا
public int deleteItem(Item item){
SQLiteDatabase db = getWritableDatabase();
return db.delete(
TABLE_ITEMS, KEY_ITEM_ID + " = ?", new String[]{String.valueOf(item.id)});
}
کاتلین
public fun deleteItem(item: Item): Int{
val db = this.writableDatabase
return db.delete(
TABLE_ITEMS, KEY_ITEM_ID + " = ?", arrayOf(item.id.toString())
)
}
در متد فوق ما تنها یک آیتم را براساس id آن حذف کردیم.و در متد زیر تمامی داده هارا پاک میکنیم:
جاوا
public void deleteAllItems() {
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
try {
db.delete(TABLE_ITEMS, null, null);
db.setTransactionSuccessful();
} catch (Exception e) {
Log.d(TAG, "Error while trying to delete all posts and users");
} finally {
db.endTransaction();
}
}
کاتلین
fun deleteAllItems() {
val db = writableDatabase
db.beginTransaction()
try {
db.delete(TABLE_ITEMS, null, null)
db.setTransactionSuccessful()
} catch (e: Exception) {
Log.d(TAG, "Error while trying to delete all posts and users")
} finally {
db.endTransaction()
}
}
امیدوارم این آموزش برای شما مفید بوده باشه…