نمایش عکس در فلاتر Flutter به دو روش آفلاین و آنلاین
نمایش عکس در فلاتر Flutter به دو روش آفلاین و آنلاین
2019-10-08
طراحی با نرم افزار Figma در لینوکس ، مک و ویندوز
طراحی با نرم افزار Figma در لینوکس ، مک و ویندوز
2019-10-18
آموزش عملیات CRUD با استفاده از دیتابیس SQLite و کلاس SqliteOpenHelper در اندروید

آموزش عملیات CRUD با استفاده از دیتابیس SQLite و کلاس SqliteOpenHelper در اندروید

عملیات CRUD در اندروید با استفاده از دیتابیس SQLite و کلاس SqliteOpenHelper ، در هر پلتفرم برنامه نویسی ما ۴ عمل اصلی برای اعمال برروی داده های خود داریم که شامل Create ، Read ، Update و Delete می باشد.

آموزش عملیات CRUD با استفاده از دیتابیس SQLite و کلاس SqliteOpenHelper در اندروید

در این پست از تجاری اپ ما عملیات CRUD در اندروید را با استفاده از کلاس SqliteOpenHelper که برای ارتباط با دیتابیس داخلی اندروید Sqlite است انجام خواهیم داد.با زبان های جاوا و کاتلین

ما یک کلاس model داریم که تمامی عملیات را با این کلاس انجام خواهیم داد.

توجه:
کلاس مدل درواقع همان کلاسی است که داده های دریافتی از sqlite را می توان در قالب این کلاس استفاده کرد.

کلاس مدل ما بدین صورت است:

جاوا

 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)
}

پیاده سازی 4 عمل Create ، Read ، Update و Delete در اندروید

در ادامه عملیات CRUD در اندروید را پیاده سازی کرده ایم.

عمل Create

ما در متد زیر یک رکورد به جدول اضافه کردیم

جاوا

  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 رکورد را ایجاد میکنیم.

عمل Read

با متد زیر ما تمامی اطلاعات درون جدول را میخوانیم و درقالب لیستی از نوع کلاس مدل برمی گردانیم

جاوا

 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 &amp;&amp; !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 &amp;&amp; !cursor.isClosed) {
            cursor.close()
        }
    }
    return list
}

در متد بالا ما کوئری Select را از جدولی که در متد onCreate ایجاد کردیم نوشتیم و با استفاده از cursor به تمامی رکوردها اشاره میکنیم و داده هارا دریافت می کنیم.در نهایت تمامی داده ها که درون list اضافه یا add شده را بر میگردانیم.

عمل Update

در متد زیر ما یک رکورد از جدول را براساس id آن Update میکینم.

جاوا

 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 معرفی شده.

عمل Delete

در این عملیات ما میتوانیم یا داده کل جدول را پاک کنیم و یا یک رکورد براساس آیدی آن

جاوا

      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()
         }
     }

امیدوارم این آموزش برای شما مفید بوده باشه…

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *