اجرای Query طولانی (برای ایمپورت اطلاعات) در SQLITE
سلام به اندروید باز ها !
دوستان من الان رسیدم به آموزش SQLITE و گفتم یه برنامه ای بنویسیم 4 نفر استفاده کنن برای خودمم تمرین بشه !
آقا همه چی آروم بود تا اونجایی که میخوام وقتی توی کلاس G دیتابیس رو بسازم و محتوای برنامه رو داخل دیتابیس قرار بدم !
چون کوئری طولانی هست ، شامل محتوای فارسی و گاهی ' ? ! *&^%$#@ و کلا سمبل هاست و حالا حتی خود Eclips هم ارور میده و حق هم داره !
استاد توی آموزش ها یه اشاره ای کردن که خوندن از فایل تکست که بعدا یادش میگیریم ، خوب حالا من چی کار کنم ؟
اگه امکانش هست یه راهنمایی کنید ، خوندن از فایل تکست هم لطفا کدش رو بزارید که استفاده کنیم ، هرچند استاد توضیح خواهد داد
ممنون :)
اول از همه اینکه طولانی شدن Query نباید مشکلی ایجاد کنه اما امان از اون وقتی که Query نامعتبر میشه ( مثلاً با حروف " و ... ) در این شرایط چندین راه وجود داره که لزوماً یکی بهتر از دیگری نیست و کاملاً بسته به شرایط هست.
مثل همین محیط پرسش و پاسخ. شما در اون می تونید source code درج کنید که شامل همه کاراکتر های غیر معتبر باشه، اما خطایی در درج رخ نمیده. حالا چطوری؟
یکی اینکه همه کاراکترهای غیر مجاز باید escape بشن. یا این escape شدن رو باید خودتون بنویسید مثلاً هر جا " دیده شد Replace کنید با "\ که این اتفاق باید برای همه کاراکترهای غیر مجاز بیافته و نه به همین سادگی چون اونوقت ممکنه داخل متن "\ داشته باشید و وقتی replace میشه میشه "\\ که غلط هست.
یا اینکه باید از توابع ( Lib ) های آماده یا Native استفاده کنید.
اما راه دوم که بسیار بسیار ساده تر هست اما امکان جستجو در متن رو ازتون می گیره، Encode کردن داده ها هست. مثلاً استفاده کردن از Base64 و ... به این ترتیب خروجی شما ترکیبی از حروف و اعداد هست و هیچ کاراکتری غیر از اینها داخلش نیست و با خیال راحت توی Database میشینه. برای باز کردنش هم کافیه با همون الگوریتمی که Encode شده Decode کنید.
امیدوارم نتیجه مطلوب رو گرفته باشید.
خوب ، اول از دوستان تشکر میکنم ، چون تعداد جوابا زیاد بود ببخشید دیگه نمیشه یکی یکی تشکر کرد !
اخه بابا بیاید حداقل ایده ای که واسه حلش دارید بگید ، الان این جواب جایی نبود و ایده ی خودم بود !
به جای ذخیره ی یک دیتابیس حجیم در منابع برنامم ، یک دستور طولانی رو توی یه متغییر توی Strings.xml ذخیره کردم ، کوئری به تک کوتیشن خیلی حساسه ، پس اگر در متن وجود داره ، با '' جابه جای کردم ، بعد بین هر کوئری به جای ; از ;;; استفاده کردم ، چون احتمال داره ; توی متن باشه ولی ;;; احتمالش کمتره !
بعد یه دستور برای اجرای تک تک کوئری با جداکننده ;;;
public static void MultipleQueryExec(String sql)
{
String[] separated = sql.split(";;;");
for (String query: separated)
{
try {
database.execSQL(query);
}
catch (SQLiteException e) {
Log.i("NEGANO", e.getMessage().toString());
}
}
}
دیگه مشکل هر شد و هزاران کوئری هم اجرا خواهد شد !
یه ارور عجیب دیدم که واسش try catch گذاشتم !
برنامه کرش میکنه و اروری که sqlite میده چی باشه خوبه ؟ not an error !
آخه اگه اروری نیست چرا کرش میکنی ؟
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .