آموزش قرار دادن داده از sqlite در spinner
سلام دوستان در این سری از آموزش برنامه نویس اندروید به آموزش قرار دادن داده از sqlite در spinner می پردازیم در مطالب قبلی به خواندن json و قرار دادن در spinner پرداختیم در این جلسه ابتدای داده ها را از دیتابیس sqlite می خوانیم سپس در spinner قرار می دهیم یا همان populate می کنیم در ادامه با ما همراه باشید.
در این آموزش ما دوتا spinner داریم که یکش فقط داده ها در آن لود می شوند ولی دومی با انتخاب هر کدام از آیتم های spinner دادهای دیگر نیز از دیتابیس fetch می شوند.
در ابتدای کار در layout اصلی که در اینجا نام آن برابر با activity_main.xml است کد های زیر را قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Spinner android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/spinStudent_Simple" android:layout_below="@+id/tvSpinner" android:layout_alignParentStart="true" /> <Spinner android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/spinStudent" android:layout_below="@+id/tvStudent" android:layout_alignParentStart="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Spinner Simple" android:id="@+id/tvSpinner" android:layout_alignParentTop="true" android:layout_alignParentStart="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Spinner" android:id="@+id/tvStudent" android:layout_below="@+id/spinStudent_Simple" android:layout_alignParentStart="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Name" android:id="@+id/tvName" android:layout_below="@+id/spinStudent" android:layout_alignParentStart="true" android:layout_marginTop="32dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Age" android:id="@+id/tvAge" android:layout_marginTop="38dp" android:layout_below="@+id/tvName" android:layout_alignParentStart="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Email" android:id="@+id/tvEmail" android:layout_marginTop="38dp" android:layout_below="@+id/tvAge" android:layout_alignParentStart="true" /> </RelativeLayout> |
همانطور که در بالاتر گفتم دو نوع spinner در بالا داریم و textview های دیگر هم برای spinner دوم هست زمانی که از spinner دوم آیتمی را انتحاب کنید در textview ها داده های جدیدی قرار خواهد گرفت.
یک کلاس جاوا به نام DBHelper.java ایجا کرده و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | package ir.programchi; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; /** * Created by Jefferson on 2/5/2015. */ public class DBHelper extends SQLiteOpenHelper { //version number to upgrade database version private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "spinner.db"; public DBHelper(Context context ) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String CREATE_TABLE_STUDENT = "CREATE TABLE " + Student.TABLE + "(" + Student.KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT ," + Student.KEY_name + " TEXT, " + Student.KEY_age + " INTEGER, " + Student.KEY_email + " TEXT )"; db.execSQL(CREATE_TABLE_STUDENT); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + Student.TABLE); onCreate(db); } } |
این کلاس بارها توضیح داده شده است و دوباره نیز آن را توضیح میدهم ! کار کلاس بالا ایجاد دیتابیس و insert جدول ها است.
یک کلاس به نام Student.java ایجاد کرده و های زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | package ir.programchi; /** * Created by Jefferson on 2/5/2015. */ public class Student { // Labels table name public static final String TABLE = "Student"; // Labels Table Columns names public static final String KEY_ID = "id"; public static final String KEY_name = "name"; public static final String KEY_email = "email"; public static final String KEY_age = "age"; private int student_ID; private String name; private String email; private int age; public void setAge(Integer age){ this.age=age; } public Integer getAge(){ return this.age; } public void setName(String name){ this.name=name; } public String getName(){ return this.name; } public void setEmail(String email){ this.email=email; } public String getEmail(){ return this.email; } public void setStudent_ID(Integer student_ID){ this.student_ID=student_ID; } public Integer getStudent_ID(){ return this.student_ID; } } |
این کلاس model ما هست به آن getter و setter نیز می گویند.
یک کلاس دیگر به نام StudentRepo.java ایجاد کرده و کدهای زیر را به آن اضافه کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | package ir.programchi; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.DatabaseUtils; import android.database.sqlite.SQLiteDatabase; import java.util.ArrayList; import java.util.HashMap; import java.util.List; /** * Created by Jefferson on 2/5/2015. */ public class StudentRepo { private DBHelper dbHelper; public StudentRepo(Context context) { dbHelper = new DBHelper(context); } public void Delete() { SQLiteDatabase db = dbHelper.getWritableDatabase(); db.delete(Student.TABLE, null, null); db.close(); } //Insert records public int insert(Student student) { SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(Student.KEY_age, student.getAge()); values.put(Student.KEY_email, student.getEmail()); values.put(Student.KEY_name, student.getName()); // Inserting Row long student_Id = db.insert(Student.TABLE, null, values); db.close(); return (int) student_Id; } public List<Student> getAll() { SQLiteDatabase db = dbHelper.getReadableDatabase(); String selectQuery = "SELECT " + Student.KEY_ID + "," + Student.KEY_name + "," + Student.KEY_email + "," + Student.KEY_age + " FROM " + Student.TABLE; List<Student> studentList = new ArrayList<Student>() ; Cursor cursor = db.rawQuery(selectQuery, null); if (cursor.moveToFirst()) { do { Student student = new Student(); student.setAge(cursor.getInt(cursor.getColumnIndex(Student.KEY_age))); student.setEmail(cursor.getString(cursor.getColumnIndex(Student.KEY_email))); student.setName(cursor.getString(cursor.getColumnIndex(Student.KEY_name))); student.setStudent_ID(cursor.getInt(cursor.getColumnIndex(Student.KEY_ID))); studentList.add(student); } while (cursor.moveToNext()); } cursor.close(); db.close(); return studentList; } public List<String> getAll_Simple() { SQLiteDatabase db = dbHelper.getReadableDatabase(); String selectQuery = "SELECT " + Student.KEY_age + "," + Student.KEY_name + " FROM " + Student.TABLE; List<String> studentList = new ArrayList<String>() ; Cursor cursor = db.rawQuery(selectQuery, null); Integer i=0; if (cursor.moveToFirst()) { do { studentList.add(i,cursor.getString(cursor.getColumnIndex(Student.KEY_name))); i+=1; } while (cursor.moveToNext()); } cursor.close(); db.close(); return studentList; } } |
اگر بخواهیم به طور سریع به توضیح این کلاس بپردازیم باید بگوییم کار insert به دیتابیس در اینجا انجام می شود و عمل select از دیتابیس هم در اینجا handle می شود.
برای اینکه بخشی از spinner سفارشی سازی کنیم (منظور ظاهرش است) باید یک کلاس به نام StudentSpinnerAdapter.java ایجاد کنیم و از کدهای زیر استفاده کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | package ir.programchi; import android.content.Context; import android.graphics.Color; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; import java.util.List; import instinctcoder.sqliteDb.Student; /** * Created by Jefferson on 2/6/2015. */ public class StudentSpinnerAdapter extends ArrayAdapter<Student> { private Context mContext; private List<Student> mValues; public StudentSpinnerAdapter(Context context, int textViewResourceId, List<Student> objects) { super(context, textViewResourceId, objects); this.mContext = context; this.mValues = objects; } @Override public int getCount(){ return mValues.size(); } @Override public Student getItem(int position){ return mValues.get(position); } @Override public long getItemId(int position){ return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView label = new TextView(mContext); label.setTextColor(Color.BLACK); label.setTextSize(18); label.setText(" " + mValues.get(position).getName()); label.setHeight(50); label.setGravity(Gravity.LEFT | Gravity.CENTER ); return label; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { TextView label = new TextView(mContext); label.setTextColor(Color.BLACK); label.setTextSize(18); label.setText(" " + mValues.get(position).getName()); label.setHeight(70); label.setGravity(Gravity.LEFT | Gravity.CENTER ); return label; } } |
در بالا getView شکل ظاهری default خود spinner را در حالتی که کاربر بروی آیتم های کلیک نکرده را ایجاد می کند.
getDropDownView هم شکل ظاهری هرکدام از spinner ها بعد از کلیک کاربر را تنظیم می کند.
و در آخر کد مربوط به اکتیویتی اصلی که نام آن برابر با MainActivity.java است همانند زیر می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | package ir.programchi; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.TextView; import java.util.List; import instinctcoder.sqliteDb.Student; import instinctcoder.sqliteDb.StudentRepo; public class MainActivity extends ActionBarActivity implements AdapterView.OnItemSelectedListener { Spinner mSpinStudent, mSpinStudent_Simple; TextView mTvName, mTvAge, mTvEmail; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSpinStudent = (Spinner) findViewById(R.id.spinStudent); mSpinStudent_Simple= (Spinner) findViewById(R.id.spinStudent_Simple); mTvAge= (TextView) findViewById(R.id.tvAge); mTvEmail= (TextView) findViewById(R.id.tvEmail); mTvName= (TextView) findViewById(R.id.tvName); mSpinStudent.setOnItemSelectedListener(this); mSpinStudent_Simple.setOnItemSelectedListener(this); insertDummyData(); loadStudent(); loadStudent_Simple(); } @Override public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { if (parentView== findViewById(R.id.spinStudent)){ Student selected = (Student) parentView.getItemAtPosition(position); mTvName.setText("Name: " + selected.getName()); mTvAge.setText( "Age: " + selected.getAge().toString()); mTvEmail.setText("Email: " + selected.getEmail()); } else if (parentView== findViewById(R.id.spinStudent_Simple)){ mTvName.setText(((TextView) selectedItemView).getText()); mTvAge.setText("NO Data !"); mTvEmail.setText("NO Data ! :D"); } } @Override public void onNothingSelected(AdapterView<?> parentView) { mTvAge.setText( ""); mTvEmail.setText( ""); mTvName.setText(""); } private void insertDummyData(){ StudentRepo repo = new StudentRepo(this); repo.Delete(); for (Integer i=0;i<5;i++){ Student student = new Student(); student.setAge(10); student.setEmail("info@programchi.ir"); student.setName("Jefferson " + i.toString()); repo.insert(student); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } private void loadStudent_Simple(){ ArrayAdapter<String> spinnerAdapter; StudentRepo db = new StudentRepo(getApplicationContext()); List<String> students = db.getAll_Simple(); spinnerAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item, students); mSpinStudent_Simple.setAdapter(spinnerAdapter); spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); } private void loadStudent(){ StudentSpinnerAdapter studentAdapter; StudentRepo db = new StudentRepo(getApplicationContext()); List<Student> students = db.getAll(); studentAdapter = new StudentSpinnerAdapter(MainActivity.this, android.R.layout.simple_spinner_item , students ); mSpinStudent.setAdapter(studentAdapter); studentAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } |
برنامه را تست کنید متوجه می شوید که چا اتفاقی افتاده است ! در کد های بالا ما یک Insert ساده با استفاده از for زدیم تا دیتای sample در دیتابیس قرار گیرد و همانطور که پیشتر گفتیم دوتا spinner وجود دارد در صورتی که اولی را انتخاب کنید داده No Data در TextView قرار خواهد گرفت ولی در صورتی که spinner دوم را تست کنید خواهید دید که داده های از دیتابیس query خورده و در Textview ها قرار می گیرد .
این آموزش هم به پایان رسید.
موفق و پیروز باشید.
عالی بود هیچ جا ندیدم sqlite رو به این خوبی و قابل خواندن و زیبا نوشته باشن. دستتون درد نکنه. خدا خیرت بده. نیاز داشتم به استفاده از اسپینر ممنون.
ممنون رامین جان موفق باشید