بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

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

مدیریت گفتگو
mohsen-jj 12 سال پیش
آخرین تغییر: 12 سال پیش

سلام هرچی سرچ کردم نتونستم از جستجو در دیتابیس خیلی سردربیارم ، چطور میتونم یک کلمه رو در یک متن طولانی موجود در دیتابیس جستجو کنم و همه متنهایی که شامل این کلمه هستن رو شناسایی کنم . در ضمن این کلمه هرکجای متن ممکنه باشه ( یعنی فقط اول متن ها نیست ) . لطفا روش جستجو در دیتابیس رو با کد بنویسید و ایده ی نمایش اون متنهای شامل کلمه رو هم بدید . خیییییلی ممنونم :)

نظرات

mohsen-jj 12 سال پیش
من میخوام اگه مثلا 10 تا متن دارم و کلمه در 6 تای اونها وجود داره همه ی او 6 تا شناسایی بشه و مثلا به listView اضافه بشن . مرسی
Mir Unknown 12 سال پیش
سرچ نمیخواد شما بخش 14 که مربوط به دیتابیس دوباره نگاه کن
mohsen-jj 12 سال پیش
نگاه کردم ولی استاد توی این بخش فقط عدد سرچ میکنه بعلاوه اینکه من میخوام تمام متن هایی که شامل کلمه سرچ شده هستن رو شناسایی کنم که همچین کاری نکرده استاد
Mir Unknown 12 سال پیش
لینک ی نگاه بنداز طریقه جستجو از بانک انلاینه ولی دستورات فرقی ندارن فکر کنم دستور اصلی یکیه.در باز شدن دیدتم کمک میکنه
mohsen-jj 12 سال پیش
مرسی نگاه میکنم ببینم چیزی دستگیرم میشه یا نه

پاسخ‌ها 5

MiRHaDi 12 سال پیش

select * from table where textfield like '%searchtext%'

نظرات

mohsen-jj 12 سال پیش
دست گلت درد نکنه
SaM MP 12 سال پیش

پروژه مارکت رو ببینی و یکم ابتکار به خرج بدی میتونی چستجو از بانک اطلاعات رو پیاده سازی کنی، بگذریم بریم سراغ آموزش :)

برای تفهیم آسانتر همون پروژه Notes ارتباط با دیتابیس استاد رو فرض کنید.

  • یک EditeText داریم که متن جستجو رو داخلش تایپ میکنیم، یه Button هم که بعد از کلیک  عمل جستوجو انجام بشه:
Button btnSearch = (Button) findViewById(R.id.btnSearch);
EditText edtSearch = (EditText) findViewById(R.id.edtSearch);
final String search = edtSearch.getText().toString();
btnSearch.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View view) {
   ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
   params.add(new BasicNameValuePair("search", search));
   Commands.read(params);
   }
});

متن رو میگیریم، توی یک آرایه (Params) واریز میکنیم، متود ()Read رو از کلاس Commands صدا میزنیم با ورودی آرایمون.


  • اینم کلاس Commands و متود ()Read داخلش:
 public class Commands {

 public static void read() {
     String result = Webservice.readUrl("http://192.168.1.2/server/service.php?action=read_search", params);
     if (result != null) {
         try {
             G.tasks.clear();
             JSONArray tasks = new JSONArray(result);
             for (int i = 0; i < tasks.length(); i++) {
                 JSONObject object = tasks.getJSONObject(i);
                 StructTask task = new StructTask();
                 task.id = object.getLong("task_id");
                 task.title = object.getString("task_title");
                 task.desc = object.getString("task_desc");
                 task.done = object.getInt("task_done") == 1 ? true : false;

                 G.tasks.add(task);
             }
         }
         catch (JSONException e) {
             e.printStackTrace();
         }
     }
  }
}
// action=read_search  (به این توجه کن (یه هماهنگسازیه با پی اچ پی 

خب طبق این متود هر چی از بانک خوانده بشه نتیجش توی G.tasks واریز میشه.


بریم سراغ کدهای php:

<?php
header('Content-Type: text/html; charset=utf-8');
if (isset($_REQUEST['action'])){
    $action = $_REQUEST['action'];
} else {
    echo "Invalid Data";
    exit;
}

if ($action=="read_search"){
    read_search();
}

function connectToDatabase(){
    $connection=mysqli_connect("localhost", "root", "", "database_name");
    mysqli_query($connection,"SET NAMES 'utf8'");
    mysqli_set_charset($connection,"UTF8");
    if (mysqli_connect_errno()) {
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }
    return $connection;
}

function read_search(){
    $connection = connectToDatabase();
    $strSearch = $_REQUEST["search"];
    $result = mysqli_query($connection, "SELECT * FROM task WHERE task_title LIKE '%$strSearch%' OR task_desc LIKE '%$strSearch%' ORDER BY task_id DESC");

    $output = array();
    while($row = mysqli_fetch_array($result)) {
        $record = array();
        $record['task_id'] = $row['task_id'];
        $record['task_title'] = $row['task_title'];
        $record['task_desc'] = $row['task_desc'];
        $record['task_done'] = $row['task_done'];

        $output[] = $record;
    }
    echo json_encode($output);
    mysqli_close($connection);
}

اینم که قسمت کلیدیش فقط خط تعریف $result  که یکم دقت کنی میفهمی قضیش چیه ( اینجا روی  task_title و task_desc جستجو انجام میشه به همین صورت میتونی تعدادشو از اینجا که دوتاست بیشتر کنی)

از بیشتر نمیتونم مبحث رو باز کنم!   ارادت :)

نظرات

Mir Unknown 12 سال پیش
خسته نباشید ولی کاش به متن سوال دقت میکردید،میخواد از دیتابیس جستجوه کنه نه از سرور!
mohsen-jj 12 سال پیش
آقا دمت گرم مرسی :)
Seyed.Mahdi 12 سال پیش

بايد كل كلمات متنتو ايندكس كني توي يه جدول يني اينكه مثلا كلمه "است" در عنوان "آموزش برنامه نويسي" وجود داره كه  اين عنوان خودش تو يه جدول ديگه داراي يك آي دي مي باشد حالا بايد كلمه "است" رو با اين آي دي در يك جدول ديگر درج كني و اينجوري ميتوني بفهمي كه چه كلماتي واسه ي چه عناويني هست. اين ترفند توي sql هم استفاده ميشه كه من از يه برنامه نويس حرفه اي دلفي ياد گرفتم البته اون خيلي سربسته راهنمايي كرد ولي جدولاشو تريس كردم فهميدم كه موضوع از چه قراره.ساده اس ولي خيلي قشنگه.موفق باشيد.

نظرات

MiRHaDi 12 سال پیش
این کار پویایی برنامه را به شدت از بین میبره و شما اگر متن جدیدی بخواید اضافه کنید باید دوباره همچین ایندکسی بسازید و ... ؛ زمان داس از این کارها میکردیم که sql هنوز نداشتیم. الان دیگه نیازی به ساخت فایل جدا برای index و ... نیست.
Seyed.Mahdi 12 سال پیش
سرعت اينكار بسيار بالاست و براي متن جديد كافيه كه براي متنت يه تولز بسازي و از اون استفاده كني واز همون توابعي كه براي ايندكس ساختن استفاده ميكني تولزتو بسازي . اتفاقا توي يه سري نرم افزارها مثل قانون لینک از اين روش استفاده شده و خيلي سرعت جستجوي بالايي داره و چرا بايد پويايي برنامه رو از بين ببره ساخت ايندكس فقط يك بار توسط خود برنامه نويس انجام ميشه و تمام.حالا اين روش چون خيلي جالب بود ارائه دادم اگه شما روش بهتري داريد ارائه بديد لطفا. موفق باشيد.
Seyed.Mahdi 12 سال پیش
راستي يادم رفت يه سري از نرم افزارهاي قرآني و ادعيه هم از اين روش كه خدمتتون عرض كردم استفاده ميكنن چون بايد كلمات بدون علامت رو توي ديتابيس ذخيره كنن اينم يكي از كاربرداش.
MiRHaDi 12 سال پیش
برای بعضی برنامه ها میتونه کاربرد داشته باشه ، ولی محدودیتهای خودشو داره ، مثلا شما اگر کلمه به کلمه ایندکس کنید اگر جزئی از کلمه سرچ بشه پیدا نمیشه . ولی گاهی میتونه کاربرد داشته باشه ، یک روش برای کارهای خاص منظوره میتونه باشه
MiRHaDi 12 سال پیش
منظورم از پویا نیست اینه که در برنامه اگر بخواد تکستهای جدید اضافه بشه توسط کاربر یا از اینترنت و ... جستجو روش انجام نمیشه مگر اینکه یک مرحله ساخت ایندکس هم بذارید ! مثال شما با تکست ثابت هست مثل قرآن و قانون که قبل از انتشار این کار انجام شده
MiRHaDi 12 سال پیش

query (SQLiteDatabase db, String[] projectionIn, String selection, String[] selectionArgs, String groupBy, String having, String sortOrder)

و از این پارامترها استفاده کنید

selection = KEY_CODE + " LIKE ?";
selectionArgs = new String[] {"%" + query + "%"};

نظرات

mohsen-jj 12 سال پیش
میگم الان تو این گدا چیکار کردید دقیقا ؟!!
MiRHaDi 12 سال پیش
اینجا از SQLiteQueryBuilder استفاده شده
mohsen-jj 12 سال پیش

ممنون از همه .

من میخواستم یک کلمه از کاربر بگیرم (که اسمش input هست ) و این کلمه رو سرچ کنم فهمیدم باید با این کد جستجو کنم :

 Cursor cursor = G.database.rawQuery("SELECT * FROM mytexts WHERE matn LIKE'%" + input+ "%'", null);
 
ولی این کد مثلا اگه داخل 6 متن اون کلمه وجود داشته باشه همشون رو پیدا نمی کنه فقط یکیشون رو پیدا می کنه ، حالا باید چیکار کنم ؟

نظرات

MiRHaDi 12 سال پیش
این رکوردهایی که شامل کلمه میشه را برمیگردونه ، تعداد وجود کلمه در هر رکورد را بر نمیگردونه
mohsen-jj 12 سال پیش
منم تعداد وجود کلمه در هر رکورد رو نمیخوام . همه ی رکوردهایی رو میخوام که شامل کلمه هستن . ولی چطور همه ی این رکورد ها رو بفهمم کدوما هستن ؟
mohsen-jj 12 سال پیش
فکر کنم فهمیدم . باید یه cursor بزنم و بعد همه ی اون رکوردها رو داخل یه آرایه ای از string یا int ذخیره کنم . مرسی از راهنماییتون :)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .