فریم ورک های بسیاری در زمینه دیتابیس اندروید ارائه شده که هرکدام مزیت ها وکمبود های خاص خود را دارند و این به عهده برنامه نویس است که با شناسایی نیاز های خود بتواند بهترین را برگزیند و استفاده کند.
درادامه سورس کد ۴ فریم ورک رایج دیتابیس را به شما عزیزان ارائه خواهیم داد تا بتوانید یک دید کلی برروی آنها داشته باشید و قدرت انتخاب بالاتری داشته باشید.
ما برای ۴ کتابخانه دیتابیس REALM ,SQLite ,SUGAR ORM ,GREEDAO سورس کد شامل ۴ دستور اصلی SELECT , READ , INSERT , UPDATE تهیه و به شما عزیزان ارائه کردیم
برای دانلود سورس کد میتونید به کانال تلگرام ما مراجعه کنید
تعریفی که SQLite از خود دارد
SQLite is a self-contained, high-reliability, embedded, full-featured, public-domain, SQL database engine. SQLite is the most useddatabase engine in the world
یک انجین پایگاه داده بسیار کاربردی و محبوب بین برنامه نویسان که از ویژگی های گفته شده : مستق , مطمئن, تعبیه شده , کامل از آپشن های مورد نیاز و عمومی است
که همانطور که از نامش مشخص است با دستورات SQL که به صورت String نوشته میشود کار میکند و همین امر مشخص کننده این است که ک نمیتوان متوجه خطاهایی دستور نوشته شده شد
چون کامپایل نمیشود پس باید آشنایی لازم با دستورات SQL داشته باشید تا در سینتکس دستورات دچار اشتباه نشوید.
برای شروع کار باید یک بانک داده SQLite با استفاده از ابزارهای مختلفی مثل sqlite manager که به عنوان افزونه یا plugin برای کروم و فایرفاکس ارائه شده و یا ابزار سیستمی navicat که امکان مدیریت ارتباطات بین جداول را به شما میدهد , با هر تعداد جدول مورد نیاز ایجاد کنید(ما در این آموزش تنها یک جدول Person با فیلد Name ,ID داریم) و به فولدر databases در فولدر assests اضافه کنید
برای ایجاد فولدر assests هم تنها کافی ست برروی ماژول app کلیک راست کرده و New/ Folder / Assest Folder رو انتخاب کنید.
compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:2.0.1'
سپس یک کلاس برای اتصال به دیتابیس که مشخص کننده نام و ورژن دیتابیس هست ایجاد کنید به صورت زیر
package com.tejariapp.sqlite; import android.content.Context; import com.readystatesoftware.sqliteasset.SQLiteAssetHelper; public class DatabaseOpenHelper extends SQLiteAssetHelper { private static final String DATABASE_NAME = "Persondb.db"; private static final int DATABASE_VERSION = 1; public DatabaseOpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } }
و سپس یک کلاس دیگر برای ایجاد دستورات و کوئری های بانک
package com.tejariapp.sqlite; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.nfc.tech.NfcA; import android.util.Log; import java.util.ArrayList; public class DatabaseAccess { private SQLiteOpenHelper openHelper; private SQLiteDatabase database; private static DatabaseAccess instance; /** * Private constructor to aboid * object creation from outside classes. * * @param context */ private DatabaseAccess(Context context) { this.openHelper = new DatabaseOpenHelper(context); } /** * Return a singleton instance of DatabaseAccess. * * @param context the Context * @return the instance of DabaseAccess */ public static DatabaseAccess getInstance(Context context) { if (instance == null) { instance = new DatabaseAccess(context); } return instance; } /** * Open the database connection. */ public void open() { this.database = openHelper.getWritableDatabase(); } /** * Close the database connection. */ public void close() { if (database != null) { this.database.close(); } } /** * Read all person from the database. * * @return a List of persons */ public ArrayList<Person> getAllPersons() { ArrayList<Person> persons = new ArrayList<>(); Cursor cursor = database.rawQuery("SELECT * FROM Person " , null); cursor.moveToFirst(); while (!cursor.isAfterLast()) { persons.add(new Person(cursor.getInt( cursor.getColumnIndex("ID")) , cursor.getString( cursor.getColumnIndex("Name")))); cursor.moveToNext(); } cursor.close(); return persons; } /** * Insert record into Person * * @return a boolean value base of inserting or not */ public Person insertSQLite(String name) { Person person = null; try { database.execSQL("INSERT INTO Person(Name) VALUES('" + name + "')"); Cursor cursor = database .rawQuery("SELECT * FROM " + "Person ORDER BY ID DESC LIMIT 1" , null); if (cursor.moveToFirst()) person = new Person(cursor.getInt( cursor.getColumnIndex("ID")) , cursor.getString( cursor.getColumnIndex("Name"))); } catch (Exception e) { Log.e("insert SQLite bug", e.toString()); person = null; } return person; } /** * Update record into Person * * @return a boolean value base of updating or not */ public boolean updateSQLite(String name, int id) { try { database.execSQL("UPDATE Person SET Name='" + name + "' WHERE ID=" + id); return true; } catch (Exception e) { Log.e("update SQLite bug", e.toString()); return false; } } /** * Delete record from Person * * @return a boolean value base of deleting or not */ public boolean deleteSQLite(int id) { try { database.execSQL("DELETE FROM Person WHERE ID=" + id); return true; } catch (Exception e) { Log.e("delete SQLite bug", e.toString()); return false; } } }
/* * insert a record in database */ private void insertSQLite() { String newName = nameEditText.getText().toString().trim(); if (!newName.isEmpty()) { DatabaseAccess databaseAccess = DatabaseAccess.getInstance(this); databaseAccess.open(); Person person = databaseAccess.insertSQLite(newName); if (person != null) { personsList.add(person); customAdapter.notifyItemInserted( personsList.size() - 1); } databaseAccess.close(); } } /* * update a record in database by id of that */ private void updateSQLite() { String newName = nameEditText.getText() .toString().trim(); if (!newName.isEmpty()) { DatabaseAccess databaseAccess = DatabaseAccess.getInstance(this); databaseAccess.open(); Person person=personsList.get(position); if (databaseAccess.updateSQLite( newName,person.getId())){ person.setName(newName); personsList.set(position,person); customAdapter.notifyItemChanged(position); } databaseAccess.close(); position=-1; } } /* * delete record from database */ private void deleteSQLite() { DatabaseAccess databaseAccess= DatabaseAccess.getInstance(this); databaseAccess.open(); if (databaseAccess.deleteSQLite( personsList.get(position).getId())){ personsList.remove(position); customAdapter.notifyDataSetChanged(); } position=-1; databaseAccess.close(); } /* * read all database records */ private void readSQLite() { DatabaseAccess databaseAccess = DatabaseAccess.getInstance(this); databaseAccess.open(); personsList = databaseAccess.getAllPersons(); databaseAccess.close(); for (Person person : personsList) Log.d("person info", person.getName()); }
برای دانلود سورس آموزش SQLiet به کانال تلگرام ما مراجعه کنید.
فریم ورک Sugar orm از نوع ORM هاست پس بهتره قبل از پرداختن به این فریم ورک کاربردی دیتابیس , مفهوم ORM یا Object-relational mapping رو متوجه بشیم !
به نقل از wikipedia
Object-relational mapping (ORM, O/RM, and O/R mapping tool) in computer science is a programming technique for converting data between incompatible type systems using object-oriented programming languages. This creates, in effect, a “virtual object database” that can be used from within the programming language.
به عبارتی ORM یک تکنیک برنامه نویسی است که برای ذخیره و بازیابی اطلاعات به صورت کاملا شی گرایی است بدین معنی که دیگر نیازی به دستورات SQL نیست و تنها کافی است با زبان شی گرایی با بانک مجازی ایجاد شده صحبت کنیم 😀
حالا که با مفهوم ORM آشنا شدیم میشه حدس زد که فریم ورک هایی که از ORM پشتیبانی میکنند مثل Sugar ORM و دیگر فریم ورک ها که در ادامه آشنا میشیم , چه ویژگی دارند که باعث برتری آنها شده و اون دسترسی به اطلاعات بانک بصورت کاملا شی گرایی ست.
نکات مثبت فریم ورک Sugar orm را میتوان چنین نام برد
قبل از شروع پروژه وابستگی Sugar orm رو به گردل اضافه میکنیم
compile 'com.github.satyan:sugar:1.5'
قبل از شروع به ایجاد جدول و مدل سازی باید یک سری تنظیمات برای ایجاد بانک به manifest در تگ application اضافه کنیم
<application ...> <meta-data android:name="DATABASE" android:value="testdb.db" /> <meta-data android:name="VERSION" android:value="16" /> <meta-data android:name="QUERY_LOG" android:value="true" /> <meta-data android:name="DOMAIN_PACKAGE_NAME" android:value="com.tejariapp.sugarorm" /> </application>
توی قسمت SQLite ما ابتدا یک بانک SQLite ایجاد کردیم که مدل ما معرفی میشد.
اما در Sugar ORM ما گفتیم که همه چیز شی گرایی ست! پس Model ماهم یک کلاس خواهد بود
پس برای هر جدول باید یک کلاس ایجاد کنیم که از کلاس SugarRecord پشتیبانی میکنند
package com.tejariapp.sugarorm; import android.support.annotation.Size; import com.orm.SugarRecord; import java.util.List; /** * Created by Marjan on 04/11/2017. */ public class Person extends SugarRecord { String Name; public Person(){} public Person(String name){ this.Name=name; } public String getName() { return Name; } public void setName(String name) { this.Name = name; } }
همانطور ک مشخص است یک کلاس ساده با getter , setter است اما درصورت نیاز میتونید از انوتیشن های @NotNull و @Uniq استفاده کنید.
حالا خیلی راحت میتونیم با دستورات زیر به اطلاعات درون بانک دسترسی پیدا کنیم
/* * insert a record in database */ private void insertSugarORM() { String name = nameEditText.getText().toString(); try { Person person = new Person(); person.setName(name); person.save(); personsList.add(person); customAdapter.notifyItemInserted( personsList.size() - 1); } catch (Exception e) { Log.e("e", e.toString()); } nameEditText.setText(""); } /* * read all object from database */ private void readSugarORM() { personsList = Person.listAll(Person.class); for (Person person : personsList) Log.e("person", String.valueOf( person.getId()) + person.getName()); } /* * delete a record by position in list */ private void deleteSugarORM() { Person person = Person.findById( Person.class, personsList.get(position).getId()); person.delete(); personsList.remove(position); customAdapter.notifyDataSetChanged(); position = -1; nameEditText.setText(""); } /* * update a record in database */ private void updateSugarORM() { String newName = nameEditText.getText().toString().trim(); if (position -1 && !newName.isEmpty()) { Person person = personsList.get(position); person.setName(newName); person.save(); personsList.set(position, person); customAdapter.notifyItemChanged(position); position = -1; nameEditText.setText(""); } }
درصورتی هم یک نیاز به داشتن یک بانک پبشفرض در اپلیکیشن بود میتونید یک دیتابیس رو با استفاده از ابزارهای SQLite که در بخش قبل صحبت کردیم ایجاد کنید به فولدر assets اضافه کنید
و بعد کلاس زیر را به پروژه خود اضافه کنید که وظیفه انتقال دیتابیس از SQLite به فریم ورک های ORM رادارد
package com.tejariapp.sugarorm; import android.content.Context; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; /** * Created by Marjan on 06/11/2017. */ public class DataBaseHelper extends SQLiteOpenHelper { //The Android's default system path of your application database. private static String DB_PATH = "/data/data/com.tejariapp.sugarorm/databases/"; private static String DB_NAME = "testdb.db"; private SQLiteDatabase myDataBase; private final Context myContext; /** * Constructor * Takes and keeps a reference of the passed context * in order to access to the application assets and resources. * * @param context */ public DataBaseHelper(Context context) { super(context, DB_NAME, null, 1); this.myContext = context; } /** * Creates a empty database on the system and * rewrites it with your own database. * */ public void createDataBase() throws IOException { boolean dbExist = checkDataBase(); if(dbExist){ //do nothing - database already exist }else{ //By calling this method and empty database will be created into the default system path //of your application so we are gonna be able to overwrite that database with our database. this.getReadableDatabase(); try { copyDataBase(); } catch (IOException e) { Log.e("copy error",e.toString()); } } } /** * Check if the database already exist to avoid * re-copying the file each time you open the application. * * @return true if it exists, false if it doesn't */ private boolean checkDataBase(){ File dbFile = myContext.getDatabasePath(DB_NAME); return dbFile.exists(); } /** * Copies your database from your local * assets-folder to the just created empty database in the * * system folder, from where it can be accessed and handled. * This is done by transfering bytestream. * */ private void copyDataBase() throws IOException{ //Open your local db as the input stream InputStream myInput = myContext.getAssets().open(DB_NAME); // Path to the just created empty db String outFileName = myContext.getDatabasePath(DB_NAME).getPath(); //Open the empty db as the output stream OutputStream myOutput = new FileOutputStream(outFileName); //transfer bytes from the inputfile to the outputfile byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer))>0){ myOutput.write(buffer, 0, length); } //Close the streams myOutput.flush(); myOutput.close(); myInput.close(); } public void openDataBase() throws SQLException { //Open the database String myPath = myContext .getDatabasePath(DB_NAME).getPath(); myDataBase = SQLiteDatabase.openDatabase( myPath, null, SQLiteDatabase.OPEN_READONLY); } @Override public synchronized void close() { if(myDataBase != null) myDataBase.close(); super.close(); } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } // Add your public helper methods to // access and get content from the database. // You could return cursors by doing // "return myDataBase.query(....)" so it'd be easy // to you to create adapters for your views. }
.
و سپس تکه کد زیر که برای اجرای کلاس فوق است را در MainActivity خود یا کلاسی که از Application ارث بری میکند (چون حتما باید اجرا شود) قرار دهید
/* * if you have a database and you want to load it by default in app */ DataBaseHelper myDB; myDB = new DataBaseHelper(getApplicationContext()); try { myDB.createDataBase(); } catch(IOException e) { // do nothing }
برای دانلود سورس آموزش Sugar ORM به کانال تلگرام ما مراجعه کنید.
فریم ورک Realm هم یک ORM دیگست !
پس یعنی کاملا شی گرایی رو پشتیبانی میکنه و آپشن های Sugar orm رو داره که البته تا حدودی پیشرفته تر با اپشن های بیشتر و پیچیده تر ارائه شده.
خب بدون معطلی میریم سراغ دستورات و ساختار فریم ورک Realm
قبل از هرچیز باید به گردل اضافه ش کنیم پس برای اینکار ابتدا (build.gradle(project: Realm رو کلیک میکنیم و پلاگین زیر رو به dependencies بدین صورت اضافه میکنیم
buildscript { repositories { ... } dependencies { ... classpath "io.realm:realm-gradle-plugin:4.1.1" } }
apply plugin: 'com.android.application' apply plugin: 'realm-android' //add this
حالا میتونیم مدل یا جدول دیتابیس رو بصورت کلاس زیر اضافه کنیم
package com.tejariapp.realm; import io.realm.RealmObject; import io.realm.annotations.PrimaryKey; /** * Created by Marjan on 01/11/2017. */ public class Person extends RealmObject { @PrimaryKey private int id; private String name; public Person(){} public Person(int id,String name){ this.id=id; this.name=name; } public int getId() { return id; } public String getName() { return name; } public void setId(int id) { this.id = id; } public void setName(String name) { this.name = name; } }
قبل از نوشتن متد های read , delete , update , insert برای کلاس Realm باید ابجکتی از نوع Realm ایجاد و مقداردهی کنیم تا برای اعمال این فانکشن ها از آن استفاده کنیم.
پس در onCreate اکتیویتی یا فرگمنت این کار رو انجام میدیم
Realm realm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //bind butter knife ButterKnife.bind(this); //initialize realm object Realm.init(this); realm = Realm.getDefaultInstance(); //read all Person table records for show in list view realmRead(); customAdapter = new CustomAdapter(personsList, this); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setAdapter(customAdapter); }
همانطور که مشخصه ما از کتابخانه ButterKnife برای درسترسی ساده تر به viewها در سورس کدها استفاده کردیم که برای آموزش کامل این کتابخانه میتوانید به پست مربوط “همه چیز درباره کتابخانه ButterKnife” مراجعه کنید.
در جداولی که در فریم ورک Realm ایجاد میکنیم آپشن identity برای فیلد ID جداول وجود ندارد و این امر باعث میشود که ما به صورت دستی id هارو وارد کنیم
که برای این کار هم ما یک متد ایجاد کردیم که بزرگترین id موجود جدول را پیدا میکند و یک واحد بزرگتر از آن را به ما برمیگرداند.
/* * create a id base of maximum id in database */ public int getNextKey() { try { Number number = realm.where(Person.class).max("id"); if (number != null) { return number.intValue() + 1; } else { return 0; } } catch (ArrayIndexOutOfBoundsException e) { return 0; } } /* * insert a record in database */ private void realmInsert() { String name = nameEditText.getText() .toString().trim(); if (!name.isEmpty()) { realm.beginTransaction(); Person person = realm.createObject( Person.class, getNextKey()); person.setName(name); realm.commitTransaction(); } nameEditText.setText(""); } /* * read all object from database */ private void realmRead() { // list=new ArrayList<>(); personsList = realm.where(Person.class) .findAllSorted("id", Sort.ASCENDING); //list.addAll(realm.copyFromRealm(personsList)); for (Person student : personsList) { Log.e("students", String.valueOf( student.getId() + " " + student.getName())); } } /* * delete a record by position in list */ private void realmDelete() { if (position > -1) { realm.beginTransaction(); Person person = personsList.get(position); person.deleteFromRealm(); realm.commitTransaction(); nameEditText.setText(""); position = -1; } } /* * update a record in database */ private void realmUpdate() { String newName = nameEditText. getText().toString().trim(); if (position > -1 && !newName.isEmpty()) { realm.beginTransaction(); Person person = personsList.get(position); person.setName(newName); realm.commitTransaction(); position = -1; nameEditText.setText(""); } }
برای دانلود سورس آموزش Realm به کانال تلگرام ما مراجعه کنید.
فریم ورک GreenDao پرسرعت ترین و پیشرفته ترین فریم ورک دیتابیس ORM است که ارائه شده.
با استفاده از فریم ورک GreenDAO شما قادر به ذخیره و بازیابی چندین هزار رکورد در چند ثانیه خواهید بود و این خیلی خوبه!
میتوان گفت فریم ورک GreenDAO برای افراد مبتدی چندان مناسب نیست چون بهتر است با مسائل multi threading و rx و.. تا حدودی آشنایی داشته باشند.
نکته قابل توجه فریم ورک GreenDAO این است که با وجود امکاناتی که به صورت کامل و جامع به شما ارائه میده حجم بسیار کمی نیز به اپ شما اضا فه میکن درحد چندکیلو بایت.
برای استفاده از فریم ورک پرسرعت GreenDAO نیز مثل فریم ورک های قبل باید ابتدا وابستگی آن را به گردل اضافه کرد
ابتدا در (build.gradle(Module:app عبارت زیر را اضافه میکنیم
compile 'org.greenrobot:greendao:3.2.0'
سپس در (build.gradle(Prioject:greendaoapp نیز پلاگین را اضافه میکنیم
buildscript { repositories { ... } dependencies { ... classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0' } }
حالا باید یک Module دیگر مبنی بر GreenDao Generator که برای تعریف ساختار بانک ما خواهد بدین صورت ایجاد میکنیم
حالا خواهید دید که پروژه شما دو ماژول app , greendaogenerator دارد.
حال در فایل گردل ماژول جدید هم باید greendao رو معرفی کنیم پس
apply plugin: 'java' dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'org.greenrobot:greendao-generator:3.2.0' } sourceCompatibility = "1.7" targetCompatibility = "1.7"
خب حالا باید درون کلاسی که با نام MyGenerator ایجاد کردیم برای ایجاد کلاسی که به عنوان جدول ما شناخانه میشود بدین صورت کد نویسی کنیم
package com.example; import org.greenrobot.greendao.generator.DaoGenerator; import org.greenrobot.greendao.generator.Entity; import org.greenrobot.greendao.generator.Property; import org.greenrobot.greendao.generator.Schema; public class MyGenerator { public static void main(String[] args) { // Your app package name and the (.db) // is the folder where the DAO files will be generated into. Schema schema = new Schema(1, "com.tejariapp.greendao.db"); schema.enableKeepSectionsByDefault(); addTables(schema); try { new DaoGenerator().generateAll(schema, "./app/src/main/java"); } catch (Exception e) { e.printStackTrace(); } } private static void addTables(final Schema schema) { addUserEntities(schema); } // This is use to describe the colums of your table private static Entity addUserEntities(final Schema schema) { Entity user = schema.addEntity("User"); user.addIdProperty().primaryKey().autoincrement(); user.addStringProperty("first_name"); return user; } }
خب همونطور که مشخصه باید هنگام تعریف schema نام پکیج خود به علاوه .db قرار دهید تا کلاس های دیتابیس درون آن مسیر ذخیره شوند
حالا با run کردن generator خواهید دید که کلاس User برای شما Generate میشود با فیلدهایی که مشخص کردید و خصیصه هایی که برای آنها در نظر گرفتید
پس بدین صورت کلاس MyGenerate را run کنید
حالا باید یک کلاس مشتق شده از Application در ماژول app ایجاد کنیم تادستورات ایجاد بانک را از طریق این کلاس ایجاد کنیم و دلیل این کار هم این است که میخواهیم حتما و تنها یکبار این دستورات اجرا شوند.
package com.tejariapp.greendao; import android.app.Application; import com.tejariapp.greendao.db.DaoMaster; import com.tejariapp.greendao.db.DaoSession; import org.greenrobot.greendao.database.Database; /** * Created by Marjan on 07/11/2017. */ public class AppController extends Application { public static final boolean ENCRYPTED = true; private DaoSession daoSession; @Override public void onCreate() { super.onCreate(); //The users-db here is the name of our database. DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper( this,"users-db"); Database db = helper.getWritableDb(); daoSession = new DaoMaster(db).newSession(); ///// Using the below lines of code we can toggle ENCRYPTED /// to true or false in other to use either an encrypted database or not. // DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper // (this, ENCRYPTED ? "users-db-encrypted" : "users-db"); // Database db = ENCRYPTED ? helper.getEncryptedWritableDb // ("super-secret") : helper.getWritableDb(); // daoSession = new DaoMaster(db).newSession(); } public DaoSession getDaoSession() { return daoSession; } }
مشخصا عملیات رمزگذاری و رمزگشایی هم میتونیم برای بالا بردن امنیت بانک خود داشته باشیم و greenDAO کاملا از این عملیات پشتیبانی میکند.
user-db هم نام دیتابیس ما تعیین شده و همچنین در manifest باید این کلاس را در application به صورت زیر قراردارد.
<application android:name=".AppController" ... > </application>
حال قبل از نوشتن متد های دسترسی و ویرایش اطلاعات بانک باید یک سری آبجکت را درون onCreate اکتیویتی مقداردهی کنیم پس
DaoMaster.DevOpenHelper helper; SQLiteDatabase db; DaoMaster daoMaster; DaoSession daoSession; UserDao userDao; @BindView(R.id.nameEditText) EditText nameEditText; @BindView(R.id.nameRecyclerView) RecyclerView recyclerView; CustomAdapter customAdapter; ArrayList personsList=new ArrayList(); int position = -1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); helper = new DaoMaster.DevOpenHelper(this, "users-db", null); db = helper.getWritableDatabase(); daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); daoSession = daoMaster.newSession(); userDao = daoSession.getUserDao(); QueryBuilder.LOG_SQL = true; QueryBuilder.LOG_VALUES = true; ButterKnife.bind(this); readDAO(); customAdapter = new CustomAdapter(personsList, this); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setAdapter(customAdapter); }
/* * insert in database */ private void insertDAO() { String newName=nameEditText.getText() .toString().trim(); if (!newName.isEmpty()) { User person = new User(); person.setFirst_name(newName); userDao.insertOrReplace(person); personsList.add(person); customAdapter.notifyItemInserted( personsList.size() - 1); } } /* * read all from database */ private void readDAO() { personsList= userDao.queryBuilder() .orderAsc(UserDao.Properties.Id) .list(); for (User user : personsList) Log.e("user", String.valueOf(user.getId()) + user.getFirst_name()); } /* * update special record in database */ private void updateDAO() { String newName=nameEditText.getText().toString().trim(); if (!newName.isEmpty() && position >-1) { User user = userDao.queryBuilder() .where(UserDao.Properties.Id.eq( personsList.get(position) .getId())).limit(1).unique(); user.setFirst_name(newName); userDao.insertOrReplace(user); personsList.set(position, user); customAdapter.notifyItemChanged(position); position=-1; } } /* * delete a record base of id */ private void deleteDAO() { if (position >-1) { User user = userDao.queryBuilder().where( UserDao.Properties.Id.eq( personsList.get(position).getId())).limit(1).unique(); userDao.delete(user); personsList.remove(position); customAdapter.notifyDataSetChanged(); position=-1; } }
موفق و پیروز باشید 🙂