آموزش جستجو در دیتابیس sqlite در برنامه نویسی اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش جستجو در دیتابیس sqlite در برنامه نویسی اندروید آموزش های کاملی از دیتابیس sqlite را قبلا برای شما دوستان قرار داده بودیم برای اینکه به آموزش های کامل آن دسترسی داشته باشید می توانید واژه Sqlite را در سایت جستجو کنید در این آموزش ما یکسری داده sample را در listview قرار میدهیم سپس در آن جستجو می کنیم و فیلد جستجو در ActionBar قرار دارد در ادامه می توانید پیش نمایشی از خروجی برنامه را مشاهده کنید با ما همراه باشید.
به علت حجم بالای ویدیو از لینک زیر استفاده کنید. (حتما ویدیو را تماشا کنید)
لینک ویدیو
ابتدای کار ما دو تا فایل در پوشه res/drawable ایجاد می کنیم با استفاده از این فایل ها یک انیمیشن زیبا برای listView ایجاد می کنیم.
پس یک فایل به نام item_list_backgroundcolor.xml ایجاد کنید و کد های زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 | <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="false" android:state_pressed="false" android:drawable="@color/listItem1" /> <item android:state_pressed="true" android:drawable="@color/listItemSelected" /> <item android:state_selected="true" android:state_pressed="false" android:drawable="@color/listItemSelected" /> </selector> |
و یک فایل دیگر به نام item_list_backgroundcolor2.xml ایجاد کرده و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 | <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="false" android:state_pressed="false" android:drawable="@color/listItem2" /> <item android:state_pressed="true" android:drawable="@color/listItemSelected" /> <item android:state_selected="true" android:state_pressed="false" android:drawable="@color/listItemSelected" /> </selector> |
در کد های بالا از رنگ های زیر استفاده شده است.
1 2 3 4 5 6 7 8 9 | <?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">#3F51B5</color> <color name="colorPrimaryDark">#303F9F</color> <color name="colorAccent">#FF4081</color> <color name="listItem1">#ffffff</color> <color name="listItem2">#e8eefe</color> <color name="listItemSelected">#3F51B5</color> </resources> |
وارد layout اصلی شده در اینجا نام آن برابر با Activity_main.xml است و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?xml version="1.0" encoding="utf-8"?> <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"> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/lstStudent" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> </RelativeLayout> |
در آن یک listView برای قرار گرفتن داده های خوانده شده از دیتابیس قرار داده ایم.
برای اینکه یک listView سفارشی داشته باشیم یعنی محتوای که در آن نمایش داده می شود بهتر باشد یک فایل به نام item.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 | <?xml version="1.0" encoding="utf-8"?> <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"> <LinearLayout android:id="@+id/thumbnail" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="3dip" android:layout_marginRight="5dip" android:layout_alignParentRight="true"> <ImageView android:id="@+id/list_image" android:layout_width="25dip" android:layout_height="25dip" android:src="@drawable/ic_mode_edit_black_24dp" /> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="email@instinctcoder.com" android:id="@+id/txtEmail" android:layout_weight="90" android:layout_alignBottom="@+id/txtName" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:id="@+id/txtId" android:visibility="gone" android:text="1" android:layout_weight="50" /> <TextView android:layout_width="318dp" android:layout_height="40dp" android:textAppearance="?android:attr/textAppearanceMedium" android:id="@+id/txtName" android:text="ten" android:textStyle="bold" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> </RelativeLayout> |
حالا باید یک پوشه به نام menu در res ایجاد کنید در صورتی که وجود دارد یک فایل به نام options_menu.xml ایجاد کرده و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 | <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/search" android:title="@string/app_name" android:hint="@string/search_hint" android:icon="@drawable/abc_ic_search_api_mtrl_alpha" app:showAsAction="collapseActionView|ifRoom" app:actionViewClass="android.support.v7.widget.SearchView"/> </menu> |
هم اکنون باید در res یک پوشه به نام xml ایجاد کنید در پوشه ذکر شده یک فایل به نام searchable.xml ایجاد کرده و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 | <?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" android:hint="@string/search_hint" > </searchable> |
در بخش AndroidManifest.xml باید یکسری کد اضافه کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ir.programchi"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> </application> </manifest> |
در بالا یک intent-filter به اکتیویتی سرچ اضافه شده است و بخش meta-data در صورتی که این بخش را همانند ما تنظیم نکنید به خطا خواهید خورد و android:launchMode نیز اضافه شده است.
یک کلاس جاوا به نام Student.java ایجاد کرده و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package ir.programchi; /** * Created by Jefferson on 3/14/2016. */ public class Student { // Labels table name public static final String TABLE = "Student"; public static final String KEY_ROWID = "_id"; 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"; public int student_ID; public String name; public String email; public int age; } |
از کد های بالا برای ایجاد جدول استفاده خواهیم کرد.
یک کلاس دیگر به نام 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.[rogramchi; /** * Created by Jefferson on 3/14/2016. */ import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DBHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 1; // Database Name private static final String DATABASE_NAME = "searchwidget.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); } } |
از کد بالا برای ایجاد دیتابیس استفاده کرده ایم.
اگر یادتان باشد از در بالا از layout سفارشی برای list استفاده کرده برای اینکه آنها را handle کنیم باید یک آداپتور سفارشی نیز ایجاد کنیم.
پس یک فایل به نام CustomAdapter.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 | package ir.programchi; import android.content.Context; import android.database.Cursor; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CursorAdapter; import android.widget.TextView; /** * Created by Jefferson on 3/14/2016. */ public class CustomAdapter extends CursorAdapter { TextView txtId,txtName,txtEmail; private LayoutInflater mInflater; public CustomAdapter(Context context, Cursor c, int flags) { super(context, c, flags); mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { View view = mInflater.inflate(R.layout.item, parent, false); ViewHolder holder = new ViewHolder(); holder.txtId = (TextView) view.findViewById(R.id.txtId); holder.txtName = (TextView) view.findViewById(R.id.txtName); holder.txtEmail = (TextView) view.findViewById(R.id.txtEmail); view.setTag(holder); return view; } @Override public void bindView(View view, Context context, Cursor cursor) { /*if(cursor.getPosition()%2==1) { view.setBackgroundResource(R.drawable.item_list_backgroundcolor); } else { view.setBackgroundResource(R.drawable.item_list_backgroundcolor2); }*/ ViewHolder holder = (ViewHolder) view.getTag(); holder.txtId.setText(cursor.getString(cursor.getColumnIndex(Student.KEY_ID))); holder.txtName.setText(cursor.getString(cursor.getColumnIndex(Student.KEY_name))); holder.txtEmail.setText(cursor.getString(cursor.getColumnIndex(Student.KEY_email))); } static class ViewHolder { TextView txtId; TextView txtName; TextView txtEmail; } } |
در بالا یک بخشی از کد کامنت شده است اگر دوست داشتید listview شما انیمیشن داشته باشد کامنت را بردارید در غیر اینصورت آن را حذف کنید.
یک فایل جاوا به نام 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 79 80 81 82 83 84 85 86 87 88 89 90 | package ir.programchi; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import java.util.ArrayList; import java.util.HashMap; /** * Created by Jefferson on 3/14/2016. */ public class StudentRepo { private DBHelper dbHelper; public StudentRepo(Context context) { dbHelper = new DBHelper(context); } public int insert(Student student) { SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(Student.KEY_age, student.age); values.put(Student.KEY_email,student.email); values.put(Student.KEY_name, student.name); long student_Id = db.insert(Student.TABLE, null, values); db.close(); return (int) student_Id; } public Cursor getStudentList() { SQLiteDatabase db = dbHelper.getReadableDatabase(); String selectQuery = "SELECT rowid as " + Student.KEY_ROWID + "," + Student.KEY_ID + "," + Student.KEY_name + "," + Student.KEY_email + "," + Student.KEY_age + " FROM " + Student.TABLE; Cursor cursor = db.rawQuery(selectQuery, null); // looping through all rows and adding to list if (cursor == null) { return null; } else if (!cursor.moveToFirst()) { cursor.close(); return null; } return cursor; } public Cursor getStudentListByKeyword(String search) { SQLiteDatabase db = dbHelper.getReadableDatabase(); String selectQuery = "SELECT rowid as " + Student.KEY_ROWID + "," + Student.KEY_ID + "," + Student.KEY_name + "," + Student.KEY_email + "," + Student.KEY_age + " FROM " + Student.TABLE + " WHERE " + Student.KEY_name + " LIKE '%" +search + "%' " ; Cursor cursor = db.rawQuery(selectQuery, null); if (cursor == null) { return null; } else if (!cursor.moveToFirst()) { cursor.close(); return null; } return cursor; } public Student getStudentById(int Id){ SQLiteDatabase db = dbHelper.getReadableDatabase(); String selectQuery = "SELECT " + Student.KEY_ID + "," + Student.KEY_name + "," + Student.KEY_email + "," + Student.KEY_age + " FROM " + Student.TABLE + " WHERE " + Student.KEY_ID + "=?"; int iCount =0; Student student = new Student(); Cursor cursor = db.rawQuery(selectQuery, new String[] { String.valueOf(Id) } ); if (cursor.moveToFirst()) { do { student.student_ID =cursor.getInt(cursor.getColumnIndex(Student.KEY_ID)); student.name =cursor.getString(cursor.getColumnIndex(Student.KEY_name)); student.email =cursor.getString(cursor.getColumnIndex(Student.KEY_email)); student.age =cursor.getInt(cursor.getColumnIndex(Student.KEY_age)); } while (cursor.moveToNext()); } cursor.close(); db.close(); return student; } } |
کار این کلاس انجام query های ما است مثل انتخاب کردن (Select) از دیتابیس و… در کل function اصلی select است.
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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | package ir.programchi; import android.annotation.TargetApi; import android.app.SearchManager; import android.content.Context; import android.os.Build; import android.support.v4.widget.CursorAdapter; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import java.util.ArrayList; import java.util.List; import android.database.Cursor; import android.support.v7.widget.SearchView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private CustomAdapter customAdapter; ListView listView; Cursor cursor; StudentRepo studentRepo ; private final static String TAG= MainActivity.class.getName().toString(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); studentRepo = new StudentRepo(this); cursor=studentRepo.getStudentList(); customAdapter = new CustomAdapter(MainActivity.this, cursor, 0); listView = (ListView) findViewById(R.id.lstStudent); listView.setAdapter(customAdapter); if(cursor==null) insertDummy(); } private void insertDummy(){ Student student= new Student(); student.age=22; student.email="tanwoonhow@intstinctcoder.com"; student.name="Tan Woon How"; studentRepo.insert(student); studentRepo = new StudentRepo(this); student.age=20; student.email="Jimmy@intstinctcoder.com"; student.name="Jimmy Tan Yao Lin"; studentRepo.insert(student); studentRepo = new StudentRepo(this); student.age=21; student.email="Robert@intstinctcoder.com"; student.name="Robert Pattinson"; studentRepo.insert(student); studentRepo = new StudentRepo(this); student.age=19; student.email="jason@intstinctcoder.com"; student.name="Jason Tan"; studentRepo.insert(student); studentRepo = new StudentRepo(this); student.age=18; student.email="bftan@intstinctcoder.com"; student.name="Tan Bor Feng"; studentRepo.insert(student); studentRepo = new StudentRepo(this); student.age=23; student.email="janet@intstinctcoder.com"; student.name="Janelle Monae"; studentRepo.insert(student); studentRepo = new StudentRepo(this); student.age=21; student.email="james@intstinctcoder.com"; student.name="James Harden"; studentRepo.insert(student); } @Override public void onResume(){ super.onResume(); } @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.options_menu, menu); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView search = (SearchView) menu.findItem(R.id.search).getActionView(); search.setSearchableInfo(manager.getSearchableInfo(getComponentName())); search.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String s) { Log.d(TAG, "onQueryTextSubmit "); cursor=studentRepo.getStudentListByKeyword(s); if (cursor==null){ Toast.makeText(MainActivity.this,"No records found!",Toast.LENGTH_LONG).show(); }else{ Toast.makeText(MainActivity.this, cursor.getCount() + " records found!",Toast.LENGTH_LONG).show(); } customAdapter.swapCursor(cursor); return false; } @Override public boolean onQueryTextChange(String s) { Log.d(TAG, "onQueryTextChange "); cursor=studentRepo.getStudentListByKeyword(s); if (cursor!=null){ customAdapter.swapCursor(cursor); } return false; } }); } return true; } } |
کد بالا کمی شلوغ شده است اما چیز خاصی در آن وجود ندارد بخش عمده آن با insert پر شده است در ابتدا ما یکسری داده sample در برنامه قرار میدهیم تا بتوانید در آنها جستجو کنید و برای جستجو از setOnQueryTextListener استفاده کردیم بخشی از کد هم برای option menu است تا آن را نمایش دهد همانطور که ویدیو را تماشا کردید بخش search در آنجا قرار دارد .
این آموزش هم به پایان رسید.
موفق و پیروز باشید.
سلام آموزش بسیار عالیی است ولی اگر بخواییم توی یه صفحه سرچ چند گزینه ای داشته باشیم
مثلا بر اساس ای دی و اسم و فامیلی و شماره سرچ کنه چطور ؟
اگر کاربر فقط اسم و فامیلی رو بلد بود ولی ای دی رو بلد نبود چطور ؟
یا فقط ای دی و شماره رو سرچ میکرد چطور ؟
یا بقول دوستان مالتی سرچ!
اگر میشه چنین آموزشی داشته باشید خیلی خوبه چون تقریبا هرجارو گشتم چنین موضوعی رو ندیدم!
سپاس از سایت خوبتون
سلام و درود کافیه یک and اضافه کنید یعنی نام و نام خانوادگی و آیدی شما همیه اینا رو باهم and کنید درست میشه query زیر رو ببینید
موفق باشید.
سلام ممنون از آموزش خوبتون
میخواستم ببینم چطور میتونم اطلاعات وارد دیتابیس کنم؟