کد کامل برای کپی بانک اطلاعاتی در حافظه دستگاه یا SD Card
در مورد ویدئویی که استاد در مورد دیتا بیس گذاشته بودند سوال داشتم ایا کپی کردن دیتا بیس در اس دی به اون شکلی که استاد گفتند کافی یا نه ارور های خاص خودشو داره وباید کد هایی بهش اضافه بشن.
به طور کل در یک برنامه واقعی هیچ گاه شما دیتابیس را کپی نخواهید کرد.شما به دستگاه کاربر دسترسی ندارید که جداگانه دیتابیس را روی آن کپی کنید.
این کار استاد نیز جنبه آموزشی داشته و به دلیل کوتاه تر شدن موضوع آموزش انجام شده است.
شما برای ایجاد یک دیتابیس باید از دستورات MySQL به صورت command در اولین اجرای نرم افزارتان روی دستگاه کاربر آن را ایجاد کنید.
به عنوان نمونه :
ساخت یک دیتابیس جدید :
myDB = this.openOrCreateDatabase("DatabaseName", MODE_PRIVATE, null);
ساخت یک جدول جدید :
myDB.execSQL("CREATE TABLE IF NOT EXISTS TableName (Field1 VARCHAR, Field2 INT(3));");
درج رکورد :
myDB.execSQL("INSERT INTO TableName (Field1, Field2) VALUES ('MyName', 30);");
خواندن اطلاعات :
Cursor c = myDB.rawQuery("SELECT * FROM TableName" , null);
// Check if our result was valid.
c.moveToFirst();
if (c != null) {
// Loop through all Results
do {
String Name = c.getString("Field1");
int Age = c.getInt("Field2");
Data =Data +Name+"/"+Age+"\n";
}while(c.moveToNext());
}
من خودم خیلی رو این موضوع فکر کردم و آخرش این کد رو نوشتم ، کدی هست که رو GLX های 50 تومنی هم کار میکنه D:
واقعیت اینه که هیچ جایی کدی به این کاملی پیدا نکردم ! ، اما این کد هم میتونه تمیز تر بشه که به عهده ی خودتون !
- اگه کارت حافظه وجود داره کپی کن رو کارت حافظه و ازش استفاده کن
- اگه کارت جافظه وجود نداره ، اگه میشه از حافظه ی داخلی استفاده کنی ، بانک رو کپی کن و آدرس پوشه ای که بانک در اون کپی شده رو به عنوان پوشه ی برنامه بده ، خیلی از مراجع و علما گفته بودند که نمیشه تو حافظه ی داخلی فایل دیگه ای (مثلا تصویر) کپی کرد ، که الان با داشتن آدرس اون پوشه ، این کار به سادگی انجام میشه !
private boolean prepareDB() { try { String state = Environment.getExternalStorageState(); InputStream is = context.getAssets().open(dbName); if (state.equals(Environment.MEDIA_MOUNTED)) { File DB_PATH = new File(PATH_APP + dbName); logger("SD MOUNTED"); if (DB_PATH.exists()) { logger("DB exist"); DB = SQLiteDatabase.openOrCreateDatabase(DB_PATH, null); return true; } else { logger("DB NOT exist"); if (copy(new FileOutputStream(DB_PATH), is)) { logger("Copy Success"); DB = SQLiteDatabase.openOrCreateDatabase(DB_PATH, null); return true; } else { logger("Copy Faild"); return false; } } } else { logger("SD NOT MOUNTED"); isUsingInternalStorage = true; PATH_APP = getFilesDir().toString(); File dbFile = new File(getFilesDir().toString() + "/" + dbName); if (dbFile.exists()) { logger("DB exist"); DB = SQLiteDatabase.openOrCreateDatabase(dbFile, null); return true; } else { logger("DB NOT exist"); FileOutputStream os = openFileOutput(dbName, context.MODE_PRIVATE); if (copy(os, is)) { logger("Copy Success"); DB = SQLiteDatabase.openOrCreateDatabase(dbFile, null); return true; } else { logger("Copy Faild"); return false; } } } } catch (Exception e) { e.printStackTrace(); return false; } } private boolean copy(OutputStream os, InputStream is) { try { int readed = 0; byte[] buffer = new byte[8 * 1024]; while ((readed = is.read(buffer)) > 0) { os.write(buffer, 0, readed); } try { is.close(); } catch (Exception e) { e.printStackTrace(); } try { os.flush(); } catch (Exception e) { e.printStackTrace(); } try { os.close(); } catch (Exception e) { e.printStackTrace(); } return true; } catch (Exception e) { e.printStackTrace(); return false; } }
امیدارم این کد آماده باعث نشه از برنامه نویسی ، به کتاب نویسی و کپی پیست کد منحرف بشید ، استفاده مفید کنید :)
با سلام.
من کد پیشنهادی دوستمون AhmadVB رو برای ایجاد دیتابیس تست کردم. بدون هیچ مشکلی برنامه ام باهاش کار کرد. براحتی در دیتابیسم اطلاعات ذخیره کردم و ازش اطلاعات خوندم. بعد یه بررسی متوجه شدم که دیتابیس با این روش در پوشه نصب خود برنامه ایجاد میشه. البته نمیشه فایل دیتابیس رو بیرون کشید و مثلا محتویاتش رو توی sqlite manager دید یا ویرایش کرد. آدرس ذخیره سازی به شکل زیر هست:
data/data/AppPackageName/databases/DBname.sqlite
حالا موندم سر دو راهی که از کدوم روش در نهایت برای برنامه ام استفاده کنم. این روش رو یا روش پیشنهادی دوستمون ALU رو.
میشه مثلا برای تست در محیط امولاتور دیتابیس رو توی sdcard ساخت و باهاش کدنویسی های لازم و تست های لازم رو انجام داد و بعد از اینکه برنامه از هر لحاظ اوکی شد روش ایجاد دیتابیس رو از روش اول یعنی روش AhmadVB استفاده کرد. اینجوری دیگه هیچ دردسری نخواهیم داشت و کافیه فقط خط دستور ایجاد دیتابیس رو عوض کنیم.
حالا به لحاظ فنی و موارد آتی از کدوم روش استفاده کنیم بهتره؟ سوال من در مورد نحوه پیاده سازی روش نیست. من با نحوه پیاده سازی روش مشکلی ندارم و از هر کدوم لازم باشه استفاده میکنم. سوالم دقیقا در مورد دلیل استفاده از هر کدوم از این روشهاست. به چه دلیل و در چه شرایطی از روش اول ( AhmadVB ) و به چه دلیلی و در چه شرایطی از روش دوم (ALU) باید استفاده بکنیم.
ممنون میشم از دوستان عزیز و گرانقدر و مجرب انجمن در این مورد راهنمایی کنن تا بالاخره تصمیم بهینه رو در مورد برنامه ام اتخاذ کنم و به کارم ادامه بدم.
با تشکر
با سلام به خدمت دوست خوبمون ALU عزیز و جواب و توضیح مفصلی که ارائه دادن. راستش رو بخواید من ادامه توسعه برنامه رقص نورم منوط به تعیین تکلیف این موضوع هست و یه جورایی به نتیجه رسیدن این موضوع واسم حیاتی هست.
نکاتی در مورد توضیحی که دادید به ذهنم رسید که مطرح میکنم.
قبل از هر چیزی یه پیش زمینه ارائه میدم که شاید مطالبش در حد مبتدی باشه ولی مرورش ضرری نداره.
در دنیای کامپیوتر اطلاعات در دو جا میتونه قرار بگیره و بوجود بیاد و نگهداری بشه تا بتونه توسط CPU برای پردازش مورد دسترسی قرار بگیره.
1- حافظه موقت: که اسم دیگه اش همون RAM هست. حضور اطلاعات در اینجا موقتی هست. با قطع برق اطلاعات پاک میشه. همین طور با توقف اجرای برنامه اطلاعات مربوط به برنامه از حافظه رم پاک میشه. این نوع حافظه از لحاظ سخت افزاری بصورت IC هست.
2- حافظه دائمی: حضور اطلاعات در اینجا دائمی هست. با قطع برق اطلاعات پاک نشده و از دست نمیره. همین طور مستقل از اجرای برنامه و یا عدم اجرای برنامه هست. این نوع حافظه از لحاظ سخت افزاری انواع مختلفی داره مثل:هارد دیسک ها، فلاپی دیسک ها(که دیگه الان منقرض شده) ، حافظه های USB (بصورت فلش مموری)، سی دی ها، دی وی دی ها، و نوع خاصی از IC ها با نام EPROM (که اطلاعات سیستم عامل اندروید هم فکر کنم روی همین نوع ICها قرار داشته باشه اگه اشتباه نکنم)
برنامه وقتی اجرا میشه اطلاعات لازم رو از حافظه دائمی میخونه و میاره به داخل حافظه موقت و بعد از حافظه موقت خونه های حافظه بایت به بایت خونده میشه در رجیسترهای مخصوصی قرار میگره و CPU روی مقادیر اون رجیسترها (که اونها هم بخشی از حافظه موقت هستند) پردازش انجام میده و نتیجه رو مجددا روی رجیسترها قرار میده و تصمیم گیری میشه که نتیجه این پردازش روی حافظه موقت بشینه یا به حافظه دائمی منتقل بشه و یا به صفحه مانیتور منتقل بشه.
پردازش اطلاعاتی که روی حافظه موقت یعنی RAM قرار داره بسیار سریع تر انجام میشه تا اطلاعاتی که توی حافظه دائمی قرار داره. توی دنیای PC ها چون حافظه دائمی بصورت هارد دیسک هست و هارد دیسکها اجزای مکانیکی دارند سرعت کار کردن با این اطلاعات خیلی خیلی پایین تر از سرعت کار کردن با اطلاعات موجود در RAM هست. در دنیای دستگاه های اندرویدی چون حافظه های دائمی بصورت مثل هارد دیسک PC ها نیست و حافظه دائمی اونها هم از نوع IC های قابل خوندن و نوشتن هست بالتبع سرعت عملیات بالاتر خواهد بود. ولی خود من هم نمیدونم که سرعت عملیات پردازش در حافظه های موقت و حافظه های دائمی در دستگاه های اندرویدی که هر دو از نوع IC هستند چه مقدار با همدیگه تفاوت داره.
این یه مقدمه ای بود که بدرد خود من هم میخورد برای مرور مسئله.
حالا سوال اینجاست که وقتی دیتابیسی ساخته میشه این دیتابیس صرفا فقط و فقط در حافظه دائمی دستگاه اندرویدی ساخته میشه منتهی آدرس محل ذخیره سازی اش فرق میکنه یا اینکه میشه دیتابیس رو مستقیما در حافظه موقت(یعنی RAM) ساخت بدون اینکه فایلی در حافظه دائمی ایجاد بشه....
اگه قرار باشه که دیتابیس در حافظه رم ایجاد بشه که خیلی بد خواهد بود. چون اولا با اجرای برنامه هر بار دیتابیس باید ایجاد بشه و دوما چون در حافظه رم هست با خارج شدن از برنامه کل دیتابیس پاک خواهد شد و تمامی اطلاعات اون از بین خواهد رفت. پس این اصلا و اصلا گزینه مطلوب و کاربردی نیست که قرار باشه دیتابیس در رم (یعنی همون حافظه موقت) ایجاد بشه. و حتما دیتابیس باید در حافظه دائمی ایجاد بشه تا اطلاعاتش بصورت دائمی موجود باشه و وجود دبتابیس وابسته به اجرای یا عدم اجرای برنامه نباشه.
تا اینجا مشخص شد که دیتابیس حتما و حتما بر روی حافظه دائمی دستگاه اندرویدی ساخته میشه. و فقط و فقط آدرسش و محل ذخیره سازی اش میتونه متفاوت باشه.
حالا باید نسبت به انواع حافظه های دائمی دستگاه اندرویدی اطلاعات بدست آورد که چند نوع حافظه دائمی در دستگاه های اندرویدی وجود داره.
برای روشن شدن مسئله برمیگردیم به مثال PC ها. در دنیای PC ها در بین حافظه های دائمی هارد دیسک ها در اولویت بسیار بالایی قرار دارند. به یک PC میشه بسته به توان ساپورت مادربوردش یه تعداد مشخصی هارد دیسک وصل کرد مثلا دو تا یا سه تا و یا چهارتا. دو پارامتر مهم هست یکی بیشترین تعداد هارد دیسکی که به یک PC میشه وصل کرد و نیز بیشترین ظرفیت هارددیسکی که مادربورد اون PC میتونه ساپورت کنه. در قدیم حداکثر ظرفیت قابل پشتیبانی هارد دیسک در هد چند صد گیگابایت بود ولی الانه به مرز چند ترابایت رسیده. هر هارد دیسک رو هم میشه به هر تعداد دلخواه پارتیشن بندی تقسیم کرد و در هر پارتیشن پوشه ها و فایلهای خودمون رو مدیریت کنیم. از بین یکی از پارتیشنهای هارد دیسک یکی از اونها برای سیستم عامل و لود شدن اون در نظر گرفته میشه. و برای نصب سیستم عامل شما از یک حافظه دائمی مجزا در PC ها حتما باید استفاده کنید مثلا از یک سی دی یا دی وی دی و یا حافظه USB فلش مموری. از روی خود هارد دیسک کامپیوتر نمیتونید سیستم عامل روی اون نصب کنید.
همه این موارد رو برای این مطرح کردم که برسم به این سوالها:
1- در دنیای اندروید حافظه های دائمی به چه شکلی هست؟ (تا اونجایی که من متوجه شدم اونها هم به شکل IC هستند مثل فلش مموری ها)
2- آیا مثل ویندوز حالت پارتیشن بندی وجود داره؟ (تا اونجایی که من فهمیدم نه، شایدم اشتباه کنم)
3- آیا مثل ویندوز حالت پوشه بندی خاص وجود داره؟ یعنی اینکه یه سری پوشه ها هستند که پوشه های مخصوص هستند مثلا مثل پوشه windows در سیستم عامل ویندوز یا پوشه program files؟ (تا اونجایی که من فهمیدم دو تا پوشه عمده هست یکی به نام data و یکی هم به نام system ، اینکه کار اینها چیه و مخصوص چی هستند فعلا نمیدونم و البته کلی پوشه های دیگه هم هستند)
4- و مهمتر از همه اینها بهتر است که فایل دیتابیس در کدوم مسیر و کدوم پوشه ساخته بشه؟ (از اونجایی که مطمئن هستیم فایل دیتابیس حتما روی حافظه دائمی ساخته میشه)
و اما سوالاتم درباره توضیحات دوست عزیز ALU: (متن کامل توضیحات رو میزارم که وسطش سوالاتم رو درج کنم)
«سورس کد اول که دوستمون قرار دادند ، یک بانک اطلاعاتی رو میسازه!، (مشخص نکردید که فایل بانک اطلاعاتی در کحای حافظه دائمی ساخته میشه، من که بررسی کردم در آدرس
data/data/AppPackageName/databases/DBname.sqlite
ایجاد میشه) این بانک اطلاعات رو در زمان اجرا وارد برنامه میکنه (منظورتون همون باز کردن فایل دیتابیس ایجاد شده از حافظه دائمی در آدرس مشخص شده بالا، برای خوندن یا نوشتن اطلاعات و همچنین گزارش گیری هست؟) ( و اگر تنها هدف همین باشه ، عالیه !(خب تنها هدف کار با دیتابیس ها مستقل از اینکه فایل دیتابیس کجا ذخیره شده باشه، همون بازکردنشون برای خوندن و نوشتن اطلاعات هست دیگه، مگه هدف دیگه ای هم غیر از این وجود داره که بشه به هدف اصلی اضافه کرد؟) ) ، اما روش من ، بانک آماده که ممکنه هزاران رکورد داشته باشه رو ترجیحا در بانک (این بخش جمله تون دارای ابهامه، بانک آماده رو در بانک میسازه، یعنی چی؟ منظورتون از کلمه اول بانک و کلمه دوم بانک چیه؟ فکر کنم کلمه اول همون بانک دیتابیسی هست که میخواهیم ایجاد کنیم ولی کلمه دوم بانک چیه؟ اگه منظور آدرس هست چه آدرسیه؟) و درصورت در دسترس نبودن (در دسترس نبودن چی؟ از این عبارت من اینو متوجه میشم که غیر از حافظه دائمی داخلی و حافظه دائمی خارجی یه جای دیگه ای هم به عنوان حافظه دائمی وجود داره؟ آیا منظورتون اینه؟) در حافظه ی داخلی ذخیره میکنه ، علاوه بر اینکه اون سورس کد حافظه ی داخلی رو پشتیبانی میکنه ، به شما میگه در حال حاظر از کدوم حافظه استفاده میکنه ، بهتون اجازه میده که در حافظه ی داخلی هم فایل ذخیره کنید ( اون موقع من تو استک میگشتم ، همه میگفتم نمیشه ! ، فقط میشه بانک رو ذخیره کرد :| ) ، و اینکه هیچ وقت به یوز "نه" نمیگه ! ، یعنی در بدترین شرایط سعی میکنه بانک رو آماده کنه :) ، نکته ی جالب تر اینه که تابع خروجی بولین داره ، که میتونید اگر fasle بود ، یک دیالوگ نمایش بدید و به کاربر توضیحی بدید و از برنامه خارج بشید :) ، این تفاوت سورس کد ها ( که زمین تا آسمون بود ! ) + نقاط قوت سورس کد نسبت به کد های مشابه(موارد دیگه ای که ذکر کردید از مزایاست، کاملا متوجه اش میشم و در موردش سوالی ندارم)»
من از این عبارت که بانک آماده رو در بانک میسازه و در صورت در دسترس نبودن در حافظه داخلی ذخیره میکنه، این برداشت رو میکنم که غیر از حافظه داخلی و حافظه خارجی یه جای دیگه ای هم وجود داره. آیا برداشت من درسته؟ میشه در این مورد بیشتر توضیح بدید؟
تا اونجایی که من متوجه شدم آدرسهای مختلفی برای دسترسی جهت ذخیره سازی وجود داره. میشه در باره این آدرس ها توضیح بدید؟ مثال تبلت خودم رو می زنم. تبلت من 2 گیگابایت رم و 16 گیگابایت حافظه دائمی داره. و هنوز براش حافظه اضافی که به اسلت حافظه تبلت وارد میشه نگرفتم (که تا 64 گیگابایت رو ساپورت میکنه) حالا این 16 گیگابایت حافظه داخلی محسوب میشه یا حافظه خارجی؟ اگه اون 64 گیگابایت رو هم وارد کنم اون وقت اون چی؟ اون داخلی محسوب میشه یا خارجی؟ حتی امکان وصل کردن حافظه های USB فلش مموری با کابل OTG هم داره. حالا اون وقتی وصل میشه چی حساب میشه؟ حافظه داخلی یا خارجی؟ توی محیط برنامه نویسی چه جوری به آدرس اونها میشه دسترسی پیدا کرد؟ من توی پوشه ها گشتم و فکر کنم این آدرس otg باشه: mnt/otgusb
و اصلی ترین سوالم که هنوز جوابش رو نگرفتم اینه که چه موقع بهتر هست که فایل دیتابیس رو در حافظه خارجی ذخیره کنیم و چه موقع بهتر هست که در حافظه داخلی ذخیره کنیم. و در حافظه داخلی ایا در هر آدرسی دوست داشتیم میتونیم ذخیره کنیم و یا آدرس مشخصی وجود داره؟ مسلما وقتی حافظه خارجی در دسترس نیست تنها انتخاب حافظه داخلی خواهد بود. ولی در صورت در دسترس بودن حافظه خارجی آیا فایل دیتابیس رو در حافظه خارجی و یا در حافظه داخلی باید ذخیره کنیم؟ بهرحال در هر آدرسی که ذخیره کنیم مستقل از محل ذخیره سازی هر کاری که با دیتابیس لازم باشه میتونیم انجام بدیم فارغ از اینکه چند هزار رکورد داشته باشه!
در کل از همه این تاپیک من هنوز به جواب سوالم نرسیدم، مشکل یا سوالم در مورد نحوه ذخیره سازی فایل دیتابیس در آدرسهای مختلف نیست. اون کاملا برام حل شده.
با فرض موجود بودن کارت حافظه SD:
چه موقع بهتره فایل دیتابیس در کارت حافظه SD ذخیره بشه و چه موقع بهتره در حافظه داخلی ذخیره بشه؟ و یا اصلا هیچ فرقی نمیکنه که در چه آدرسی ذخیره بشه؟
اول توضیحاتی که دادم شاید باعث ایجاد شبه براتون شده رو کامل میکنم
بانک رو میتونیم در 2 مسیر ذخیره کنیم ، حافظه ی دستگاه و کارت حافظه ی جداشدنی ! ، این انتخاب برنامه نویس هست که فایل ها رو کجای کارت حافظه ذخیره کنه ، اما در مورد حافظه ی دستگاه ، آدرسی که اجازه ی ذخیره در اون رو داریم ، یک پوشه ی اختصاص یافته به برنامه ی ما و نام پکیج ماست.
stroage/0/Android/data/ir.negano.myTestApp
این پوشه که مرتبط با نام پکیج هاست ، زمانی که برنامه حذف میشه ، یا بهتر بگم پکیج حذف میشه ، اگر پوشه ای با نام اون پکیج وجود داشته باشه ، حدف میشه ، پس اطلاعات برنامه پاک میشه.
- حالا اگر بانک رو در کارت حافظه ذخیره کنیم ، بعد از حذف برنامه بانک خودکار حذف نمیشه
- ممکنه حافظه ی داخلی فضای کافی نداشته باشه ( برای بانک های حجیم ! )
- حافظه ی دستگاه قابل نوشتن نباشه
- و...
با تمام این حرفها ، من خودم سورس کد مورد بحث این تاپیک رو به نحوه دیگه ای استفاده میکنم ، یعنی اولویت اول با حافظه ی داخلی هست :) ، البته اینم وابسته به شرایط هست ، ولی معمولا این حالت رو ترجیح میدم
سلام به نظر تون این کد چی کم داره ویا کجاش اشتباست کد کاملا واضحه ولی من جواب نمیگیرم نمیدونم کجا رو اشتباه کردم
package ax.neveshte.qom;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import android.app.Application;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Environment;
public class G extends Application {
public static Context context;
public static SQLiteDatabase database;
public static final String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
prepareDB();
}
private boolean prepareDB() {
String packageName = context.getPackageName();
try {
String PATH_APP = DIR_SDCARD + "/android/data/" + packageName;
String state = Environment.getExternalStorageState();
InputStream is = context.getAssets().open("MYdB.sqlite");
if (state.equals(Environment.MEDIA_MOUNTED)) {
File DB_PATH = new File(PATH_APP + "/MYdB.sqlite");
if (DB_PATH.exists()) {
database = SQLiteDatabase.openOrCreateDatabase(DB_PATH, null);
return true;
}
else {
if (copy(new FileOutputStream(DB_PATH), is)) {
database = SQLiteDatabase.openOrCreateDatabase(DB_PATH, null);
return true;
}
else {
return false;
}
}
}
else {
PATH_APP = getFilesDir().toString();
File dbFile = new File(getFilesDir().toString() + "MYdB.sqlite");
if (dbFile.exists()) {
database = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
return true;
}
else {
FileOutputStream os = openFileOutput("MYdB.sqlite", context.MODE_PRIVATE);
if (copy(os, is)) {
database = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
return true;
}
else {
return false;
}
}
}
}
catch (Exception e) {
e.printStackTrace();
return false;
}
}
private boolean copy(OutputStream os, InputStream is) {
try {
int readed = 0;
byte[] buffer = new byte[8 * 1024];
while ((readed = is.read(buffer)) > 0) {
os.write(buffer, 0, readed);
}
try {
is.close();
}
catch (Exception e) {
e.printStackTrace();
}
try {
os.flush();
}
catch (Exception e) {
e.printStackTrace();
}
try {
os.close();
}
catch (Exception e) {
e.printStackTrace();
}
return true;
}
catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
برا من جواب داد با کمترین تغییرات ممنون از زحمتی ک کشیدین
public class G extends Application {
public static Context context;
public static LayoutInflater inflater;
public static Activity currentActivity;
public static Boolean clickCol = false;
public static Boolean clickRow = false;
public static int col;
public static int row;
public static SQLiteDatabase database;
public static final String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
public static final String DIR_DATABASE = DIR_SDCARD + "/Triz/Database/";
public static final String dbName = "Triz.sqlite";
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
new File(DIR_DATABASE).mkdirs();
//copyFromAsset();
prepareDB();
manageDatabase();
}
//************************************ DB **********************************************************
private boolean prepareDB() {
try {
String state = Environment.getExternalStorageState();
InputStream is = context.getAssets().open(dbName);
if (state.equals(Environment.MEDIA_MOUNTED)) {
File DB_PATH = new File(DIR_DATABASE + dbName);
if (DB_PATH.exists()) {
database = SQLiteDatabase.openOrCreateDatabase(DB_PATH, null);
return true;
}
else {
if (copy(new FileOutputStream(DB_PATH), is)) {
database = SQLiteDatabase.openOrCreateDatabase(DB_PATH, null);
return true;
}
else {
return false;
}
}
}
else {
//isUsingInternalStorage = true;
//DIR_DATABASE = getFilesDir().toString();
File dbFile = new File(getFilesDir().toString() + "/" + dbName);
if (dbFile.exists()) {
database = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
return true;
}
else {
FileOutputStream os = openFileOutput(dbName, context.MODE_PRIVATE);
if (copy(os, is)) {
database = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
return true;
}
else {
return false;
}
}
}
}
catch (Exception e) {
e.printStackTrace();
return false;
}
}
private boolean copy(OutputStream os, InputStream is) {
try {
int readied = 0;
byte[] buffer = new byte[8 * 1024];
while ((readied = is.read(buffer)) > 0) {
os.write(buffer, 0, readied);
}
try {
is.close();
}
catch (Exception e) {
e.printStackTrace();
}
try {
os.flush();
}
catch (Exception e) {
e.printStackTrace();
}
try {
os.close();
}
catch (Exception e) {
e.printStackTrace();
}
return true;
}
catch (Exception e) {
e.printStackTrace();
return false;
}
}
سلام دوست گرامی من میخوام امکان insert داشته باشم ( یعنی میخوام هر شخصی در گوشیه شخصی حودش بتونه اطلاغاتی وارد و ذخبره کنه .من کوئری insert نوشتم دیتابیسم کپی میشه روی حافظه منتها من میخوام مطمئن بشم اگر من روی گوشیم یک سری اطلاعات وارد کنم روی پایگاه میمونه . من اصلا گیج شدم برای دستور insert به غیر از نوشتن query کار خاص دیگه ای باید انجام بدم ؟
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .