وارد کردن اطلاعات به دیتابیس SQLite –دستور insert

با نام و یاد خدا
در جلسه پیش با دیتابیس SQLite آشنا شدیم و نحوه ایجاد پایگاه داده و ساخت جدول را کار کردیم . در این جلسه قصد داریم با آموزش وارد کردن اطلاعات به دیتابیس SQLite در خدمت شما باشیم.

توجه: توصیه می شود آموزش جلسه قبل را مطالعه کنید تا برای آموزش این جلسه آماده باشید.

جلسه قبل یک کلاس myDatabaseHelper  ایجاد کردیم و کدهای زیر را در آن قرار دادیم :

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class myDatabaseHelper extends SQLiteOpenHelper{

public static final String DB_NAME=“uni.db”;
public static final String TBL_NAME=“stu”;

//تابع سازنده
public myDatabaseHelper(Context context) {
super(context, DB_NAME, null, 1);
SQLiteDatabase db=this.getWritableDatabase();
}

//تابع onCreate
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(” CREATE TABLE ” + TBL_NAME + “(Id INTEGER PRIMARY KEY AutoIncrement , name TEXT , LastName TEXT)”);
}

//تابع به روزرسانی
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(” DROP TABLE IF EXISTS ” + TBL_NAME);
onCreate(db);

}

}

سپس این کلاس را در MainActivity فراخوانی کردیم. تا اینجای کار یک دیتابیس با نام uni.db ایجاد کردیم و یک جدول با نام stu که شامل سه ستون با شناسه های id،name، Last می باشد. حالا می خواهیم اطلاعات را داخل این جدول ثبت کنیم.

ایجاد layout مناسب

برای وارد کردن اطلاعات به جدول ، ابتدا یک layout برای تعامل با کاربر طراحی می کنیم تا کاربر نام و نام خانوادگی خود را وارد کند.

  • برای ایجاد layout روی res->layout کلیک می کنیم و  activity_main.xml‌ را انتخاب می کنیم در قسمت Design  شروع به ایجاد layout می کنیم.
  • یک plain text برای وارد کردن نام انتخاب می کنیم و روی صفحه گوشی رها می کنیم. از کادر سمت راست قسمت Attributes ،مشخصات این آبجکت را مشخص می کنیم. ما فقط دو مشخصه زیر را تغییر دادیم

ID: fname

 نام را وارد کنید:hint

  • یک plain text دیگر برای وارد کردن نام خانوادگی قرار می دهیم با تغییر مشخصات زیر:

ID: lastname

hint: نام خانوادگی را وارد کنید

  • حالا یک button را انتخاب می کنیم و روی صفحه قرار می دهیم . زمانی که کاربر نام و نام خانوادگی خود را وارد کرد و روی این دکمه کلیک کرد اطلاعات در دیتابیس ذخیره شود:

ID: btnsave

onClick: onBtnSaveClick ( مدیریت رویدادها را در جلسه 11 آموزش دادیم)

text: ذخیره

با قرار دادن این آبجکت ها ، یک سری کد در قسمت text ایجاد می شوند که به صورت زیر می باشد:

<?xml version=”1.0″ encoding=”utf-8″?>
<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
    xmlns:app=”http://schemas.android.com/apk/res-auto”
    xmlns:tools=”http://schemas.android.com/tools”
    android:layout_width=”match_parent”
    android:layout_height=”match_parent”
    tools:context=”.MainActivity”>

    <EditText
        android:id=”@+id/fname”
        android:layout_width=”wrap_content”
        android:layout_height=”wrap_content”
        android:layout_alignParentTop=”true”
        android:layout_centerHorizontal=”true”
        android:layout_marginTop=”84dp”
        android:ems=”10″
        android:hint=”نام را وارد کنید”
        android:inputType=”textPersonName” />

    <EditText
        android:id=”@+id/Lastname”
        android:layout_width=”wrap_content”
        android:layout_height=”wrap_content”
        android:layout_alignParentTop=”true”
        android:layout_centerHorizontal=”true”
        android:layout_marginTop=”139dp”
        android:ems=”10″
        android:hint=”نام خانوادگی را وارد کنید”
        android:inputType=”textPersonName” />

    <Button
        android:id=”@+id/btnsave”
        android:layout_width=”wrap_content”
        android:layout_height=”wrap_content”
        android:layout_alignParentTop=”true”
        android:layout_centerHorizontal=”true”
        android:layout_marginTop=”217dp”
        android:onClick=”onBtnSaveClick”
        android:text=”ذخیره” />

</RelativeLayout>

نکته: توجه داشته باشید که این آبجکت ها را بین دو تگ RelativeLayout قرار می دهیم (طبق آموزش جلسه نهم)

 

ایجاد دستور insert برای دیتابیس

خب حالا وقت آن رسیده که کدی بنویسیم تا اطلاعاتی که کاربر وارد می کند در جدول stu قرار بگیرد.

  • در myDatabaseHelper  ادامه توابعی که در جلسه پیش ایجاد کردیم یک تابع جدید با نام دلخواه insertData ایجاد می کنیم. مقدار برگشتی این تابع  Boolean می باشد و دو ورودی string n برای نام و string m برای نام خانوادگی دریافت می کند.

تابع کلی به صورت زیر می باشد :

//تابع اضافه کردن
public boolean insertData(String n,String m){

//دیتابیس قابل نوشتن می شود
SQLiteDatabase db=this.getWritableDatabase();

//برای ایجاد جفت مقدار و شناسه ستون
ContentValues cv=new ContentValues();
cv.put(“name”,n);
cv.put(“LastName”,m);

//وارد کردن اطلاعات به دیتابیس
long result=db.insert(TBL_NAME,null,cv);

//بررسی وارد شدن اطلاعات به دیتابیس
if(result==-1)
    return false;
else
    return true;
}

توضیح کدهای بالا:

  •  یک خط کد در جلسه قبل در تابع سازنده نوشتیم که دیتابیس را قابل نوشتن می کرد ؛ آن را کات کنید و در تابع insertData قرار دهید.
  • یک شی از نوع contentValues تعریف می کنیم با نام دلخواه cv:

ContentValues cv=new ContentValues();

contentValues چه کاربردی دارد؟ شی ای که از نوع contentValues ایجاد کردیم جفت های (key/value) را ایجاد می کند یعنی شناسه ی ستون جدول و مقدار آن را کنار هم قرار می دهد.

  • پس باید با کمک شی cv مقادیری که کاربر وارد می کند را به ستون مربوط به خودشون ربط دهیم برای این کار از متد put استفاده می کنیم. به شکل زیر:

cv.put(“name”,n);
cv.put(“Last”,m);

مثلا نام “علی” که توسط کاربر وارد شده  با ستون name جفت می کند و نام خانوادگی “دهقان” را با ستون Last .

  • سپس با کمک تابع insert جفت های (key/value) که توسط شی cv ایجاد شده است را به جدول TBL_NAME (که همان stu می باشد) می دهیم.

db.insert(TBL_NAME,null,cv);

  • مقدار برگشتی تابع insert را داخل یک متغیر به نام result می ریزیم تا بررسی کنیم که آیا تابع insertData توانسته اطلاعات را وارد کند یا خیر؟ اگر وارد شده true برگرداند و اگر خیر false.

long result=db.insert(TBL_NAME,null,cv);
if(result==-1)
    return false;
else
    return true;

از کجا فهمیدیم که مقدار برگشتی تابع insert از نوع long می باشد؟؟؟

برای اینکه مقدار برگشتی یک تابع را متوجه شوید روی اسم آن راست کلیک کنید و گزینه Go To و سپس Declaration را انتخاب کنید تا این تابع را به صورت گسترده ببینید، همانطور که در تصویر می بینید مقدار برگشتی آن از نوع long می باشد و اگر نتواند وظیفه اش را انجام دهد 1- را بر می گرداند.

کدنویسی در کلاس MainActivty

خب تا اینجا تابع insertData را در کلاس myDatabaseHelper  نوشتیم حالا سه کار اصلی مانده که باید در کلاس MainActivty انجام دهیم:

  • یکی باید این تابع را فراخوانی کنیم.
  • اطلاعات وارد شده توسط کاربر (در کادرهایی که در قسمت layout طراحی کردیم ) در ورودی تابع insertData قرار بگیرند.
  • دکمه ذخیره که زده می شود اطلاعات وارد دیتابیس شود و یک پیغام بدهد که آیا اطلاعات به درستی وارد جدول شد یا خیر.

 

فراخوانی تابع insertData در کلاس MainActivity

کدهای کلاس MainActivity به صورت کامل ببینید تا در ادامه توضیح دهیم:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

//تعریف متغیرها
    myDatabaseHelper mydb;
    EditText fn,Ln;
    String mes=””;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//ایجاد شی
         mydb=new myDatabaseHelper(this);
    }

//ایجاد تابع برای کلیک کردن روی دکمه ذخیره
    public void onBtnSaveClick(View v){

//نسبت دادن شی به متغیر در اکتیویتی
        fn=findViewById(R.id.fname);
        Ln=findViewById(R.id.lname);

//تبدیل به string
String f=fn.getText().toString();

        String l=Ln.getText().toString();

//شرط برای خالی بودن ورودی ها
       if(f.length()<1){
            fn.setHint(“نام وارد نشده است”);
             return;
         }

        if(l.length()<1){
           Ln.setHint(“نام خانوادگی وارد نشده است”);
           return;
        }

//دادن متغیرها به ورودی تابع insertData
        boolean a= mydb.insertData(f,l);
        if(a==true)
            mes=”اطلاعات ذخیره شد”;
        else
            mes=”اطلاعات ذخیره نشد”;
//نمایش پیغام
        Toast.makeText(MainActivity.this,mes,Toast.LENGTH_LONG).show();

    }
}

توضیح کدهای کلاس MainActivity

برای فراخوانی کلاس باید شی بسازیم.که در جلسه قبل گفتیم چطوری از کلاس myDatabaseHelper  شی بسازیم.

  • داخل کلاس و خارج از توابع ها یک متغیر از نوع کلاس myDatabaseHelper ایجاد می کنیم:

myDatabaseHelper mydb;

  • داخل تابع onCreate شی را می سازیم و ورودی آن را this می دهیم. :

mydb=new myDatabaseHelper(this);

همانطور که در جلسات قبل گفتیم باید به اشیایی که در layout قرار دادیم در اکتیویتی دسترسی داشته باشیم تا بتوانیم منطق های خود را روی هر شی ای( مثلا دکمه ) اعمال کنیم.

  • دو متغیر از نوع EditText تعریف می کنیم با نام های دلخواه fn  و ln :

EditText fn,Ln;

  • خصوصیت onClick دکمه را onBtnSaveClick قرار دادیم (طبق آموزش مدیریت Eventها) پس اینجا بعد از تابع onCreate یک تابع با نام onBtnSaveClick ایجاد می کنیم .و یک ورودی از نوع Veiw میگیرد.

public void onBtnSaveClick(View v){
}

  • درون این تابع شی های موجود در layout را به متغیر fn و ln نسبت می دهیم با کمک id هاشون.

fn=findViewById(R.id.fname);
Ln=findViewById(R.id.lname);

  • می خواهیم مقادیر fn و ln که توسط کاربر وارد می شود را به عنوان ورودی به تابع insertData بدهیم پس لازم است به string تبدیل شوند.

String f=fn.getText().toString();
String l=Ln.getText().toString();

  • نکته: می توانیم با یک شرط تعیین کنیم که اگر اطلاعات توسط کاربر وارد نشده است، یک پیغام hint نمایش بدهد مثلا:

if(f.length()<1){
   fn.setHint(“نام وارد نشده است”);
   return;
}

if(l.length()<1){
  Ln.setHint(“نام خانوادگی وارد نشده است”);
  return;
}

  • حالا f و l که همان نام و نام خانوادگی است و توسط کاربر وارد شده است را به عنوان ورودی به تابع insertData می دهیم تا توسط contentValues در ستون های مربوط به خود در جدول قرار بگیرند.

mydb.insertData(f,l);

  • مقدار برگشتی تابع insertData که از نوع Boolean تعریف کردیم را به متغیر a می دهیم و می گوییم اگر a =true بود یعنی اطلاعات توسط تابع insert وارد شده و اگر false بود یعنی اطلاعات به هر دلیلی در جدول ذخیره نشده است.

boolean a= mydb.insertData(f,l);
        if(a==true)
            mes=”اطلاعات ذخیره شد”;
        else
            mes=”اطلاعات ذخیره نشد”;

توجه: متغیر mes را از نوع string داخل کلاس تعریف کردیم.

  • برای نمایش پیغام از دستور Toast استفاده می کنیم. در این دستور می توانیم متن پیغام ، مدت زمان نمایش و مکان نمایشش را مشخص کنیم.

Toast.makeText(context,”Your Text”, duration).show();

Toast.makeText(MainActivity.this,mes,Toast.LENGTH_LONG).show();

 

کلاس myDatabaseHelper:

کلاس MainActivity:

اجرای برنامه

می توانید برنامه را با Genymotion اجرا کنید. وقتی نام و نام خانوادگی را وارد می کنید و دکمه ذخیره اطلاعات را می زنید؛ می بینید که پیغام ذخیره اطلاعات ظاهر شده است.

نکته: دیتابیس ساخته شده را به همان روشی که در جلسه قبل گفتیم پیدا کنید و ذخیره کنید و در نرم افزار Navicat باز کنید. تا اطلاعاتی که وارد شده را ببینید.

در این جلسه با وارد کردن اطلاعات به دیتابیس SQLite آشنا شدیم در جلسه بعد به نحوه حذف اطلاعات از دیتابیس می پردازیم. امیدواریم از این آموزش استفاده برده باشید. با ما همراه باشید.

لطفا سوالات و پیشنهادات خود را در قسمت دیدگاه ها با در میان بگذارید.

مدرس: مهندس مهدی نیکخواه

 

به این مقاله چند تا ستاره میدی؟
[تعداد رای: 34 امتیاز: 4.4]