در قسمت پنجم آموزش اندروید در ادامه آموزش قبل مبحث Content Provider ها یا تامین کننده محتوی , تمامی مراحل ایجاد یک ContentProviderr را از کلاس دیتابیس و کوری های مورد نیاز تا کلاس ContentProvider را به صورت کامل و با جزییات شرح خواهیم داد پس با ما همراه باشید..
آموزش های مربوط بهContent Provider را در آموزش قبل به صورت کامل ارئه شد. در این بخش قصد داریم یک تامین کننده محتوی را ایجاد کنیم برای این کار نیاز به دو کلاس داریم یکی کلاسی که از ContentProvider ارث بری میکند و دیگری کلاسی که حاوی دستورات SQL میباشد و از SQLiteOpenHelper چنین کدنویسی میکنیم که ما برای درک بیشتر این مبحث مرحله به مرحله کدنویسی را پیش میبریم
۱-ابتدا کلاس SQL خود را با نام دلخواه ایجاد میکنیم
public class Database extends SQLiteOpenHelper{ private static final String DATABASE_NAME="MYDB.db"; private static final String TABLE_NAME="myTbl"; private static final String SQL_CREATE="create table " + TABLE_NAME + "(_id integer primary key , name text , family text , address text )"; private static final String SQL_DROP="drop table is exists" + TABLE_NAME; Database(Context context) { super(context, DATABASE_NAME,null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(SQL_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) { db.execSQL(SQL_DROP); onCreate(db); }
دو متد onCreate و onUpgrade و سازنده Database مربوط به کلاس SQLiteOpenHelper میباشد و حتما باید ایجاد شوند که میتوانید اشارگر را روی نام کلاس نگه داشته و از کادر باز شده گزینه Add unimplemented را انتخاب کنیم تا این متدها و سازنده ایجاد شوند سپس دستورات مورد نیاز را در آن قرار دهیم. متغیرهای تعریف شده در ابتدا کلاس نیز همانگونه که از نامشان مشخص است نام دیتابیس و جدول و همچنین کوری مربوط به ایجاد جدول و بارگزاری درصورت وجود داشتن را مشخص میکنند در متد های onCreate و onUpgrade نیز کوری های تعیین شده را قرار داده ایم.
public long addnewStudent(ContentValues values)throws SQLException{ long id =getWritableDatabase().insert(TABLE_NAME, "", values); if(id <=0){ throw new SQLException("failed to add an student"); } return id; }
همچنین میتوانید دستوراتی چون حذف و اضافه و آپدیت مقادیر درون جدول را نیز اعمال کنید برای مثال در تکه کد فوق دستورات ایجاد یک رکورد جدید در جدول را مشاهده میکنید.
برای توضیح عبارت فوق میتوان گفت برای ایجاد یک رکورد از متد insert استفاده میکنیم که شامل سه پارامتر است : نام جدول , مقدار اختیاری nullColumnHack و مقادیری که باید در رکورد قرار گیرند و در انتها نیز شرطی برای اطمینان حاصل کردن از ایجاد صحیح رکورد در نظر گرفته شده.
public int updateStudent(String id, ContentValues values){ if(id==null){ return getWritableDatabase().update(TABLE_NAME, values, null, null); }else{ return getWritableDatabase(). update(TABLE_NAME, values, "_id=?",new String[]{id}); } } public int deleteStudent(String id){ if(id==null){ return getWritableDatabase().delete(TABLE_NAME, null, null); }else{ return getWritableDatabase().delete(TABLE_NAME, "_id=?", new String[]{id}); } }
تکه کدهای فوق نیز برای حذف و ویرایش جدول بکار میرود که براساس دو حالت این عملیات را انجام میدهد یکی با id مشخص و دیگری بدون id که در آن صورت به روی کل جدول اعمال خواهد شد.
حال باید کلاس Content Provider را ایجاد کنیم
import android.content.ContentProvider; import android.content.ContentUris; import android.net.Uri; import android.content.ContentValues; import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; public class mContentProvider extends ContentProvider { private static final String PROVIDER_NAME="com.example.mycontentprovider"; private static final Uri CONTENT_URI=Uri.parse("content://" + PROVIDER_NAME + "/stu"); private static final int STU=1; private static final int STU_ID=2; private static final UriMatcher uriMatcher=getUriMatcher(); private static UriMatcher getUriMatcher(){ UriMatcher uriMatcher=new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(PROVIDER_NAME, "stu", STU); uriMatcher.addURI(PROVIDER_NAME, "stus/#", STU_ID); return uriMatcher; } private Database db=null;
نام provider باید یک نام یکتا باشد که میتوان از نام پکیج برنامه استفاده کرد که در ادامه در URI از آن استفاده خواهیم کرد و Content_URI در واقع آدرس این ContentProvider است و برای آدرس دهی از آن استفاده میشود که شامل چهار بخش است
متغیر uriMacher نیز دو نوع آدرس را مشخص میکند یکی به صروت ساده نوشته شده که اشاره به تمامی اطلاعات دارد و دیگری تنها اشاره به یک سطر مشخص که با id مشخص میشود دارد. و در انتها نیز یک شی از نوع کلاس دیتابیس برای فراخوانی توبع درونش ایجاد کرده ایم.
کلاس ContentProvider نیز مانند کلاس SQLiteOpenHelper به دلیل Abstract بودن شامل متدهایی هستند که حتماباید ایجاد شود که به دو صورت میتوانید این متد هارا ایجاد کنید یکی به صورت دستی و دیگری به روشی که درابتدا آموزش گفته شد. درادامه یکی یکی این توابع را بررسی خواهیم کرد
@Override public String getType(Uri uri){ switch(uriMatcher.match(uri)){ case STU: return "vnd.android.cursor.dir/vnd.com.example.mycontentprovider"; case STU_ID: return "vnd.android.cursor.item/vnd.com.example.mycontentprovider"; } return ""; }
متد getType نوع MIME اطلاعات URI داده شده را برمیگرداند شکل کلی این uri بدین صورت است vnd.<uri pattern>./vnd.<name>.<type> که بدین شرح است
@Override public boolean onCreate(){ Context context=getContext(); db =new Database(context); return true; }
متد onCreate هنگامی که تامین کننده محتوی شروع بکار میکند فراخوانی میشود که همانگونه که مشاهده میکنید از متغیر db برای فراخوانی کلاس دیتابیس استفاده شده و context برنامه را نیز به سازنده کلاس ارسال کرده.
@Override public Cursor query(Uri uri, String[] projrction , String Selection ,String[] SelecionArgs , String sortOrder){ String id=null; if(uriMatcher.match(uri)==STU_ID){ id=uri.getPathSegments().get(1); } return db.getStudent(id, projrction, Selection, SelecionArgs, sortOrder); }
متد query یک درخواست از سمت کاربر دریافت میکند و آن را به شکل شی cursor برمیگرداند.
@Override public Uri insert(Uri uri ,ContentValues values){ try{ long id=db.addnewStudent(values); Uri returnUri=ContentUris.withAppendedId(CONTENT_URI, id); return returnUri; }catch(Exception e){ return null; } }
متد insert یک رکورد جدید در contentprovider ایجاد میکند.
@Override public int delete(Uri uri, String selection, String[] selectionArgs){ String id=null; if(uriMatcher.match(uri)==STU_ID){ id=uri.getPathSegments().get(1); } return db.deleteStudent(id); } @Override public int update(Uri uri, ContentValues values, String selection ,String[] selectionArgs){ String id=null; if(uriMatcher.match(uri)==STU_ID){ id=uri .getPathSegments().get(1); } return db.updateStudent(id, values); }
دو متد update , delete نیز برای ویرایش و حذف از کلاس دیتابیس استفاده میکنند.