برنامه نویس، علاقه مند به لینوکس و نرم افزار آزاد. من در جاهای دیگه: ali77gh.ir
یه راه راحت برای کار با دیتابیس در اندروید
سلام. تو این پست میخوام یه library بهتون معرفی کنم کار با data تو اندروید رو خیلی راحت تر میکنه.
مشکل اصلی
خوب یادمه اون اولا که برنامه نویسی اندروید رو شرو کردم (یه سالو نیم پیش) کار کردن با database برام سخت بود و وقتی که میخواستم یه entity اضافه کنم باید کلی کد مینوشتم و مخصوصا اینکه با SQL آشنایی نداشتم و همیشه این کار برام عذاب آور بود. تا اینکه دیدم یه سری لایبری هست که بهشون میگن ORM که قراره کار با دیتابیس رو برامون راحت تر کنن. خوب منم رفتم سراغشون (مثلا GreenDAO ) ولی بازم حس خوبی نداشتم. نکه کار کردن باهاشون سخت باشه ها... ولی خوب احساس میکردم میتونه خیلی راحت تر باشه.
پس یه لایبری نوشتم :)
معرفی لایبری
اسمش هست EasyDataAndroid که اینجا میتونید پیداش کنید و خوب به جز دیتابیس یسری قابلیت برای کار کردن با فایل ها هم بهتون میده ولی اینجا ما با database کار داریم که قدم به قدم براتون توضیح میدم که چجوری میتونید کار کنید باهاش.
قدم اول : اضافه کردن به پروژه
۱. توی این صفحه میتونید لینک دانلود فایل .jar رو پیدا کنید.
۲. حالا اون فایلی که دانلود کردید رو فولدر /libs مسیر ماژولی که قراره توش از این لایبری استفاده کنید کپی کنید مثلا:
YOUR_PROJECT_NAME/app/libs
۳. گردل رو sync کنید.
قدم دوم : ساختن model
بقیه آموزش رو با مثال پیش میریم
حالا فرض کنید که ما میخوایم یه entity داشته باشیم به اسم user که n نمونه ازش داریم و میخوایم اطلاعات اونا رو بریزیم تو دیتابیس. خوب برای این کار یه interface به اسم model روی کلاس خودمون implement میکنم. کدمون یه چیزی تو مایه های زیر میشه:
public class User implements Model {
private String id;
public String name;
public String lastName;
public int age;
@Override
public String getId() {
return id;
}
@Override
public void setId(String id) {
this.id = id;
}
}
که شما رو مجبور میکنه که entity تون حتما id داشته باشه.
نکته ی دیگه اینکه model شما میتونه ابجکت های تو در تو داشته باشه یا حتی از لیست و ارایه و ... هم استفاده کنید.
قدم سوم : کلاسی که قراره معجزه کنه
خوب حالا یه کلاس به اسم UserDao میسازیم و از GenericDAO ارث میبریم و متد سازندش رو مینویسیم کدتون چیزی شبیه به این میشه:
public class UserDao extends GenericDAO<User> {
public UserDao(Context context) {
super(context, User.class, "User", true);
}
}
حالا پارامتر های متد سازنده ی genericDAO رو توضیح میدم(همون جا که نوشته super):
پارامتر اول: یه context دلخواه (مثلا activity یا service تون)
پارامتر دوم: نوع مدل شما (اسم همون کلاسی که بالاتر ساختیمش تهش یه .class بزارید)
پارامتر سوم: نام جدولتون که هر چی دوست دارید بزارید فقط نکتش اینه که نباید تکراری باشه (ینی اسم جدول برای دو تا model نباید یکی باشه)
پارامتر چهارم: اگه میخواید خودش id رو اتوماتیک generate کنه اینجا true پاس بدید و اگه میخواید خودتون id رو بسازید false پاس بدید.
قدم چهارم : استفاده کنید
خوب کارمون دیگه تمومه میتونید به راحتی ازش استفاده کنید
ابتدا یه نمونه از UserDAO میسازیم(اون this در واقع activty شما میتونه باشه).
UserDao db = new UserDao(this);
برای اضافه کردن یه user به دیتابیس:
db.Insert(user);
برای تغییر دادن مشخصات user تو دیتابیس(بر اساس id رکورد مورد نظرو پیدا میکنه):
db.Update(user);
برای پاک کردن اطلاعات یه user تو دیتابیس:
db.Remove(user.getId())
برای خوندن کل اطلاعات همه ی user ها:
List<User> users = db.getAll();
و حالا یه query با یه شرط (اگه به خروجی IsConditionTrue مقدار true برگردونید ینی اون record شرط رو داره و توی لیست alis حضور خواهد داشت):
List<User> alis = db.getWithCondition(new KeyValDb.Condition() {
@Override
public boolean IsConditionTrue(Object object) {
return ((User) object).name.equals("ali");
}
});
اینجا میتونید به راحتی query های خیلی پیچیده بنویسید(با زبان جاوا). که البته پیشنهاد میکنم در قالب یه متد بزاریدش توی کلاس UserDao . اینطوری قشنگ تره :)
سرعتش چطوره؟
در جواب این سوال باید بگم که کم تر از حالتیه که به صورت استاندارد بشینید SQL ها رو بنویسید. ولی اگه تعدارکورد هایی که دارید کم تر از 1000 تاس خوب عمل میکنه و خود من تو یونی تولز ازش استفاده کردم و توی یه نرم افزار دسکتاپی هم ازش استفاده دارم میکنم و مثل شیر کار میکنه :)
طبق تستی که من انجام دادم روی لپتاپم که سیستمش اینه:
cpu : intel i7 3520m , 2.9 GHz
storage : ssd 128
ram : ddr3
os : kubuntu 18.04
با چک کردن شرطی که مشابهش رو بالا مثال زدم بین 10000 تا رکورد به زمان 66ms رسیدم (که فکر میکنم اوکیه دیگه. نیس؟)
کلام آخر
و اینکه این لایبری قابلیت های دیگه ای هم داره مثلا باهاش میتونید bitmap ,Object , String ,ByteArray رو داخل فایل در یکی از فضا های LOCAL و EXTERNAL و CACHE ذخیره کنید و یا اینکه با استفاده از کلاس SafeBox میتونید اطلاعات مهم مثل password و... رو امن ذخیره کنید. که تمام این هارو تو اینجا توضیح دادم.
اگه مشکلی داشتید بپرسید ازم -> alighahremani1377@gmail.com
اگه انتقادی پیشنهادی چیزی داشتید ها اینجا مطرح کنید.
و اگه تو پروژه خودتون ازش استفاده کردید و دوستش داشتید حتما star کنیدش یا حداقل بهم ایمیل بزنید. این کارتون باعث خوشحالی من میشه :)
موفق باشید.
مطلبی دیگر از این انتشارات
حل مشکل اتصال به شبکه (مقصد فاقد TLS) و انتقال ترافیک cleartext در اندروید با API level 28
مطلبی دیگر از این انتشارات
توسعه اپلیکیشن های مدرن اندرویدی قسمت هفتم(آخر)
مطلبی دیگر از این انتشارات
پشتیبانی اپ های موبایلی