کلیدستان

نسخه‌ی کامل: جستجو در پایگاه داده SQLite (در برنامه نویسی اندروید)
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
من یه برنامه  دیکشنری ساختم که 2 تا ادیت تکست داره و ادیت تکست اولی  به انگلیسی میگیره و دومی به فارسی ، الان دکمه های اضافه و حذف رو نوشتم اما برای جستجو به مشکل بر خوردم ، مثلا میخوام وقتی توی ادیت تکست دوم کلمه ی سلام نوشته شد و کلید سرچ زده شد ، در ادیت تکست اول سلام به انگلیسی نمایش داده بشه ولی نمیدونم چجوری باید بهش شرط بدم ، لطفاً اگه کسی میدونه منو راهنمایی بکنه ، ممنون.
در مورد نوشته خودم اطمینان ندارم چون خودم هم یه جایی این مطلب رو خوندم ولی برداشتم رو برات مینویسم


اگه دیتابیس دوتا ستون داشته باشه یکی برای کلمات فارسی و رو به روی او ن معانی انها میتونی روی ستون  اول کویری بزنی تا کلمه رو جست و جو کنه و معانی رو برگردونه

اسم جدول w
ستون fکلمات فارسی
ستونeکلمات انگلیسی

"select  f  from w where e="search



کلمه سرچ همون کلمه مورد نظره که از کار بر میگیره


حاصل دستور بالا معانی که در ستون مقابلش نوشته شده  رو بر میگردونه  حالا میتونی داخل یه متغیر بریزی و بعد اون رو به هر شکل که خاستی نمایش بدی


روش دریافت کلمه از کاربر و نمایش کلمه رو  داخل تکس ویو یا ادیت تکس هم که حتما میدونی
سلام.
مهم نحوه جستجو در پایگاه داده است. اگر قصد دارید که کلمه به طور دقیق جستجو شود، یعنی بگوییم که مقدار ستون (ستون حاوی کلمات فارسی) دقیقا برابر کلمه ((سلام)) باشد، باید از query (دستور کار با پایگاه داده) زیر برای فراخوانی ردیف متناظر از پایگاه داده SQLite استفاده کنید (کلمات SELECT و WHERE مهم می باشند) :

کد پی‌اچ‌پی:
SELECT FROM table_name WHERE column_name 'سلام'

اما اگر مقدارها به طور دقیق در ستون ها ذخیره نشده باشد، مثلا بگوییم که ردیف هایی از جدول برگردانده شوند که مقدار ستون مورد نظر، دارای کلمه ((سلام)) باشد (مثلا یک جمله باشد که کلمه سلام در آن قرار دارد)، برای این حالت، موضوع زیر را بخوانید :

http://www.kelidestan.com/forum/showthread.php?tid=5075

در ضمن، برای آشنایی بیشتر با query های مختلف، نگاهی به لینک زیر بیندازید :

http://www.tutorialspoint.com/sqlite/sql..._query.htm

سلام. مثالهای شما فقط برای یک سری مقدار ثابت بود ، منظورم من این بود که کاربر  هر عبارتی رو که وارد کرد عبارت متناظرش چاپ بشه ، مثلا اگر چندین کلمه ی انگلیسی و معنی اون ها رو وارد کرد ، بعد هر کدوم از کلمه های انگلیسی رو که داخل ادیت تکست وارد کرد معنیش داخل ادیت تکست بعدی نمایش داده بشه ،
نمایش داخل ادیت تکست ها رو بلدم ، فقط شرط مورد نظر رو نمیدونم.
select * from tablename where name="hello";
مثلاً این خط فقط یک اسم رو که hello باشه نمایش میده ،
چجوری میشه بجای همون عبارت سلام مقداری بنویسم که معادل عبارت وارد شده توسط ادیت تکست باشه؟  و بجای ستاره که همه ی مقادیر رو میگیره بگم فقط مقدار متناظرش رو بگیر.

من خیلی از سایت های خارجی رو هم گشتم ولی اونا هم فقط مقدار های ثابت رو نوشتن ، لطفاً اگر تونستین  کد رو بنویسید یا یه مثال بزنید ، خیلی ممنون.
 
برای ترجمه یک جمله، شما باید ابتدا کلمات را به صورت تکی در جمله یافته، با همان query ، معنای تک تک آنها را بیابید (به صورت جداگانه) و بعد جمله را به صورت فارسی بسازید (البته رعایت قواعد به این سادگی نیست و قوانین خاص خودش را دارد، یعنی حتی با داشتن معنی تک تک کلمه ها، باز هم ساخت جمله به فارسی خیلی ساده نخواهد بود). برای شناسایی کلمات هم باید توجه داشته باشید که معمولا بین کلمات، علامت هایی مثل فضای خالی (space)، نقطه و ... وجود دارد، پس با خواندن تک تک کاراکترها، باید بر اساس این کاراکترهای خاص، کلمات را شناسایی کرده و بعد معنی آنها را از پایگاه داده بخوانید.

با سلام مجدد ، پس از کلی تلاش به نتیجه رسیدم ،شرط رو باید به شکل زیر نوشت
در این صورت هر مقداری رو که به پایگاه داده اضافه بکنید میتونین جستجو کنید.

Cursor c=db.rawQuery("SELECT persian  FROM dasteyaboo where english='"+t+"'", null);//code
برای ادد کردن به جدول هم که توی سایت مطلب هست.
persian اسم فیلدی هست که مقدار فارسی رو بهش وارد میکنید .
شرط وقتی هست که مقدار english برابر با t باشه .
String t=edittext1.getText().toString();//code

 
(۱۳۹۴/۰۳/۰۹, ۰۷:۱۱ ب.ظ)ramin1323 نوشته: [ -> ]با سلام مجدد ، پس از کلی تلاش به نتیجه رسیدم ،شرط رو باید به شکل زیر نوشت
در این صورت هر مقداری رو که به پایگاه داده اضافه بکنید میتونین جستجو کنید.

Cursor c=db.rawQuery("SELECT persian  FROM dasteyaboo where english='"+t+"'", null);//code
برای ادد کردن به جدول هم که توی سایت مطلب هست.
persian اسم فیلدی هست که مقدار فارسی رو بهش وارد میکنید .
شرط وقتی هست که مقدار english برابر با t باشه .
String t=edittext1.getText().toString();//code

 

سلام .. من بر اساس همین کدی که اینجا شما نوشتین تو برنامم استفاده کردم 
کد:
Cursor searchrows = db.rawQuery("SELECT * FROM " + FeedEntry.Table_Name +
                          "WHERE unitnumber ='"+ search_item +"'", null);
 search_item  همون t تو کد شماست ... ولی این ارور رو توی اجرای شبیه ساز اندرویدی دارم ... 
کد:
SqliteDatabaseCpp(360): sqlite returned: error code = 1, msg = near "=": syntax error, db=/data/data/zahra.management.project/databases/My_Database.db

 اشکال کارم کجاست ؟؟ ممکنه بخاطر اجرا روی شبیه ساز ایکلیپس باشه ؟؟
سلام منم از همین کد استفاده کردم و درست بود!!!!


















______________________________________________________________________________
راه اندازی فروشگاه اینترنتی با سئوی فوق العاده
(۱۳۹۵/۰۱/۲۲, ۰۹:۵۷ ب.ظ)yasiiii نوشته: [ -> ]
(۱۳۹۴/۰۳/۰۹, ۰۷:۱۱ ب.ظ)ramin1323 نوشته: [ -> ]با سلام مجدد ، پس از کلی تلاش به نتیجه رسیدم ،شرط رو باید به شکل زیر نوشت
در این صورت هر مقداری رو که به پایگاه داده اضافه بکنید میتونین جستجو کنید.

Cursor c=db.rawQuery("SELECT persian  FROM dasteyaboo where english='"+t+"'", null);//code
برای ادد کردن به جدول هم که توی سایت مطلب هست.
persian اسم فیلدی هست که مقدار فارسی رو بهش وارد میکنید .
شرط وقتی هست که مقدار english برابر با t باشه .
String t=edittext1.getText().toString();//code

 

سلام .. من بر اساس همین کدی که اینجا شما نوشتین تو برنامم استفاده کردم 
کد:
Cursor searchrows = db.rawQuery("SELECT * FROM " + FeedEntry.Table_Name +
                          "WHERE unitnumber ='"+ search_item +"'", null);
 search_item  همون t تو کد شماست ... ولی این ارور رو توی اجرای شبیه ساز اندرویدی دارم ... 
کد:
SqliteDatabaseCpp(360): sqlite returned: error code = 1, msg = near "=": syntax error, db=/data/data/zahra.management.project/databases/My_Database.db

 اشکال کارم کجاست ؟؟ ممکنه بخاطر اجرا روی شبیه ساز ایکلیپس باشه ؟؟

دستور نوشته شده از لحاظ نوشتاری مشکل داره.
باید یک فاصله قبل از کلمه WHERE اضافه کنید. ( برای اینکه نام ستون جدول شما به کلمه WHERE چسبیده میشه و خطا میده
کد پی‌اچ‌پی:
Cursor searchrows db.rawQuery("SELECT * FROM " FeedEntry.Table_Name +
 
                         " WHERE unitnumber = '"search_item +"'"null); 
(۱۳۹۵/۰۱/۲۳, ۰۹:۵۵ ق.ظ)salmani نوشته: [ -> ]سلام منم از همین کد استفاده کردم و درست بود!!!!









______________________________________________________________________________
راه اندازی فروشگاه اینترنتی با سئوی فوق العاده
سلام .. بله مشکلم حل شد ... ظاهرا بخاطر یکی دوتا فاصله بین کلمات syntax ارور میگرفت .. فاصله های اضافی رو برداشتم حل شد !!
(۱۳۹۵/۰۱/۲۳, ۱۱:۲۴ ق.ظ)mahdi10539 نوشته: [ -> ]
(۱۳۹۵/۰۱/۲۲, ۰۹:۵۷ ب.ظ)yasiiii نوشته: [ -> ]
(۱۳۹۴/۰۳/۰۹, ۰۷:۱۱ ب.ظ)ramin1323 نوشته: [ -> ]با سلام مجدد ، پس از کلی تلاش به نتیجه رسیدم ،شرط رو باید به شکل زیر نوشت
در این صورت هر مقداری رو که به پایگاه داده اضافه بکنید میتونین جستجو کنید.

Cursor c=db.rawQuery("SELECT persian  FROM dasteyaboo where english='"+t+"'", null);//code
برای ادد کردن به جدول هم که توی سایت مطلب هست.
persian اسم فیلدی هست که مقدار فارسی رو بهش وارد میکنید .
شرط وقتی هست که مقدار english برابر با t باشه .
String t=edittext1.getText().toString();//code

 

سلام .. من بر اساس همین کدی که اینجا شما نوشتین تو برنامم استفاده کردم 
کد:
Cursor searchrows = db.rawQuery("SELECT * FROM " + FeedEntry.Table_Name +
                          "WHERE unitnumber ='"+ search_item +"'", null);
 search_item  همون t تو کد شماست ... ولی این ارور رو توی اجرای شبیه ساز اندرویدی دارم ... 
کد:
SqliteDatabaseCpp(360): sqlite returned: error code = 1, msg = near "=": syntax error, db=/data/data/zahra.management.project/databases/My_Database.db

 اشکال کارم کجاست ؟؟ ممکنه بخاطر اجرا روی شبیه ساز ایکلیپس باشه ؟؟

دستور نوشته شده از لحاظ نوشتاری مشکل داره.
باید یک فاصله قبل از کلمه WHERE اضافه کنید. ( برای اینکه نام ستون جدول شما به کلمه WHERE چسبیده میشه و خطا میده
کد پی‌اچ‌پی:
Cursor searchrows db.rawQuery("SELECT * FROM " FeedEntry.Table_Name +
 
                         " WHERE unitnumber = '"search_item +"'"null); 
بله خودمم بعدش متوجه شدم !!! گاهی اوقات این اشکالات کوچیک اصلا به چشم نمیاد و وقت آدمو حسابی میگیره !!
(۱۳۹۵/۰۱/۲۴, ۱۰:۳۱ ق.ظ)yasiiii نوشته: [ -> ]
(۱۳۹۵/۰۱/۲۳, ۱۱:۲۴ ق.ظ)mahdi10539 نوشته: [ -> ]
(۱۳۹۵/۰۱/۲۲, ۰۹:۵۷ ب.ظ)yasiiii نوشته: [ -> ]
(۱۳۹۴/۰۳/۰۹, ۰۷:۱۱ ب.ظ)ramin1323 نوشته: [ -> ]با سلام مجدد ، پس از کلی تلاش به نتیجه رسیدم ،شرط رو باید به شکل زیر نوشت
در این صورت هر مقداری رو که به پایگاه داده اضافه بکنید میتونین جستجو کنید.

Cursor c=db.rawQuery("SELECT persian  FROM dasteyaboo where english='"+t+"'", null);//code
برای ادد کردن به جدول هم که توی سایت مطلب هست.
persian اسم فیلدی هست که مقدار فارسی رو بهش وارد میکنید .
شرط وقتی هست که مقدار english برابر با t باشه .
String t=edittext1.getText().toString();//code

 

سلام .. من بر اساس همین کدی که اینجا شما نوشتین تو برنامم استفاده کردم 
کد:
Cursor searchrows = db.rawQuery("SELECT * FROM " + FeedEntry.Table_Name +
                          "WHERE unitnumber ='"+ search_item +"'", null);
 search_item  همون t تو کد شماست ... ولی این ارور رو توی اجرای شبیه ساز اندرویدی دارم ... 
کد:
SqliteDatabaseCpp(360): sqlite returned: error code = 1, msg = near "=": syntax error, db=/data/data/zahra.management.project/databases/My_Database.db

 اشکال کارم کجاست ؟؟ ممکنه بخاطر اجرا روی شبیه ساز ایکلیپس باشه ؟؟

دستور نوشته شده از لحاظ نوشتاری مشکل داره.
باید یک فاصله قبل از کلمه WHERE اضافه کنید. ( برای اینکه نام ستون جدول شما به کلمه WHERE چسبیده میشه و خطا میده
کد پی‌اچ‌پی:
Cursor searchrows db.rawQuery("SELECT * FROM " FeedEntry.Table_Name +
 
                         " WHERE unitnumber = '"search_item +"'"null); 
بله خودمم بعدش متوجه شدم !!! گاهی اوقات این اشکالات کوچیک اصلا به چشم نمیاد و وقت آدمو حسابی میگیره !!
با سلام خدمت دوستان عزیز .. با تشکر از این بحث مفید .. من یسوال دیگه این بار در مورد دستور backup  در sql داشتم .. من از این قالب برای دستور بکاپ استفاده میکنم : 

کد:
cdb.execSQL("BACKUP DATABASE " + FeedEntryCoast.Database_Name + " TO DISK='F:/management" +get_backupname+".bak'");
  ولی با ارور در syntax مواجه میشم !! 

کد:
sqlite returned: error code = 1, msg = near "BACKUP": syntax error, db=/data/data/zahra.management.project/databases/Coast_Database.db
 میشه راهنمایی کنید چرا ؟؟!!!
بله خودمم بعدش متوجه شدم !!! گاهی اوقات این اشکالات کوچیک اصلا به چشم نمیاد و وقت آدمو حسابی میگیره !!


بله دقیقا. برای جلوگیری از اینجور اشتباهات احتمالی بهتره که از querybuilder درونی خود sqlite یا هنوز بهتر از اون از ORM ها استفاده کنید تا مدیریت بهتری بر روی پایگاه داده داشته باشید.
[quote pid='17266' dateline='1460717065']
[quote pid='17216' dateline='1460440873']
[quote pid='17199' dateline='1460357673']
سلام خدمت دوستان عزیز .. با تشکر از این بحث مفید .. من یسوال دیگه این بار در مورد دستور backup  در sql داشتم .. من از این قالب برای دستور بکاپ استفاده میکنم : 
[/quote]

[/quote]

کد:
cdb.execSQL("BACKUP DATABASE " + FeedEntryCoast.Database_Name + " TO DISK='F:/management" +get_backupname+".bak'");
  ولی با ارور در syntax مواجه میشم !! 

کد:
sqlite returned: error code = 1, msg = near "BACKUP": syntax error, db=/data/data/zahra.management.project/databases/Coast_Database.db
 میشه راهنمایی کنید چرا ؟؟!!!
[/quote]



برای گرفتن Backup باید از دو کلاس پیشنهادی گوگل استفاده کنید
BackupagentHelper
ّFileBackupHelper

کد پی‌اچ‌پی:
A cleaner approach would be to create a custom BackupHelper:

public class 
DbBackupHelper extends FileBackupHelper {

 
   public DbBackupHelper(Context ctxString dbName) {
 
       super(ctxctx.getDatabasePath(dbName).getAbsolutePath());
 
   }
}
and 
then add it to BackupAgentHelper:

public 
void onCreate() {
 
   addHelper(DATABASE, new DbBackupHelper(thisDB.FILE));



کد پی‌اچ‌پی:
class MyBackupAgent extends BackupAgentHelper{
 
  private static final String DB_NAME "my_db";

 
  @Override
   
public void onCreate(){
 
     FileBackupHelper dbs = new FileBackupHelper(thisDB_NAME);
 
     addHelper("dbs"dbs);
 
  }

 
  @Override
   
public File getFilesDir(){
 
     File path getDatabasePath(DB_NAME);
 
     return path.getParentFile();
 
  }

با سلام.
من در جستجو به مورد عجیبی برخورد کردم.
جستجو در دیتابیسم به خوبی کار میکنه فقط در بیشتر موارد عبارراتی که دارای حرف "ک" باشند را پیدا نمیکنه!
البته برخی از عبارات حاوی حرف ک را پیدا میکنه اما تعداد زیادی را خیر.. ( بنابراین مطمئنم مشکل از کد نیست وگرنه هیچ کدام را نباید پیدا میکرد).

تنها در مورد این حرف فارسی مشکل داره. اینکه ابتدا وسط یا انتهای عبارت باشه فرقی نداره.


آیا کسی با این مشکل مواجه شده و یا چیزی به نظرش میرسه برای راهنمایی ؟
تشکر
(۱۳۹۵/۰۱/۲۸, ۱۱:۱۸ ق.ظ)msh نوشته: [ -> ]با سلام.
من در جستجو به مورد عجیبی برخورد کردم.
جستجو در دیتابیسم به خوبی کار میکنه فقط در بیشتر موارد عبارراتی که دارای حرف "ک" باشند را پیدا نمیکنه!
البته برخی از عبارات حاوی حرف ک را پیدا میکنه اما تعداد زیادی را خیر.. ( بنابراین مطمئنم مشکل از کد نیست وگرنه هیچ کدام را نباید پیدا میکرد).

تنها در مورد این حرف فارسی مشکل داره. اینکه ابتدا وسط یا انتهای عبارت باشه فرقی نداره.


آیا کسی با این مشکل مواجه شده و یا چیزی به نظرش میرسه برای راهنمایی ؟
تشکر

حل شد.
به خاطر استفاده از کاراکتر عربی بجای فارسی در بعضی متون بود.
(۱۳۹۵/۰۱/۲۸, ۰۲:۵۸ ق.ظ)mahdi10539 نوشته: [ -> ][quote pid='17266' dateline='1460717065']
[quote pid='17216' dateline='1460440873']
[quote pid='17199' dateline='1460357673']
سلام خدمت دوستان عزیز .. با تشکر از این بحث مفید .. من یسوال دیگه این بار در مورد دستور backup  در sql داشتم .. من از این قالب برای دستور بکاپ استفاده میکنم : 

[/quote]

کد:
cdb.execSQL("BACKUP DATABASE " + FeedEntryCoast.Database_Name + " TO DISK='F:/management" +get_backupname+".bak'");
  ولی با ارور در syntax مواجه میشم !! 

کد:
sqlite returned: error code = 1, msg = near "BACKUP": syntax error, db=/data/data/zahra.management.project/databases/Coast_Database.db
 میشه راهنمایی کنید چرا ؟؟!!!
[/quote]



برای گرفتن Backup باید از دو کلاس پیشنهادی گوگل استفاده کنید
BackupagentHelper
ّFileBackupHelper

کد پی‌اچ‌پی:
A cleaner approach would be to create a custom BackupHelper:

public class 
DbBackupHelper extends FileBackupHelper {

 
   public DbBackupHelper(Context ctxString dbName) {
 
       super(ctxctx.getDatabasePath(dbName).getAbsolutePath());
 
   }
}
and 
then add it to BackupAgentHelper:

public 
void onCreate() {
 
   addHelper(DATABASE, new DbBackupHelper(thisDB.FILE));



کد پی‌اچ‌پی:
class MyBackupAgent extends BackupAgentHelper{
 
  private static final String DB_NAME "my_db";

 
  @Override
   
public void onCreate(){
 
     FileBackupHelper dbs = new FileBackupHelper(thisDB_NAME);
 
     addHelper("dbs"dbs);
 
  }

 
  @Override
   
public File getFilesDir(){
 
     File path getDatabasePath(DB_NAME);
 
     return path.getParentFile();
 
  }


[/quote]

ممنون از پاسختون ... .. اما برای استفاده از این دو کلاس ، نیاز به ایجاد اکتیویتی جدید براشون دارم ؟ یا تو همون اکتیویتی اصلی که دارم بکاپ رو پیاده سازی میکنم باید از این ها استفاده کنم ؟؟ اصلا باید از هر دوشون استفاده کنم ؟
توی همون Activity هم میتونید اینها رو بزارید مشکل نداره
(۱۳۹۵/۰۱/۲۸, ۱۰:۲۵ ب.ظ)mahdi10539 نوشته: [ -> ]توی همون Activity هم میتونید اینها رو بزارید مشکل نداره
من توی اکتیویتی یه button دارم که با کلیک روی اون میخوام کار بکاپ انجام بشه ... در این حالت باید این دوتا کلاس رو کجا پیاده سازی کنم ؟