قرار دادن دیتابیس در برنامه اندروید
سلام دوستان.در این اموزش از سری اموزش های sqlite میخواهیم به قرار دادن دیتابیس در برنامه اندروید بپردازیم.در اموزش های قبلی ما با دیتابیس sqlite اشنا شدیم ولی به اینگونه که دیتابیس با باز شدن برنامه ایجاد شده و اطلاعاتی را از کاربر میگیرد و در خود ذخیره میکند.ولی شاید لازم باشه که ما از قبل اطلاعاتی را در قالب دیتابیس در برناممان قرار دهیم تا بتوانیم از ان استفاده کنیم .خب برای انجام اینکار خوشبختانه راه های مناسب و راحتی وجود دارد که در اینجا به بررسی ان ها میپردازیم.
اولین کاری که لازمه انجام بدیم این است که دیتابیس خود را اماده کنیم.برای اینکار ما از برنامه navicat استفاده میکنیم البته اصلا فرقی نداره که چه برنامه ای باشد مهم دیتابیس ما هستش.
دوستان حتما به مراحل انجام کار دقت کنید کوچک ترین اشتباهی ممکنه در برنامه مشکل ایجاد کنه:
لازمه که جدا از جدول های اصلی دیتابیستان یک جدول با نام android_metadata ایجاد کنید که یک ستون با نام locale و یک سطر با مقدار en_US داشته باشد در خودش.
بعد از اینکه کار دیتابیس تمام شد نوبت قرار دادن در برناممان میرسد.ما برای اینکار از کتابخانه SQLite Asset Helper استفاده میکنیم.این کتابخانه دیتابیس را به صورت zip قبول میکنه پس لازمه که ان را فشرده کنیم توجه کنید که حتما zip باشد.
نکته:دوستان حتما به این موضوع دقت کنید که نام دیتابیس شما باید پسوند db داشته باشد یعنی جدا از فرمت اصلی در نامش هم داشته باشد مانند mydb.db در صورت رعایت نکردن این نکته در برنامه مشکل ایجاد خواهد شد.
خب حالا در برنامه مورد نظر در پوشه assets یک پوشه به نام databases میسازیم به شکل زیر:
در صورتی که فولدر assets را نداشتید مانند تصویر زیر ان را ایجاد کنید:
حالا باید کتابخانه ای که قبل تر گفتیم را در برنامه اضافه کنیم.برای اینکار ابتدا از اینجا ان را دانلود کنید.
حالا فایل jar رو در پوشه libs بریزید سپس روی کتابخانه راست کلیک کنید و Add as Library را انتخاب کنید و صبر کنید پروژه builid شود تا کتابخانه اضافه شود.
خب تا اینجا همانطور که دیدید بیشتر مراحل صرف قرار داد دیتابیس شد و حالا بعد از اینکار ها میتوانید نوشتن کد هارا اغاز کنید همانطور که در اموزش های sqlite با انها اشنا شدیم.
در اینجا ما با یک مثال ساده اموزش را کامل میکنیم. یک کلاس ایجاد میکنیم که در اینجا ما نام ان را MyDateBase قرار دادیم به صورت زیر:
1 2 3 4 5 6 7 8 9 10 11 12 13 | package com.example.sepehr.mydbtest; import android.content.Context; import com.readystatesoftware.sqliteasset.SQLiteAssetHelper; /** * Created by Sepehr on 15/07/2017. */ public class MyDateBase extends SQLiteAssetHelper { private static final String DATABASE_NAME = "mydbtestt.db"; public static final int DATABASE_VERSION = 1; public MyDateBase(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } } |
همانطور که میبینید کلاسمان از SQLiteAssetHelper ارث بری شده است.سپس کدهایمان در mainActivity به صورت زیر میشوند:
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 | package com.example.sepehr.mydbtest; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyDateBase mydb = new MyDateBase(this); final SQLiteDatabase database = mydb.getReadableDatabase(); Cursor cu = database.rawQuery("SELECT name FROM mytb", null); while (cu.moveToNext()) { try { Toast.makeText(getApplicationContext(), cu.getString(0) , Toast.LENGTH_LONG).show(); } catch (Exception e) { } } cu.close(); database.close(); } } |
در اینجا ستون name از جدول mytb در toast نمایش داده می شود.با دستورات دیگر هم قبل تر اشنا شدیم.امیدوارم اموزش مفید بوده باشه در صورت داشتن مشکل حتما ان را مطرح کنید
تا اموزش های بعدی بدرود.
سلام داداش این کارارو تو اکلیپس هم میتونیم انجام بدیم؟
بله آموزش آن رد Eclipse خیلی شبیه است یعنی هیچ فرق نمی کند در چه نوه IDE انجام شود کد در هردو IDE کار خواهد کرد.
موفق و موید باشید.
ینی دو ماه من دارم از انواع سایتا امتحان میکنم جواب نمیگیرم که نمیگیرم
کوئری رو این شکلی کردم
SELECT * FROM android_metadata
و این خطا رو میگیرم
Could not open database
ممنون میشم کمکم کنید
مثل آموزش پیش برید مشکلی ندارد .
ینی واقعا دمت گرم
جواب داد
هر چی تشکر کنم کم گفتم بخدا دو ماه دارم میگردم از سایتای ایرانی و خارجی و فرا زمینی فراتر رفتم همشون باگ داشتن
خیییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییلی گلی
خواهش می کنم آموزش رو باید قبل از قرار دادن در سایت باید تست کرد کاری که نصف منبع های خارجی و ایرانی انجام نمی دهند .
موفق باشید.
سلام من مدت هاس دنبال این اموزش بودم هیج جا پیداش نمیکردم
فقط یه سوال دارم که خیلی ممنون میشم پاسخ بدین
اینکه طبق این روشی که شما گفتین ابتدا باید اطلاعات دیتابیس رو همراه با جدول هاش داخل چیزی مثل sqlite manager بنویسیم، بعد اون رو به پروژه شناسایی کنیم؟ ایا درست متوجه شدم؟
سلام خواهش می کنم.
بله باید با برنامه های مثل navicat و یا sqlite Manager دیتابیس را از قبل ایجاد کرده و سپس در برنامه قرار دهید .
سلام
من دقیقا طبق اموزش که دادین پیش رفتم و خطایی هم برنامه نداره اما وقتی اجراش میکنم برنامه فورس کلوز شده و بسته میشه به نظرتون باید چیکار کنم؟؟؟؟
کد قرار گرفته مشکلی ندارد.
در چه خطی در کجا برنامه خطا دارید حتما دیتابیس را به اشتباده ایجاد کرده اید با دقت نام ها را همانند آموزش تنظیم کنید نام دیتابیسی که ایجاد می کنید باید یکی با آموزش باشد.
موفق باشید.
سلام
این کتابخونه ای که در این پروژه به کار رفته ینی کتابخونه sqlite_asset_helper دقیقا چه کاری رو برامون انجام میده؟؟
وقتی این کتابخونه رو اد میکنیم چه ویژگی هایی در اختیارمون قرار داده میشه؟؟؟؟؟
سلام
یک اینکه از SQLiteAssetHelper ارث بری یا همان extend گرفته شده است و دوم برای اینکه بیایم دیتابیس را راحت تر از پوشه assets بخونیم باید از این کتاب خانه استفاده کنیم سوم به تازگی آپدیتی که صورت گرفته لازم نیست دیگر دیتابیس را zip کنید به همان شکل می توانید در پوشه asstes قرار دهید چهارم می توانید فایل دیتابیس را با فرمت gzip فشرده کنید و در برنامه قرار دهید ! پنجم فراخونی آن بسیار ساده است
در صورتی که دلایل کافی نبود بفرمایید بیشتر توضیح دهم .
موفق و موید باشید.
با سلام و ممنون از آموزش خوبتون . من برنامه رو طبق آموزش شما پیش رفتم و کاملا درست اجرا شد . می خواستم اگه بخواهیم این محتویات جدول در یک لیست ویو در صفحه اصلی قرار بگیره چیکار باید انجام بدیم؟ راستش من تازه برنامه نویسی اندروید رو شروع کردم اگه راهنمایی بفرمایین ممنون میشم.
سلام دوست عزیز از اموزش زیر میتونید استفاده کنید:
https://programchi.ir/2017/08/12/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-%d8%af%db%8c%d8%aa%d8%a7%d8%a8%db%8c%d8%b3-sqlite-%d9%88-%d9%86%d9%85%d8%a7%db%8c%d8%b4-%d8%a2%d9%86-%d8%af%d8%b1-listview/
سلام و خسته نباشید ممنون و سپاس از آموزشهای مفیدتون
یه سوالی که پیش اومده این هستش که ما علاوه بر سطر و ستونی که خودمون ایجاد میکنیم ، باید یه ستون هم به locale و سطر en_US باشه؟
سلام
خیر اجباری نیست ولی قرار دادن آن بهتر است.
با سلام و خسته نباشید وتشکر بابت سایت خوبی که دارید
باید بگم در خط 13 کلاس MyDateBase
مشکل وجود داره باید به صورت زیر نوسته بشه
;”private static final String DATABASE_NAME = “mydbtestt
و آخرش باید db نوشته بشه و دات(.) لازم نیست
ممنون محمد جان ولی مشکلی نداره و کد امتحان شده درست کار میکنه.
سلام خسته نباشید میخواستم بگم که ,یک اسلاید ایجاد کردم دقیقا مثل دی جی کالا و کافه بازار اما نمیدونم چه جوری با پایگاه داده local host ارتباطش بدم و تصاویر رو چجوری به صورت آنلاین بگیره.هیچی ازش نمیدونم
سلام و درود
باید آیپی local را دستور ipconfig/all در cmd به دست بیارید و سپس آدرس آیپی را از آنجا بدهید.
سلام
من هرکاری میکنم درس نمیشه، فک کنم دیتابیس رو باز نمیکنه
هم برنامه ک باز میشه سریع بسته میشه و پیغام unfortunately app has stopped میده
چیکارشه؟
سلام لطفا پیغام خطای برنامه رو بفرستید از android monitor…و حتما در نوشتن کوئری ها به فاصله ها دقت کنید.
کوئری رو درست کن SELECT locale FROM android_metadata
سلام .. اقا دستتون درد نکنه من این آموزش کامل واسه من کارکرد …
فقط من میخوام اطلاعاتمو طبق چیزی که جست و جو شده از دیتابیس بخونه بریزه توی یه custom list view
آموزش های سایتم مطالعه کردم … گفته بودید مابقیش مثه همه …
ولی من چطوری میتونم اطلاعاتو از این طریق بریزم تو لیست؟
سلام شما باید یک query بنویسید که این کار را انجام دهد custom list view چیز خاصی نیست فقط یک Constructor خاص ممکنه داشته باشه که شما بعد از query گرفتن یا مقادیر رو به custom list view میدید یا یک Model دارید که مقادیر را به آن میدهید سپس به Constructor پاس میدهد برای قرار دادن در لیست هم آموزش در سایت زیاده همینطور list view سفارشی یا custom نیز آموزش داده شده است.
موفق باشید.
سلام ، نحوه تغییر دادن فیلدهای درون دیتابیس تو این کتابخونه (SQLite Asset Helper) چجوری امکان پذیره ، ( من از این کتابخونه استفاده کردم و یه لیست ویو سفارشی ساختم که اطلاعات رو از دیتابیس داخلش نشون میده حالا من داخل لیست ویوم یه ایمیج ویو دارم که میخوام با کلیلک روی هرکدوم از ایمیج ویو های مربوط به لیستم یه فیلد مورد نظر تو جدول دیتابیسم مقدارش تغییر کنه و دیتابیس و لیست ویو بعد از کلیلک فورا رفرش بشه و مقادیر جدید اعمال بشه) امیدوارم منظورم رو خوب رسونده باشم حالا اگه امکانش هست لطفا توضیح بدید و یه نمونه از کد مربوطش بذارید . ممنون میشم سریع تر جواب بدید. سپاس فراوان .
سلام سعید جان.تفاوتی نداره این روش..در اینجا هم میتونید از کلاس SQLiteDatabase استفاده کنید برای مدیریت دیتابیس.اموزش کار با این کلاس در اموزش پیشرفته sqlite وجود دارد:
https://programchi.ir/2017/07/21/%d8%a7%d9%85%d9%88%d8%b2%d8%b4-sqlite-%d8%af%d8%b1-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af-%d8%a8%d8%ae%d8%b4-%d9%be%db%8c%d8%b4%d8%b1%d9%81%d8%aa%d9%87/
ممنون از پاسخ و توجهتون ..
سلام و خسته نباشد ؛
من از این شیوه و کتابخونه (SQLite Asset Helper) استفاده میکنم و همه چیز اوکیه خوشبختانه ، ولی یه سوال خیلی حیاتی داشتم اونم اینه که چجوری به دیتابیسم تو این روش ، امنیت (کدگذاری یا هر چیز دیگه ای که از دیتابیسم محافظت کنه ) بدم .
ممنون میشم اگه بطور دقیق راهنمایی کنید .
سلام
دوستان کسی می دونه چطور باید از این کتابخانه در کوتلین استفاده کرد؟
کدهاشو تبدیل کردم و ظاهرن همه چیز درسته ولی ارور میده که فایل دیتابیس باز نمی شه
سلام
عزیزم اون کوتلین نیست کاتلین میگن. با کوتلت اشتباه نگیری صلوات.
سلام و خسته نباشید خدمت دوستان عزیز
بنده کتابخونه SQLiteAssetsHelper رو دان کردم ولی چون تو مسیر پوشه app پوشه Libs نبود، کتابخونه رو از سایت github گرفتم و تو قسمت Buildgradle جای کتابخونه ها کپی کردم و گذاشتم تا سینک بشه…
بعد ازین کار کدهام رو نوشتم ولی برنامه کرش میکرد. و میکفت که نمیتونه دیتابیس رو باز کنه… یعنی دیتابیس رو نشناخته بود…
و به کد زیر گیر میداد:
SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
و خطایی رو با عنوان زیر Log میکنه:
Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
اگه امکانش هست راهنماییم کنید
ممنون
سلام و درود پاسخ شما در زیر پست زیر داده شد.
https://programchi.ir/questions/%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%A2%D9%85%D8%A7%D8%AF%D9%87-%D8%AF%D8%B1-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF/#comment-4026
موفق باشید.
سلام ممنون از آموزش
یعنی الان این کتابخانه که در این ادرس هم هست
https://github.com/jgilfelt/android-sqlite-asset-helper
دقیقا کدهایی که قبلا در هنگام ارث بری از SqliteOpenHelper استفاده می شده رو میشه استفاده کرد؟
فقط میاد دیتابیس رو از پوشه assets میخونه؟؟؟
به عبارتی دیگه اگه ما از این لایبرری استفاده کنیم و بیاییم به صورت عادی یه کوئری بزنیم و همه اطلاعات رو select کنیم میاد دیتاهایی که از قبل در دیتابیس ریختیم رو نمایش میده؟؟
درست متوجه شدم؟
سلام کاملا درست متوجه شدید.
سلام. ممنون از آموزش خوبتون..
فرض کنید من از این کتاب خونه استفاده کردم. حالا تو نسخه جدید برنامه میخوام یه دیتابیس دیگه که با دیتابیس قبلی یه کم تغییر کرده، قرار بدم. وقتی میام مقدار
DATABASE_VERSION
رو تغییر میدم، برنامه ارور میده. چجوری میتونم به کتاب خونه بفهمونم که دیتابیس جدید رو جایگزین قبلی بکنه؟؟؟
سلام
این کار اتوماتیک انجام میشه فقط کافیه دیتابیس ورژن بخوره همین یعنی مثلا در اولین بار ورژن یک هست دفعه دوم ورژن دو شود کلا دیتابیس recreate می شود.
البته اگر کد رو قبلا اضافه کرده باشید بهش.
موفق باشید.
ممنون از پاسخ گویی سریعتون
این کد که گفتید هم بهش اضافه کردم باز همون خطا رو میده.
وقتی میخوام از دیتابیس استفاده کنم
SQLiteDataBase db = dbHelper.getReadableDataBase();
خطا میده :
Can’t upgrade read-only database from version 1 to 2
چون دیتابیس شما readonly هست باید با استفاده از متد زیر آن را مجبور کنید تا آپدیت شود.
موفق باشید.
سلام به این خط میرسه ارور میده final SQLiteDatabase database = mydb.getReadableDatabase(); میگه نمیتونه باز کنه دیتابیس رو . .
چیکار کنم .
سلام یکی از مراحل رو اشتباه رفتید.میتونید کد های دیتابیس رو قرار بدین.به پسوند و نام دیتابیس هم حتما دقت کنید مخصوصا اگه بروز رسانی کردینش
سلام ، یه سوال بسیار مهم داشتم لطفا کمک کنید :
تو برنامم از این کتابخونه استفاده میکنم و همچی اوکیه ، برای آپدیت دیتابیس هم مشکلی نیست و طبق مستندات گیت هاب کتابخونه عمل میکنم و آپدیت میشه
;private static final int DATABASE_VERSION = 2
assets/databases/_upgrade_-.sql
اما مشکل اینجاس که الان که مثلا آپدیت دیتابیس ورژن 1 به 2 دادم اگه کسی برنامه رو جدیدا نصب کنه آپدیت 2 اعمال نمیشه !!!
از این کدم استفاده کردم ولی بازم نشد : ;(setForcedUpgradeVersion(2
در کل باید حتما به ترتیب پیشرفت تا آپدیت ها اعمال بشن مثلا برنامه که اولین بار نصب میشه بعدش آپدیت 2 رو که بدم ،دوباره برنامه نصب شه آپدیت اعمال میشه ، برای آپدیت 3 هم باید برنامه با آپدیت2 موجود باشه تا اعمال شه و ……
اما اگه یکی بخواد جدیدا برنامه رو نصب کنه هیچ کدوم از آپدیت ها اعمال نمیشه و همون برنامه اولیه بدون آپدیت میاد !!!
چکار باید کرد خیلی مهمه برام لطفا کمک کنید . سپاس
سلام . ببخشید این روش برای عملیات درج و حذف و آپدیت رکوردها جواب میده؟ مگه asset folder فقط خواندنی نیست؟
سلام دیتابیس ایرانسل رو با چه برنامه ای باز کنم که بعد سرچ شماره بتونم اطلاعات رو مشاهده کنم؟
واقعا نمیدونم چطوری تشکر کنم ازتون خیلییییییییییییییییییییییییییییییییییییییییییییییی ممنون
بیشتر از یه یه ماه بود گیر کرده بودم ولی با آموزش درست و کامل شما تونستم ارورم رو حل کنم ! البته به کمک اموزشای این صفحه و یه کلاس sqlitedatabasehelper که تو سایتتون هست
دمتون گرممممممممممم خسته نباشید
من این کار رو کردم ولی بازم ارور میده و برنامه کرش میکنه.اگه ممکنه یکم راهنمایی کنید.موقعی که میخوام دیتابیس اپدیت بشه ورژن رو تغییر میدم و متد onUpgrade رو هم بطور پیش فرض صدا میزنم ولی بازم کرش میکنه
سلام با تشکر از زحماتتون
من طبق آموزش پیش رفتم و مشکل خیلی از دوستان رو داشتم و دیتا بیسم خونده نمیشد
دو نکته رو انجام دادم درست شد
شاید بدرد دوستان بخوره
۱. دقت کنید بعد ساخت پوشه assest حتما پوشه databases داخلش رو بسازید و فایلتون رواونجا قرار بدید (توی متن ننوشتن ولی توی عکس هست)
۲.قسمت DATABASE_NAME رو بدون پسوند بنویسید مثلا mydb اگر db. رو بزارید خونده نمیشه