CRUD مخفف كلمه و واژه هاي Create در معناي «ساختن»، Read در معناي «تلاوت»، Update در معناي «آپ تو ديت رساني» و Delete در معناي «حذف كردن» ميباشد و اشاره به دستوراتي در SQL داراهستند طراحي اپليكيشن كه براي تغييرو تحول اطلاعات به كارگيري ميشوند.
در كد تحت عمليات Create (ساختن) را ميبينيد. راياپارس يك شي از فرآورده User و يك شي از مال Organization ميسازيم و آنهارا از روش يك تراكنش (Transaction) در ديتابيس ذخيره ميكنيم:
// Mohamadreza Amani
// Email: help4usr@gmail.com
final Organization organization = new Organization();
organization.setName("Android");
final User user = new User();
user.setName("Mohamadreza Amani");
// Get the DAO
final UserDao userDao = ((MyDatabaseApplication) getApplicationContext()).getMyDatabase().userDao();
// Define the task
((MyDatabaseApplication) getApplicationContext()).getMyDatabase().runInTransaction(new Runnable() {
@Override
public void run() {
userDao.insertOrganization(organization);
userDao.insertUser(user);
}
});
كوئري ديتابيس
همه كوئري ها بايستي در كلاس هاي مرتبط با دسترسي به اطلاعات (DAO) نوشته شوند.
در صورتي بخواهيم به شكلي درباره استفاده كننده (User) جست و جو كنيم كه اسم سازمان (Organization) اورا نيز بدست آوريم. ميتوانيم به طور ذيل كوئري را بنويسيم:
// declare inner join here
@Query("SELECT User.*, Organization.name AS organization_name FROM User INNER JOIN Organization " +
"ON User.organization_id = Organization.id WHERE User.id = :id")
public UserWithOrganization getWithOrgById(int id);
در كوئري بالا بجاي به كار گيري از (organization.name) از organization_name به كارگيري كرديم و براي اينكار از سخن AS به كار گيري كرديم. با اينكار مي قدرت اختلال همنام بودن رديف ها در جدول هاي گوناگون را حل كرد به عنوان مثالً هر دو جدول Organization و User ستوني به اسم name داراهستند. براي به كارگيري از مقدار بازگشتي اين روال كه مشتمل بر User و organization_name ميباشد مي بايست كلاس جديدي بسازيم. اسم اين كلاس را در كد بالا UserWithOrganization گذاشتيم كه كد آن به طور تحت ميباشد. اين كلاس بايستي دربرگيرنده فيلد هايي باشد كه در فرمان select بالا تعيين كرديم يعني مجموع رديف هاي جدول user و organization_name :
// Mohamadreza Amani
// Email: help4usr@gmail.com
class UserWithOrganization {
// @Embedded نشان گذاري
// با حفظ كپسوله سازي ، آبجكت كاربر را در اين شي قرار مي دهد
@Embedded User user;
// organization_name renamed during SELECT query w/ Organization.name AS organizaiton_name
@ColumnInfo(name = "organization_name")
String organizationName;
}
بعداز به كارگيري از نماد گذاري Embedded@ براي User ميتوانيد به آحاد صفات كلاس User درون كلاس بالا دسترسي داشته باشيد:
UserWithOrganization userWithOrg = new UserWithOrganization();
User user = userWithOrg.user;
فرض فرمائيد كه ميخواهيم تك تك رديف هاي جدول Organization را كوئري كنيم و در كنار جدول User باطن يك كلاس داشته باشيم. نقص اينجاست كه هر دوي جدول هاي Organization و User رديف هاي همنام مثل id داراهستند. نحوه رفع اين خلل به كارگيري از الگوي prefix يا اين كه پيشوندي ميباشد. به طور ذيل:
// Mohamadreza Amani
// Email: help4usr@gmail.com
class UserWithOrganization {
// @Embedded نشان گذاري
// با حفظ كپسوله سازي ، آبجكت كاربر را در اين شي قرار مي دهد
@Embedded User user;
//Organization تمام فيلد هاي جدول
// پيشوند مي گيرند:
//( org_id, org_name, …)
@Embedded(prefix="org_") Organization organization;
}
روال درون كلاس DAO براي به چنگ آوردن اطلاعات از نوع بالا به طور پايين مي گردد:
// declare inner join here
@Query("SELECT User.*, Organization.name AS org_name, Organization.id as org_id FROM User INNER JOIN Organization " +
"ON User.organization_id = Organization.id WHERE User.id = :id")
public UserWithOrganization getWithOrgById(int id);
اين كوئري را مي قدرت با امداد AsyncTask به طور ذيل استفاده نمود:
final UserDao userDao = ((MyDatabaseApplication) getApplicationContext()).getMyDatabase().userDao();
AsyncTask.execute(new Runnable() {
@Override
public void run() {
UserWithOrganization userWithOrganization = userDao.getWithOrgById(1);
});
};
بازدید: