بسم اهلل الرحمن الرحیم آموزشگاه تحلیل داده تخصصی ترین مرکز برنامه نویسی و دیتابیس در ایران آموزش SQlite اول( )بخش مدرس : مهندس افشین رفوآ
آموزش SQlite )بخش اول( استفاده از پایگاه داده ی SQlite این فصل روش استفاده از پایگاه داده ی SQLite را در برنامه های کاربردی اندروید آموزش داده و همچنین روش استفاده از ContentProvider جاری و تعریف ContentProvider های جدید را تشریح می کند. سپس به )asynch( مبحث کاربرد loader framework می پردازد که امکان بارگذاری داده ها را به صورت ناهمگام فراهم می کند. فهرست محتوا SQLite.1 SQLite چیست کاربرد SQLite در اندروید.2 معماری SQLite پکیج ها ایجاد و بروز رسانی پایگاه داده به وسیله ی کالس SQLiteOpenHelper پایگاه داده ی SQLite مثالی از فراخوانی متد rawquery() مثالی از فراخوانی متد query() شی Cursor SimpleCursorAdapter و ListActivities ListViews 3. آموزش استفاده از SQLite SQLite آموزش نحوه ی کار با پایگاه داده ی
ایجاد پروژه پایگاه داده و مدل داده ای رابط کاربری راه اندازی برنامه های کاربردی 4. Provider Content و به اشتراک گذاری داده ها Content provider چیست نحوه ی دسترسی به Content Provider ایجاد Content Provider اختصاصی Content Provider و بحث امنیت thread safety )ایمنی نخ( 5. آموزش استفاده از Content Provider بررسی اجمالی ایجاد بخش مخاطبین در محیط شبیه ساز استفاده از Content Provider مخاطبین.6 کالس Loader هدف و کاربرد کالس Loader پیاده سازی کالس Loader پایگاه داده ی SQLite و کالس CursorLoader Loader و Cursor.7.8 آموزش : SQLite Content Provider اختصاصی و کالس Loader توضیح مختصر پروژه
کالس های ویژه ی مدیریت پایگاه داده ایجاد Content Provider منابع طرح بندی ها Activity ها راه اندازی برنامه 9. دسترسی مستقیم به پایگاه داده ی SQLite محل ذخیره سازی پایگاه داده ی SQLite پوسته ی دسترسی access( )shell به پایگاه داده ی SQLite. 10 افزایش و بهینه سازی کارایی SQLite.1 SQLite چیست SQLite در حقیقت یک پایگاه داده ی منبع آزاد source( )open است. SQLite از ویژه گی های پایگاه داده ی SQL (syntax) رابطه ای database( )relational متعارف و استاندارد از جمله ترکیب نحوی تراکنش ها )transaction( و prepared statement پشتیبانی می کند. گفتنی است که پایگاه داده ی نام برده در زمان اجرا به مقدار حافظه ی بسیار محدود و ناچیزی نیاز دارد )حدود 250 کیلوبایت( از همین رو گزینه ی بی نظیر گزینه ی مناسبی برای گنجاندن در دیگر runtime ها تلقی می گردد. SQLite از نوع دادهای TEXT )مشابه String در جاوا( INTEGER )مشابه long در جاوا( و REAL )مشابه double در جاوا( پشتیبانی می کند. هر نوع داده ی دیگری باید پیش از ذخیره سازی در پایگاه داده به یکی از فیلدهای باال تبدیل شود. خود پایگاه داده ی SQLite بررسی )اعتبار سنجی( نمی کند آیا نوع داده های نوشته شده در ستون ها از نوع های تعریف شده real( )text intger در این پایگاه داده هستند یا خیر برای مثال
برنامه نویس می تواند یک عدد صحیح )integer( داخل ستون رشته column( )string بنویسد و یا عکس آن را انجام دهد. جهت کسب اطالعات بیشتر می توان به وب سایت تحلیل داده به نشانی www.tahlildadeh.com مراجعه کرد. کاربرد SQLite در اندروید پایگاه داده ی مزبور بدون استثنا در تمامی دستگاه های اندروید گنجانده شده به همین دلیل استفاده از آن نیازی به فرایند نصب و مدیریت پایگاه داده ندارد. کافی است دستورات SQL را ویژه ی ایجاد و بروز رسانی پایگاه داده تعریف کنید سپس محیط یا پلتفرم اندروید خود به صورت خودکار پایگاه داده را برای شما مدیریت می کند. دسترسی به سیستم فایل الزمه ی دسترسی به پایگاه داده ی SQLite می باشد گرچه این فرایند ممکن است کمی کند صورت گیرد. به همین دلیل توصیه می شود عملیات مربوط به پایگاه داده را به صورت ناهمگام )asynch( انجام دهید. پایگاه داده ای که توسط اپلیکیشن ایجاد می شود به صورت پیش فرض در دایرکتوری DATA/data/APP_NAME/databases/FILENAME ذخیره می گردد. بخش های مختلف دایرکتوری فوق بر اساس این قوانین ساخته می شوند : DATA مسیری است که متد Environment.getDataDirectory() بازمی گرداند APP_NAME اسم اپلیکیشن است و FILENAME نیز اسمی است که برای پایگاه داده در کد برنامه ی کاربردی خود مشخص می کنید.
.2 معماری SQLite پکیج ها بسته ی android.database دربردارنده ی تمامی کالس های مورد نیاز جهت کار با پایگاه های داده می باشد این در حالی است که پکیج android.package.sqlite حامل کلیه ی کالس های ویژه ی پایگاه داده ی SQLite است. SQLiteOpenHelper ایجاد و بروز رسانی پایگاه داده به وسیله ی کالس به منظور ایجاد و ارتقا یک پایگاه داده در برنامه ی اندروید الزم است یک زیرکالس از کالس SQLiteOpenHelper ایجاد کنید. ابتدا در سازنده )constructor( ی زیرکالس متد () super )مشتق کالس )SQLiteOpenHelper را فرامی خوانید و بدین ترتیب اسم پایگاه داده و نسخه ی جاری پایگاه داده ی ذکر شده را مشخص می کنید. حال در این کالس باید متدهای زیر را جهت ایجاد و بروز رسانی پایگاه داده بازنویسی )override( کنید. در صورتی توسط framework صدا زده می شود که به پایگاه داده ی مورد نظر oncreate () دسترسی پیدا شده اما پایگاه داده ی بیان شده خود هنوز ایجاد نشده است. () onupgrade زمانی فراخوانده می شود که نسخه ی پایگاه داده در کد اپلیکیشن ارتقا یافته باشد. به کمک این متد می توان شمای جاری پایگاه داده schema( )database را بروز رسانی کرد یا پایگاه داده را به طور کلی حذف )drop( کرد و آن را دوباره با متد oncreate ساخت. هر دو متد یک شی SQLiteDatabase به عنوان پارامتر دریافت می کنند که قالب نمایشی جاوا از پایگاه داده می باشد. کالس SQLiteOpenHelper جهت دسترسی به شی SQLiteDatabase در حالت خواندن mode( )read متد () getreadabledatabase و در write mode متد () getwriteabledatabase را ارائه می هد.
جدول های پایگاه داده table( )database باید از شناسه ی _id برای کلید اولیه key( )primary استفاده کند. بدیهی است که بسیاری از توابع اندروید بر این استاندارد تکیه دارند. نکته توصیه می شود برای هر جدول )table( یک کالس مجزا ایجاد شود. این کالس متدهای ایستا () oncreate و را تعریف می کند. متدهای مزبور در متدهای مطابق و مربوطه مشتق کالس onupgrade () SQLiteOpenHelper فراخوانده می شوند. بدین ترتیب پیاده سازی کالس SQLiteOpenHelper حتی زمانی که شما چندین جدول باهم دارید خوانا باقی می ماند. SQLite پایگاه داده ی SQLiteDatabase در واقع کالس پایه برای کار با پایگاه داده ی SQLite در اندورید بوده و متدهایی به منظور بازکردن بستن بروز رسانی و پرس و جو از پایگاه داده فراهم می کند. متدهایی که SQLiteDatabase ارائه می دهد عبارتند از () insert update () و ().delete SQL البته عالوه بر توابع نام برده () execsql متد را نیز عرضه می کند که امکان اجرای دستور را به صورت مستقیم فراهم می آورد. شی ContentValues امکان تعریف کلیدها/مقادیر را فراهم می کند. key )کلید( در حقیقت نشانگر شناسه ی ستون در جدول بوده و Values )مقادیر( محتوای رکورد را در این ستون نمایش می دهد. از شئ ContentValues همچنین می توان برای درج )insert( و بروز رسانی داده استفاده کرد. query () rawquery () پرس و جوها )Queries( را می توان با فراخوانی متدهای و و یا از طریق کالس SQLiteQueryBuilder ایجاد کرد. متد () rawquery مستقیم دستور )SQL( select را به عنوان ورودی )input( می پذیرد. متد () query یک رابط ساخت یافته ویژه ی مشخص کردن یا تعیین پرس و جوی SQL فراهم می کند.
convenience یک class )کالسی که به منظور ایجاد سهولت در انجام تسک های SQLiteQueryBuilder دشوارتر و پیچیده طراحی شده و بکار می رود( می باشد که در ایجاد پرس و جوهای SQL به برنامه نویس کمک می کند. )(rawquery مثالی از فراخوانی متد تکه کد زیر نمونه ای از فراخوانی متد () rawquery را نمایش می دهد. Cursor cursor = getreadabledatabase(). rawquery("select * from todo where _id =?" new String[] { id }); )(query مثالی از فراخوانی متد کد زیر مثالی از فراخوانی متد () query را ارائه می دهد. return database.query(database_table new String[] { KEY_ROWID KEY_CATEGORY KEY_SUMMARY KEY_DESCRIPTION } null null null null null); جدول 1. پارامترهای متد () query توضیح پارامتر نام جدول که query بر اساس آن کامپایل می شود String dbname String[] columnnames String whereclause لیستی است که مشخص می کند کدام ستون های جدول برگردانده شوند. ارسال null تمامی ستون ها را باز می گرداند. ; Where-clause فیلتری است که گزینش و انتخاب داده را مدیریت می کند. ارسال null کلیه ی داده ها را انتخاب می کند.
String[] selectionargs String[] groupby می توانید را داخل "whereclause" بگنجانید. این placeholder ها توسط مقادیر آرایه ی selectionargs جایگزین می شود. فیلتری است که نحوه ی گروه بندی سطرها را تعریف می کند. ارسال null مانع از گروه بندی سطرها می شود. گروه ها را فیلتر می کند. ارسال null باعث می شود هیچ فیلتری صورت نگیرد. String[] having String[] orderby ستون های جدول که جهت مرتب سازی داده ها بکار می رود. null ارسال یعنی هیچ مرتب سازی صورت نمی گیرد. چنانچه شرطی مورد نیاز نبود می توانید null ارسال کنید. "where" بدون واژه ی "where" مشخص می شود به طور مثال یک دستور ممکن است "whereclause" چیزی شبیه آنچه در زیر مشاهده می کنید باشد. "_id=19 and summary=?" در صورتی که مقادیر placeholder را به وسیله ی? در where clause تعریف کنید در واقع دارید آن مقادیر را به عنوان پارامتر selectionargs به query )پرس و جو( ارسال می کنید. Cursor شی query Cursor یک شی cursor بازمی گرداند. نشانگر نتیجه ی پرس و جو یا است و به یکی از Query سطرهای نتیجه ی پرس و جو اشاره دارد. بدین وسیله اندروید می تواند نتایج پرس و جو را به صورتی کارامدتر و موثرتر بافر یا به صورت موقت ذخیره کند )به این خاطر که دیگر نیازی نیست همه ی داده را داخل حافظه بارگذاری کند(. برای بدست آوردن تعداد المان های نتیجه ی پرس و جو از متد () getcount استفاده کنید.
به منظور راه گزینی و پیمایش از یک سطر داده row( )data به سطری دیگر می توان از متدهای movetofirst () و () movetonext بهره گرفت. متد )( isafterlast به شما اجازه می دهد بررسی کنید آیا به انتهای نتیجه پرس و جو رسیده اید یا خیر. )strongly typed از جمله / متدهای get*() )نوع آن به طور کامل مشخص شده Cursor getstring(columnindex) را جهت دسترسی به داده های ستون مربوط به getlong(columnindex) موقعیت کنونی نتیجه ارائه می دهد. "columnindex" پیدا می کنید. نیز همان شماره ی ستونی است که به آن دسترسی column ( همچنین متد (String) getcolumnindexorthrow را برای دستیابی به شاخص ستون Cursor )index مربوط به اسم ستون جدول فراهم می کند. شی Cursor را می توان با فراخوانی متد () close بست. SimpleCursorAdapter و ListActivities ListViews همان طور که می دانید ListView ها عبارتند از View هایی که امکان نمایش فهرستی از آیتم ها را فراهم می آورد. ListView نیز در حقیقت activity های تخصصی هستند که استفاده از ها را تسهیل می ListActivities بخشند. جهت کار با پایگاه های داده و ListView ها می توان از کالس simplecursoradapter بهره گرفت. کالس ذکر شده اجازه می دهد ویژه ی هر سطر از listviews یک layout انتخاب کنید. همچنین الزم است یک آرایه که دربردارنده ی اسم های ستون و آرایه ی دیگر که حاوی شناسه های Views باشد تعریف کنید. شناسه های views نیز باید با داده ی مورد نیاز پر شود.
کالس simplecursoradapter ستون ها را در views بر اساس Cursor ای که به آن ارسال شده نگاشت می کند. به منظور دستیابی به Cursor از کالس Loader کمک بگیرید. 3. آموزش استفاده از SQLite SQLite آموزش نحوه ی کار با پایگاه داده ی در این بخش نحوه ی کار با پایگاه داده ی SQLite تشریح می شود. جهت مدیریت بهینه ی داده از شئ دسترسی به داده DAO( )data access object = کمک می گیریم. DAO وظیفه ی مدیریت اتصال به پایگاه داده دسترسی و اصالح داده را بر عهده دارد. مسئولیت دیگر آن نیز در تبدیل پایگاه داده به اشیإ واقعی جاوا خالصه می شود به طوری که کد رابط کاربری ما دیگر مجبور به برخورد با persistence layer ماندگاری( نباشد. (الیه ی در نتیجه ی برنامه ی کاربردی که تولید می شود به شکل زیر خواهد بود.
الزم به ذکر است که همیشه استفاده از DAO رویکرد صحیحی نیست. توجه داشته باشید که استفاده از DAO منجر به تولید model object جاوا می شود این در حالی است که در صورت استفاده ی مستقیم از خود پایگاه داده یا از روش Content Provider می توان از ایجاد model object دوری کرد و به همین دلیل از منابع کمتری بهره گرفت.