وارد کردن اطلاعات به دیتابیس 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 آشنا شدیم در جلسه بعد به نحوه حذف اطلاعات از دیتابیس می پردازیم. امیدواریم از این آموزش استفاده برده باشید. با ما همراه باشید.
لطفا سوالات و پیشنهادات خود را در قسمت دیدگاه ها با در میان بگذارید.
جناب مهندس آموزشتون خیلی روان و عالی بود دمتون گرم ان شاالله که به همین صورت ادامه دهید.
سلام و عرض ادب
در آینده نزدیک آموزش کامل مقدماتی تا فوق تخصصی اندروید روی سایت قرار خواهد گرفت…
با تشکر از همراهی شما
تشکر ، کاملا مشخصه که برای تهیه اموزش هاتون خیلی زحمت کشیدین
سلام با تشکر از توضیحات زیبا و روان شما
بنده هنگام کار با دیتابیس هنگامی که کد های وارد کردن اطلاعات دیتابیسو میزنم ، بعضی اوقات دیتابیس منفی یک بر میگردونه . خیلی از مواقع کار به درستی انجام میشه ولی بعضی وقتاهم دیتابیس منفی یکو برمیگردونه. کد های نوشته شده را چندیدن بار چک کردم و برنامه رو دیباگ هم میکنم ولی متاسفانه مشکل حل نمیشه ! موقع دیباگ کردن هم کاملا مشاهده میکنم که مقادیر Edit Text دقیقا با دیتابیس ایجاد شده جفت میشن و تو دیتابیس میشینه ولی موقع insert مقدار منفی یکو برمیگردونه ! چندیدن روزه که گیر این مشکل هستم اگه لطف کنید و بتونید کمکم کنید خیلی خیلی ممنونتون میشم .
سپاس از لطف شما و مطالب مفید وبسایتتون!
سلام و عرض ادب.
لطفا اطلاعات دقیق تری از پروژه و کدهای خود برای ما ارسال کنید تا بتونیم بررسی کنیم.
با تشکر از همراهی شما
خیلی روان و عالی با تشکر
مهندس جان خیلی خوب و با توضیحات کامل مبحث دیتابیس اندروید رو گفتین
هرچقد توی نت گشتم آموزش به این خوبی ندیدم
مرسی که وقت میذارین و این آموزش ها رو درست میکنید
سپاس فراوان
ممنون از زحمتی که کشیدید ! می دونم تولید محتوا با این جزئیات بسیار بسیار زمانبر است . درود بر شما
امیدوارم نتیجه ایی که از این کار مفید انتظار دارید حاصل بشه
خسته نباشید و دست مریزاد
با سلام , وقتی من دکمه save رو میزنم پیغام اطلاعات ذخیره نشد رو برای من نمایش میده به نظرتون مشکل چیه؟
سلام و عرض ادب. تمام کدها تست شده است لطفا در تایپ کدها و مراحل انجام آن دقت نمایید و اگر طبق آموزش ها جلو بروید نباید اشکالی وجود داشته باشد.
سلام خسته نباشید
توضیحات بسیار خوبی دادین من طبق اموزش نوشنم فقط لایه دریافت اطلاعاتم main activity نیست .اکتیویتی دیگری هست. اطلاعات رو به جدول اضافه نمی کنه و در logcat مینویسه همچین جدولی نیسن که بشه اطلاعات رو بهش اضافه کرد .چرا؟؟؟
مشکل منم همینه
سلام و عرض ادب.
لطفا در ساعت اداری با شماره ۰۹۱۰۲۵۷۳۲۵۳ تماس بگیرید تا به صورت ریموتی بررسی شود. قبل از تماس فیلترشکن و Anydesk اجرا کنید.
با عرض سلام و خسته نباشید.من تمام مراحل برایم درست انجام میشه و وقتی دکمه رو میزنم پیام ذخیره رو میده اما وقتی با navicat دیتابیسم رو باز میکنم نه جدولم ساخته شده و نه اثری از داده هام هست
سلام و عرض ادب. سوال شما خیلی کلی هست و نمی توان بدون دیدن کدهای شما نظری داد و ضمناً کدها و آموزشهایی که بر روی سایت قرار گرفته تماماً تست شده است. پس حتما در کدهایی که نوشته اید مشکلی وجود دارد. در صورتی که بعد از چک نهایی توسط شما مشکل پابرجا بود با شرکت تماس بگیرید تا کارشناسان مشکل را به صورت ریموتی بررسی نمایند.
با عرض سلام و خسته نباشید. من کدها رو دقیقا طبق اموزش ها نوشتم ولی وقتی اجرا میکنم پیام مربوط به این که اطلاعات ذخیره نشده را نمایش میده نمیدونم چرا؟
سلام و عرض ادب. تمام کدها تست شده اند و نباید مشکلی داشته باشه. لطفا با دقت تما کدها رو چک کنید و در صورتی که مشکل حل نشد در ساعت اداری با شرکت تماس بگیرید تا مشکل شما به صورت ریموتی بررسی شود.
بسیار عالی بود بسیار روان اموزش دادید توضیحات عالی بود
سلام و عرض ادب. از ارسال نظر شما و انرژی مثبتی که به تیم داژیار دادید ممنونیم.
با تشکر از همراهی شما
سلام لطفا در مورد اینکه چه جوری دو تا جدول داخل دیتابیس درست کنیم هم یه توضیحی بدید . ممنون
واقعا دمتون گرم
خیلی دنبال یه آموزش ساده و روون بودم
چرا من تا getWritableDatabase وارد میکنم اررور میده؟
Cannot resolve method ‘getWritableDatabase’ in ‘MainActivity’
سلام خسته نباشید، تو یه قسمت گفتین اگه نوع داده ستون string باشه باید با کلمه TEXTنوع داده رو مشخص کنیم ، اگه نوع داده ستون boolean باشه باید به چه صورت نوشته بشه ؟
سلام
من مراحل را مثل تو ضیحات بالا دنبال و پیاده سازی کردم اما هنگام اجرای برنامه خروجی میگه برنامه متوقف شد
سلام و عرض ادب. تمام کدهای قرار داده شده در سایت قبلا تست شده و مشکلی نداشته است. لطفا در تایپ دستورات دقت فرمایید.
با تشکر از همراهی شما
تابع onclickکامل وایدی به باتن هم باید نوشته بشه
(public void onBtnSaveClick(View v
تابع onclickکامل وایدی به باتن هم باید نوشته بشه
(public void onBtnSaveClick(View v
Button b = (Button) findViewById(R.id.button1);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(Activity1.this, Activity2.class));
}
});
تابع Onclick
Button b = (Button) findViewById(R.id.button1);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// your code
}
});
با سلام ممنون از توضیحات عالیتون
من تقریبا کد هایی که شما نوشتین رو وارد کردم اما پیغام ذخیره نشد رو میده
ممکنه راهنمایی کنین؟