اموزش sqlite در اندروید بخش پیشرفته
سلام دوستان..در اموزش های قبلی با sqlite و دیتابیس اشنا شدیم.ما sqlite را در سه بخش بررسی کردیم به اینصورت که هر وقت احتیاج به دیتابیس داشتیم کد های ان را مینوشتیم.اینکار در دیتابیس های کوچک به کار ما می اید ولی در دیتابیس های بزرگتر برای ما مشکل است که هربار کد های ان را بنویسیم که اینکار باعث زیاد شدن کد های تکراری می شود.در این اموزش ما میخواهیم کد هایمان را در کلاس های جدا تعریف کنیم و هر موقع که به ان ها احتیاج داشتیم استفاده کنیم تا تسلط بهتری به دیتابیس داشته باشیم.
خب برای اینکار ابتدا یک کلاس درست میکنیم که وظایف ان باز کردن یا ساختن و ارتقای ساختار دیتابیس ما است در اینجا نام این کلاس را MyDatabase قرار داده ایم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class MyDatabase extends SQLiteOpenHelper { private final static String DB_NAME = "database name"; private final static int DB_VERSION = 1; public static final String MYTB = "mytb"; public static final String ID = "id"; public static final String NAME = "name"; public static final String AGE = "age"; public MyDatabase(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase mydb) { mydb.execSQL("CREATE TABLE IF NOT EXISTS "+ MYTB + " (" + ID + " INTEGER PRIMARY KEY, " + NAME + " TEXT, " + AGE + " numeric);"); } @Override public void onUpgrade(SQLiteDatabase mydb, int oldVersion, int newVersion) { } } |
خب در اینجا ما سه تابع تعریف کردیم.تابع اول وظیفه ساختن یا باز کردن دیتابیس را دارد.این تابع با دریافت نام و ورژن دیتابیس در صورتی که وجود نداشته باشد تابع بعدی اجرا می شود.در این تابع یعنی onCreate ما جدولمان را همانطور که در اموزش های قبلی با ان اشنا شدیم ایجاد میکنیم.
و اما تابع اخر که وظیفه مهمی هم دارد اگر دیتابیس وجود داشت بررسی میکند که اگر ورژن ان بزرگتر از ورژن قبلی بود دیتابیس را upgrade میکند یعنی تغییرات را که در ان مینویسیم در دیتابیس ایجاد میکند.
حالا یک کلاس دیگر ایجاد میکنیم که کار های دیتابیس ما را انجام دهد همانطور که قبلا اینکار ها یعنی حذف بروز رسانی و ..را انجام میدادیم اینجا هم همینکار را میکنیم ولی بصورت تابع.پس هرجا احتیاج داشتیم از این توابع استفاده میکنیم.در اینجا نام این کلاس را DatabaseHelper قرار داده ایم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | public class DatabaseHelper { private SQLiteDatabase mydb; public DatabaseHelper(Context context){ mydb = new MyDatabase(context).getWritableDatabase(); } public void insertToTable(int id, String name, int age){ ContentValues cv = new ContentValues(); cv.put(MyDatabase.ID, id); cv.put(MyDatabase.NAME, name); cv.put(MyDatabase.AGE, age); mydb.insert(MyDatabase.MYTB, null, cv); mydb.close(); } public void updateAge(int id, int newAge){ ContentValues cv = new ContentValues(); cv.put(MyDatabase.AGE, newAge); mydb.update(MyDatabase.MYTB, cv, MyDatabase.ID + " = ?", new String[] { String.valueOf(id) }); mydb.close(); } public TableData[] getAllTable(){ Cursor cr = mydb.rawQuery("select * from " + MyDatabase.MYTB, null); TableData[] data = new TableData[cr.getCount()]; int i = 0; while (cr.moveToNext()){ data[i] = new TableData(); data[i].id = cr.getInt(cr.getColumnIndex(MyDatabase.ID)); data[i].name = cr.getString(cr.getColumnIndex(MyDatabase.NAME)); data[i].age = cr.getInt(cr.getColumnIndex(MyDatabase.AGE)); } cr.close(); mydb.close(); return data; } public class TableData{ public int id; public String name; public int age; } } |
خب در اینجا یک تابع با نام کلاسمان ایجاد کردیم و دیتابیس خود با استفاده از کلاسی که قبلا تعریف کردیم باز کنیم.در اینجا سه تابع ایجاد کردیم که تابع اول برای وارد کردن اطلاعات به جدول است که با چگونگی تعریف ان قبلا اشنا شدیم.یک تابع برای بروز رسانی age ایجاد کردیم که یک نمونه است و برای بروز رسانی ستون های دیگر هم باید همینطور عمل کنید.
تابع اخر هم برای خواندن اطلاعات است که نتایج را در ارایه ای به نام TableData قرار میدهد.چون اطلاعات جدول ما زیاد است همه را در ارایه قرار می دهیم برای اینکار باید یک کلاس TableData ایجاد کنیم که ان را میبینید.
به همین راحتی کار ما به پایان می رسد و میتوانیم هر جا که بخواهیم از دیتابیسمان استفاده کنیم.به مثال زیر توجه کنید :
1 2 3 4 | DatabaseHelper.TableData[] data = new DatabaseHelper(this).getAllTable(); for(int i = 0; i < data.length; i++){ myTextView.append("name: " + data[i].name + ", age: " + data[i].age ); } |
برای گرفتم اطلاعات از جدول و نمایش ان از این کد استفاده می کنیم و یا برای بروزرسانی از کد زیر:
1 | new DatabaseHelper(MainActivity.this).updatAge(1086, 20); |
برای اضافه کردن اطلاعات هم از کد زیر:
1 | new DatabaseHelper(MainActivity.this).insertToTable(1086, "sepehr", 19); |
به همین سادگی کار ما تمام می شود و در صورتی که بخواهیم با دیتابیس بزرگ کار کنیم راحت میتوانیم از این کلاس هایی که ایجاد کردیم استفاده کنیم.
امیدوارم این اموزش هم براتون مفید بوده باشه.
موفق باشید
اگر دیتابیس ما دارای ده ها جدول با روابط چند به چند باشه چطوری میشه . شما اون بالا اولش اومدی ایدی و نام و سن را تعریف کردی .
متد ها را کاش طوری تعریف می کردید که بشه کوئری بهش پاس داد
همین الان هم میشه query بهش پاس داد لطفا آموزش های قبل را مطالعه کنید.
موفق و موید باشید.
خسته نباشید . شما insert,update,select رو نوشتین ولی delete رو ننوشتین . میشه بنویسین کدش رو . ممنون
سلام و درود از کد زیر استفاده کنید
موفق باشید.
برای داشتن چند table باید چی کار کرد؟؟
یکبار دیگه از کد زیر باید استفاده کنید نام table رو تغییر دهید و بهتر است آموزش های قبلی را یکبار به درستی مطالعه کنید.
موفق باشید.
سلام
تشکر بسیار زیاد بابت سایت بینظیرتون
بعد از اجرای این دستور
new DatabaseHelper(MainActivity.this).insertToTable(1086, “sepehr”, 19);
میخوام اطلاعات رو توی textview نمایش بدم.
اما زمان استفاده از کد (گرفتن اطلاعات) حلقه for درست اجرا نمیشه یعنی وقتی حلقه for رو برمیدارم و (i) رو صفر میدم یک سطر برام نمایش داده میشه اما وقتی (i) رو مثلا 1 میدم یا حلقه for میذارم برنامه stop میشه. ممنون میشم راهنمایی کنید.
با سلام
به منظور نمایش تمامی مقادیر دیتابیس میبایست در انتهای حلقه ی while تابع getAllTable() از کلاس DatabaseHelper بعد از خط 38 از دستور ‘i++’ استفاده کرد.
تشکر بابتت این مطلب خوبتون
ببخشید من بار اول که
DatabaseHelper.TableData[] data = new DatabaseHelper(this).getAllTable();
for(int i = 0; i < data.length; i++){
myTextView.append("name: " + data[i].name + ", age: " + data[i].age );
}
رو میزارم و توش اطلاعات ذخیره میکنم درسته..
بار دوم میندازه بیرون از برنامه..
و اینکه من با
new DatabaseHelper(MainActivity.this).insertToTable(1086, "sepehr", 19
اطلاعات کد رو عوض میکنم باز هم قبلی هارو نمایش گیده و تغییر نمیکنند
و اینکه من میخام توی یکی از ستون ها فقط یک مقدار ذخیره کنم
و اون مقدار رو بتونم تغییر بدم..
مثلا شرط بزارم اگر مقدار اون ستون ۱ بود یک کار انجام بده،اگر ۲ بود یک کار دیگه و ..
سلام.
اگه Database ها یا Cursor ها را نبندیم چی فرقی میکنه؟
اصلا چرا ببندیم؟
خطای memoryleak میگیرید
در سایت همین واژه رو سرچ کنید مطلب هست.