آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

کد کامل برای کپی بانک اطلاعاتی در حافظه دستگاه یا SD Card

jamal2012  9 سال پیش  6 سال پیش
+9 0

در مورد ویدئویی که استاد در مورد دیتا بیس گذاشته بودند سوال داشتم ایا کپی کردن دیتا بیس در اس دی  به اون شکلی که استاد گفتند کافی یا نه ارور های خاص خودشو داره وباید کد هایی بهش اضافه بشن.

+3 0
سوالتون زیاد واضح نیست!استاد هرچی لازمه در ویدیو گفتن نکته ای دیگه نمیمونه.شما هرچی استد گفتنو انجام بدین مشکلی پیش نمیاد. (9 سال پیش)
+1 0
منظورم اینه که دیتا بیسی که ار روش استاد ایجاد میکونیم یعنی مستقیما کپی تو اس دی کارت هنگام نصب فایلapkمشکلی پیش نمیاد با گوشی های مختلف . (9 سال پیش)
0 0
: نه (9 سال پیش)
+1 0
نه مشکلی پیش نمیاد _ ادرس SD CARD تغییر نمیکنه ! پس همیشه همونجا ساخته میشه که شما ادرس میدید (9 سال پیش)
 برای این سوال 10 پاسخ وجود دارد.
پاسخ به سوال 
AhmadVB  9 سال پیش
+8 0

به طور کل در یک برنامه واقعی هیچ گاه شما دیتابیس را کپی نخواهید کرد.شما به دستگاه کاربر دسترسی ندارید که جداگانه دیتابیس را روی آن کپی کنید.

این کار استاد نیز جنبه آموزشی داشته و به دلیل کوتاه تر شدن موضوع آموزش انجام شده است.

شما برای ایجاد یک دیتابیس باید از دستورات 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());
}
+2 0
البته در مواردی که ما در دیتا بیس اطلاعاتی داریم که می خواهیم آن ها را ویرایش کنیم باید ابتدا آن را روی اس دی کارت کپی کنیم. پس اون آموزش هم برای همین امر هست. (9 سال پیش)
0 0
ی ریزه کاریهایی داره که قبلا توی انجمن توضیح داده شده است. با ی سرچ به نتیجه دلخواه می رسی (9 سال پیش)
+1 0
نخیر جناب، کی گفته نمیتونیم دیتابیس رو روی دستگاه کاربر کپی کنیم!!!! پس این همه اپلیکیشن هایی که توی خودشون اطلاعات از پیش تعریف شده دارن و شما نصب میکنید، اونا رو به شما نمایش میدن بدون اینکه به اینترنت متصل باشید، این اطلاعات رو دارن از کجا میخونن. مثلا اپلیکیشنی که اطلاعات آژانس های مسافرتی رو به شما نشون میده، این اپ ها دیتابیس های از پیش تعریف شده ای دارن که اطلاعات توی اون ها ذخیره شده، بعد این دیتابیس موقع نصب نرم افزار روی گوشی کپی میشه روی گوشی کاربر و اطلاعات از روشون خونده میشه و مثلا در قالب یک لیست ویو یا هر ویو دیگه ای به کاربر نمایش داده میشن، نه اینکه تازه من بیام بعد نصب نرم افزار تو برنامم با دستورات SQL ( نه My SQL به بیان جناب عالی)، جدول اطلاعات بسازم روی دیتابیسمو و داده توش درج کنم و .... اینجوری که کاربر باید یه ساعت منتظر شه تا دیتابیس آماده شه و برنامه بتونه بیاد بالا!!! بعدش هم اینکه میفرمایید "..ما به دستگاه کاربر دسترسی نداریم تا جداگانه دیتابیس روش نصب کنیم..." واقعا بی معنیه، چون وقتی یه کاربر دکمه نصب نرم افزار رو میزنه یه سری موارد پیش فرض از سمت سیستم عامل اندروید به ما اجازه داده میشه، مثلا ایجاد فایلها تو مسیر دایرکتوری های مربوط به پکیج برناممون، برای یه سری موارد هم موقع نصب از کاربر اجازه میگیریم اگه نیاز باشه مثل نوشتن رو حافظه خارجی، permission ها برای همین جور موارد هستند دیگه. (6 سال پیش)
پاسخ به سوال 
مجتبی یگانه  9 سال پیش
+28 0

من خودم خیلی رو این موضوع فکر کردم و آخرش این کد رو نوشتم ، کدی هست که رو GLX های 50 تومنی هم کار میکنه D:

واقعیت اینه که هیچ جایی کدی به این کاملی پیدا نکردم ! ، اما این کد هم میتونه تمیز تر بشه که به عهده ی خودتون !

  1. اگه کارت حافظه وجود داره کپی کن رو کارت حافظه و ازش استفاده کن
  2. اگه کارت جافظه وجود نداره ، اگه میشه از حافظه ی داخلی استفاده کنی ، بانک رو کپی کن و آدرس پوشه ای که بانک در اون کپی شده رو به عنوان پوشه ی برنامه بده ، خیلی از مراجع و علما گفته بودند که نمیشه تو حافظه ی داخلی فایل دیگه ای (مثلا تصویر) کپی کرد ، که الان با داشتن آدرس اون پوشه ، این کار به سادگی انجام میشه !
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;
	}
}

امیدارم این کد آماده باعث نشه از برنامه نویسی ، به کتاب نویسی و کپی پیست کد منحرف بشید ، استفاده مفید کنید :)

0 0
این مکمل کد استاده یا جایگزین؟ (9 سال پیش)
+4 0
مکمل هست ، چون تو کد های قبلی اگر کارت حافظه در دسترس نبود ، مشکل پیش میومد اما اینجا حافظه ی داخلی هم جزو گزینه های روی میزه D: (9 سال پیش)
0 0
یعنی این هر دو حالت رو در نظر داره پس میشه جایگزین کد استاد بشه؟ (9 سال پیش)
0 0
عزیز جان چرا انقدر سخت میگری ؟ ، میشه دیگه ! (9 سال پیش)
0 0
ممنون دوست من وجود امثالی مثل شما برای هر انجمن نعمته خیلی خیلی ممنونم ازلطفتون (9 سال پیش)
0 0
ببخشید جناب alu lمیشه کد بالارو در قالب یه پروژه آماده ساده بذارید،در استفاده از کد با توجه به اینکه متغیر زیاد داره به اررور میخورم. ممنون (9 سال پیش)
0 0
دوستان با سابقه تر میدونن که من با گذاشتن پروژه کلا مخالف ام ! ، کد خیلی سادست ، بیشتر تلاش کنید (9 سال پیش)
0 0
بعضی از جاهای کد اظافه هستش یا دوبار تکرار شده اون هارو پاک کنین و یکم دست کاری کنین درست میشه.در کل کد درست کار میکنه. (9 سال پیش)
0 0
مهدی کدی که اضافه هاش رو پاک کردی رو بزار عمو ببینه :))) (9 سال پیش)
0 0
قرار شد خودشون حل کنن دیگه.مجتبی جون شما هم اگه کدو خواستی بیا پیش خودم قشنگ کامل برات توضیح میدم:)) (9 سال پیش)
0 0
دوستان لطف کنن بذارن دیگه آخر هفته امتحان دارم فکرمو مشغول نذارین!همین دفه فقط! (9 سال پیش)
0 0
با سلام. منم داشتم برای برنامه رقص نورم امکان ذخیره تنظیمات در دیتابیس رو کار میکردم که به این مشکل خوردم. یعنی طبق آموزشهای استاد پیش می رفتم و برنامه ام کرش میکرد. بعد دقت که کردم دیدم برای امولاتورم sdcard تعریف نکردم. بعد از تعریف sdcard برنامه ام بدون هیچ مشکلی کار کرد و اطلاعات بدرستی در دیتابیس ذخیره و ازش خونده می شدند. متوجه این موضوع شدم که اگه دستگاه sdcard نداشته باشه باعث کرش برنامه خواهد شد. پس دنبال راه حل بودم که دوست عزیزمون atras این تاپیک رو معرفی کرد. البته اعتراف میکنم که توی انجمن براش سرچ نزدم و بعنوان یه تاپی سوال پرسیدم. البته هنوز کدها رو تست نکردم نتیجه اش رو حتما خبر میدم و اگه توضیح بیشتری لازم بود تقدیم میکنم. با تشکر از همه دوستان (9 سال پیش)
0 0
(9 سال پیش)
0 0
این دقیقا چکار میکونه این وسط isUsingInternalStorage = true; (9 سال پیش)
0 0
معنای این خط چیه File dbFile = new File(getFilesDir().toString() + "/" + dbName); (9 سال پیش)
0 0
معنای این چیه "/" (9 سال پیش)
+1 0
jamal2012 @ یه فایل جدیدی رو ایجاد میکنه و به String تبدیل میکنه ! (9 سال پیش)
0 0
منظورم همینجاست به جای این"/" باید android/data/" + packageName رو بزارم؟ممنون میشم کمکم کنید فقط فردا رو وقت دارم پروژه ام اماده شده فقط همینجا گیر کردم اگر اس دی کارت نبود روی گوشی تو این پوشه چطور android/data/" + packageName میشه دیتا بیسو از assetsریخت با توجه به کد بالا کمکم کنید ممنون (9 سال پیش)
0 0
(9 سال پیش)
0 0
این کد شما تو جنی موشن که اس دی کارت براش تعریف نشده کرش میکونه (9 سال پیش)
0 0
PATH_APP=/storage/emulated/0/my_database/db.sqlite (9 سال پیش)
پاسخ به سوال 
+2 0

با سلام.
من کد پیشنهادی دوستمون AhmadVB  رو برای ایجاد دیتابیس تست کردم. بدون هیچ مشکلی برنامه ام باهاش کار کرد. براحتی در دیتابیسم اطلاعات ذخیره کردم و ازش اطلاعات خوندم. بعد یه بررسی متوجه شدم که دیتابیس با این روش در پوشه نصب خود برنامه ایجاد میشه. البته نمیشه فایل دیتابیس رو بیرون کشید و مثلا محتویاتش رو توی sqlite manager دید یا ویرایش کرد. آدرس ذخیره سازی به شکل زیر هست:
data/data/AppPackageName/databases/DBname.sqlite
حالا موندم سر دو راهی که از کدوم روش در نهایت برای برنامه ام استفاده کنم. این روش رو یا روش پیشنهادی دوستمون ALU  رو.

میشه مثلا برای تست در محیط امولاتور دیتابیس رو توی sdcard ساخت و باهاش کدنویسی های لازم و تست های لازم رو انجام داد و بعد از اینکه برنامه از هر لحاظ اوکی شد روش ایجاد دیتابیس رو از روش اول یعنی روش AhmadVB استفاده کرد. اینجوری دیگه هیچ دردسری نخواهیم داشت و کافیه فقط خط دستور ایجاد دیتابیس رو عوض کنیم.

حالا به لحاظ فنی و موارد آتی از کدوم روش استفاده کنیم بهتره؟ سوال من در مورد نحوه پیاده سازی روش نیست. من با نحوه پیاده سازی روش مشکلی ندارم و از هر کدوم لازم باشه استفاده میکنم. سوالم دقیقا در مورد دلیل استفاده از هر کدوم از این روشهاست. به چه دلیل و در چه شرایطی از روش اول ( AhmadVB  ) و به چه دلیلی و در چه شرایطی از روش دوم (ALU) باید استفاده بکنیم.

ممنون میشم از دوستان عزیز و گرانقدر و مجرب انجمن در این مورد راهنمایی کنن تا بالاخره تصمیم بهینه رو در مورد برنامه ام اتخاذ کنم و به کارم ادامه بدم.

با تشکر

+2 0
اول که ممنون سوالتون باعث شد یه سری نکته یادم بیاد ! ، سورس کد اول که دوستمون قرار داند ، یک بانک اطلاعاتی رو میسازه ! ، این بانک اطلاعات رو در زمان اجرا وارد برنامه میکنه ( و اگر تنها هدف همین باشه ، عالیه ! ) ، اما روش من ، بانک آماده که ممکنه هزاران رکورد داشته باشه رو ترجیحا در بانک و درصورت در دسترس نبودن در حافظه ی داخلی ذخیره میکنه ، علاوه بر اینکه اون سورس کد حافظه ی داخلی رو پشتیبانی میکنه ، به شما میگه در حال حاظر از کدوم حافظه استفاده میکنه ، بهتون اجازه میده که در حافظه ی داخلی هم فایل ذخیره کنید ( اون موقع من تو استک میگشتم ، همه میگفتم نمیشه ! ، فقط میشه بانک رو ذخیره کرد :| ) ، و اینکه هیچ وقت به یوز "نه" نمیگه ! ، یعنی در بدترین شرایط سعی میکنه بانک رو آماده کنه :) ، نکته ی جالب تر اینه که تابع خروجی بولین داره ، که میتونید اگر fasle بود ، یک دیالوگ نمایش بدید و به کاربر توضیحی بدید و از برنامه خارج بشید :) ، این تفاوت سورس کد ها ( که زمین تا آسمون بود ! ) + نقاط قوط سورس کد نسبت به کد های مشابه (9 سال پیش)
+1 0
اصلاح ! ، خط سوم ، در بانک نه - در کارت حافظه / خط آخر قوط نه قوت D: (9 سال پیش)
پاسخ به سوال 
+2 0

با سلام به خدمت دوست خوبمون 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

و اصلی ترین سوالم که هنوز جوابش رو نگرفتم اینه که چه موقع بهتر هست که فایل دیتابیس رو در حافظه خارجی ذخیره کنیم و چه موقع بهتر هست که در حافظه داخلی ذخیره کنیم. و در حافظه داخلی ایا در هر آدرسی دوست داشتیم میتونیم ذخیره کنیم و یا آدرس مشخصی وجود داره؟ مسلما وقتی حافظه خارجی در دسترس نیست تنها انتخاب حافظه داخلی خواهد بود. ولی در صورت در دسترس بودن حافظه خارجی آیا فایل دیتابیس رو در حافظه خارجی و یا در حافظه داخلی باید ذخیره کنیم؟ بهرحال در هر آدرسی که ذخیره کنیم مستقل از محل ذخیره سازی هر کاری که با دیتابیس لازم باشه میتونیم انجام بدیم فارغ از اینکه چند هزار رکورد داشته باشه!

 

+1 0
خسته نباشید ، ماشاالله انقدر طولانیه که هنوز فرصت نکردید کامل اش کنید من تا آخر ویراست اول (!) خوندم ، واقعا چیزی نبود جز یه سری سوال و جواب که تو ذهن خودتون پیش اومده بود و خودتون بهش پاسخ داده بودید ، هر چند حتما برای خیلی های دیگه مفید خواهد بود :) (9 سال پیش)
0 0
با عرض شرمندگی وسط نوشتن متنم یه کاری پیش اومد که باعث شد متنم نیمه کاره بمونه. ولی حالا کاملش کردم. ممنون میشم دوستان بخونن و اگه نظر یا پیشنهادی درباره سوالاتم دارن بدن. خلاصه مطلب اینه که من توی برنامه ام باید یه فایل دیتابیس رو ایجاد و در یه آدرسی ذخیره کنم. حالا موندم که فایل دیتابیس رو در چه آدرسی ذخیره کنم بهتره؟ تکلیف این روشن بشه میتونم توسعه برنامه رو ادامه بدم. (9 سال پیش)
+3 0
ببخشید که خیلی رک میگم ، امیدوارم ناراحت نشید : اگر به جای وقتی که روی این متن طولانی تقریبا پر از سوالاتی که خودتون جواب همه شون رو دادید ، کامنت دوم من رو که چند دقیقه بعد از پاسخ به سوال اولتون درج کردم رو میخونید ، مشکلاتتون حل میشد ، من یه جا به اشتباه کارت حافظه رو بانک تایپ کردم و یه "قلت املاعی" که اصلاح اش کردم ، پس نصف متنی که نوشتید رو لازم نبود بنویسید ، 50 درصد متن باقی مونده ، 40 درصد اش توضیح واضحات بود ! ، الان که فکرش رو میکنم می بینم چه حوصله ای داشتم این همه متن رو خوندم :| ، همه ی سوالات شما با آشنایی با ساختار و فایل سیستم در سیستم عامل لینوکس ، قابل تشریح و پاسخ دادن هست ، و منم نمیتونم مثل شما یک فصل از کتاب سیستم عامل کارشناسی رو اینجا تایپ کنم ، اصلا نیازی نیست که دنبال طرح کردن سوالهایی گنگ از جواب های مبهم ، که خودمون از سوالهای آشکار که براشون جواب های مبهم داریم مطرح کنیم ، این باعث میشه همه چیز گنگ بشه ، دقیقا مثل جمله ی قبلی من ! ، توی این مورد من کلمات رو به چالش کشیدم و شما ذهن خودتون رو ! ، اما ذهنتون رو با چی به چالش کشیدید ؟ ، سوال هایی که از جواب های واضح مطرح شدن و با برگشت به عقب میشه به جواب اش رسید ؟! ، بهتر نیست ذهنمون رو چیز های بهتری به چالش بکشیم ؟ ، من خودم یه لحظه تعجب کردم ! ، اگر به جای 4 خط حرف من ، قرآن رو اینجوری کلمه به کلمه برسی می کردیم ، الان به خدا رسیده بودیم :) (9 سال پیش)
0 0
من واقعا عذرخواهی میکنم اگه باعث سوء تفاهم یا دلخوری شما دوست عزیز شدم. قصدم به نقد کشیدن یا ایراد گرفتن از توضیحات شما نبود. این رو به حساب تازه کار بودن من بزارید. و چون تازه کار هستم دوست دارم همه چیز رو با جزئیات متوجه بشم. من تازه از دنیای PC به دنیای اندروید کوچ کردم. و دوست دارم مفاهیم موجود در دنیای PC رو با مفاهیم موجود در اندروید معادل سازی کنم تا بهتر متوجه مسائل و تکنیک ها بشم. از طرفی هم قبول دارم که خلاف قاعده «کم گوی و گزیده گوی چون در» عمل کردم. کاری که شما دقیقا طبق اون قاعده عمل کردید و بسیار کارتون هم شایسته است. ولی به من به دید یه شاگرد دبستانی نگاه کنید که ذهن اش پر از سواله و تشنه یادگیری مباحث و مفاهیم جدید. یه جورایی هم به قول خودتون دانسته هام رو توی این تاپیک بیان کردم تا اگه جایی اش اشتباه هست دوستان گلی مثل شما که تجربه بیشتری نسبت به من دارن خطاهام رو بهم گوشزد کنن. ضمنا بابت دقت نکردن به توضیحتون در مورد غلط املایی هم معذرت خواهی میکنم. (9 سال پیش)
0 0
من یکی از همکارام در محل کارم کارشناسی نرم افزار خونده و ازش در مورد بحث سیستم عامل پرسیدم و گفت که یه کتاب 1500 صفحه ای که در دانشگاه ها اون تدریس میشه و ما هم واحدش رو گذروندیم که یکی از بحث هاش بحث فایل سیستم هست. مسلمه که برای هیچ کسی مقدور نیست که بشینه و این حجم از اطلاعات رو مطالعه کنه ولی بهرحال برای کار با اندروید نیاز به یه حداقل اطلاعات در مورد فایل سیستم اش هست. حالا من تازه کار و نوآموز اون حداقل اطلاعات رو از کجا باید بدست بیارم؟ چه خوب بود که اگه لینک آموزشی در این مورد سراغ دارید معرفی کنید. (9 سال پیش)
+1 0
به به :) ، الان شد ، پس ببینید چقدر قشنگ میشه یه سوال 2 خطی مطرح کرد ! ، مثل سوالی که در پاسخ پایینی مطرح کردید ، در مورد اون کتاب N صد صفحه ای باید بگم که من الان دارم کاردانی میخونم ، اما درس سیستم عامل مون استاد سخت گیری داره که کتاب کارشناسی ارشـــــــــــــــــــــد رو برای تدریس انتخاب کرده (فقط یک فصل اش رو حذف کرده ) ، پس اون کتابی که شما میگید برای هیچ کس مقدرو نیست مطالعه اش کنه ، ما مطالعه کردیم ، یاد گرفتیم ، امتحان دادیم و با 17 پاس اش کردیم ! ، الانم بعد گذشت یک سال از پاس کردن همون درس ، تمام مفاهیم اش تو ذهنمه و حاظرم دوباره امتحان بدم ! ، حتی دوستان هم دانشگاهی من تو سایت هستند که میتوند گفته های من رو تایید کنند :) (9 سال پیش)
0 0
من منظورم از هیچ کس ، افرادی بود که رشته اشون این نیست و میخوان کار برنامه نویسی کنن. داریم دوستانی رو توی انجمن که رشته اشون مثلا حقوق هست و یا رشته اشون مثلا پرستاری هست. و گرنه در توانایی و استعداد شما دوست خوبم هیچ شکی ندارم با توجه به فعالیتهایی که از شما در انجمن دیدم. (9 سال پیش)
پاسخ به سوال 
0 0

در کل از همه این تاپیک من هنوز به جواب سوالم نرسیدم، مشکل یا سوالم در مورد نحوه ذخیره سازی فایل دیتابیس در آدرسهای مختلف نیست. اون کاملا برام حل شده.

با فرض موجود بودن کارت حافظه SD:

چه موقع بهتره فایل دیتابیس در کارت حافظه SD ذخیره بشه و چه موقع بهتره در حافظه داخلی ذخیره بشه؟ و یا اصلا هیچ فرقی نمیکنه که در چه آدرسی ذخیره بشه؟

 

پاسخ به سوال 
مجتبی یگانه  9 سال پیش
+5 0

اول توضیحاتی که دادم شاید باعث ایجاد شبه براتون شده رو کامل میکنم

بانک رو میتونیم در 2 مسیر ذخیره کنیم ، حافظه ی دستگاه و کارت حافظه ی جداشدنی ! ، این انتخاب برنامه نویس هست که فایل ها رو کجای کارت حافظه ذخیره کنه ، اما در مورد حافظه ی دستگاه ، آدرسی که اجازه ی ذخیره در اون رو داریم ، یک پوشه ی اختصاص یافته به برنامه ی ما و نام پکیج ماست.

 stroage/0/Android/data/ir.negano.myTestApp

این پوشه که مرتبط با نام پکیج هاست ، زمانی که برنامه حذف میشه ، یا بهتر بگم پکیج حذف میشه ، اگر پوشه ای با نام اون پکیج وجود داشته باشه ، حدف میشه ، پس اطلاعات برنامه پاک میشه.

  1. حالا اگر بانک رو در کارت حافظه ذخیره کنیم ، بعد از حذف برنامه بانک خودکار حذف نمیشه
  2. ممکنه حافظه ی داخلی فضای کافی نداشته باشه ( برای بانک های حجیم ! )
  3. حافظه ی دستگاه قابل نوشتن نباشه
  4. و...

با تمام این حرفها ، من خودم سورس کد مورد بحث این تاپیک رو به نحوه دیگه ای استفاده میکنم ، یعنی اولویت اول با حافظه ی داخلی هست :) ، البته اینم وابسته به شرایط هست ، ولی معمولا این حالت رو ترجیح میدم

0 0
اشکالی نداره این مبحث رو به عنوان یه تاپیک جدید ایجاد کنم و اونجا به بررسی کامل تر بپردازیم؟ با این عنوان «مکان های مختلف ذخیره اطلاعات حیاتی در شرایط مختلف و دلیل ترجیح هر کدام» (9 سال پیش)
+1 0
چه اشکالی داره ؟ ، مطرح کنید تا سایر دوستان نظرشون رو بگن (9 سال پیش)
0 0
من پاسخ های قبلی را به دقت نخوندم اما فکر کنم بخش های مهمش را فهمیده ام. با این حال الان یک ابهام دارم. من روی گوشی که نگاه می کنم (گوشی روت نشده) دو تا حافظه می بینم. یکی extSdCard و دیگری sdcard0. وقتی هم که از درون برنامه می خواهم دیتا بیس را ذخیره کنم به راحتی به sdcard0 (که مطمئنا حافظه جداشدنی نیست!) دسترسی دارم و هر کجای آن بخواهم می توانم فایل ذخیره کنم. حالا سوال اینه که این جمله " آدرسی که اجازه ی ذخیره در اون رو داریم ، یک پوشه ی اختصاص یافته به برنامه ی ما و نام پکیج ماست." دقیقا یعنی چه؟ (9 سال پیش)
+1 0
بعضی دستگاه ها 2 حافظه دارند ، یک حافظه ی داخلی و یک حافظه ی ذخیره سازی ، که خودش مثل یک کارت حافظه هست ولی جدانشدنی ! ، شما میتونید از اون استفاده کنید ، اما تا زمانی که دستگاه روت نشده باشه ، از حافظه ی داخلی نمیتونید استفاده کنید (9 سال پیش)
0 0
با سلام. تبلت من هم که لنوو a3000 هست با اینحال که براش هنوز حافظه خارجی نخریدم ظاهرا خودش sdcard داره. چون برنامه ای که روی sdcard فایل ذخیره میکنه رو روش اجرا کردم و مشکلی نداشته. وقتی هم که در حالت recovery میارمش بالا دوتا sdcard نشون میده. ولی دستگاهم بطور پیش فرض روت هست. و من به همه جای حافظه دسترسی دارم. حالا میخوام بدونم آیا واقعا دستگاه دارای دوتا sdcard هست که هردوش هم intrnal هستند یا قضیه چیز دیگه ایه؟ (9 سال پیش)
+2 0
Environment.getExternalStorageDirectory().getAbsolutePath این دستور کدوم یکی را به من می دهد؟ (9 سال پیش)
+2 0
در مورد دسترسی به انواع SDcard ها من این لینک رو گیرآوردم که فکر میکنم براتون مفید باشه. (9 سال پیش)
پاسخ به سوال 
jamal2012  9 سال پیش
0 0

سلام به نظر تون این کد چی کم داره ویا کجاش اشتباست کد کاملا واضحه ولی من جواب نمیگیرم نمیدونم کجا رو اشتباه کردم

 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;
}
}

}
0 0
منم دقیقا به همین مدل نوشتم ولی جواب نمیده. ممنون می شم کسی راهنمایی کنه (8 سال پیش)
پاسخ به سوال 
محمد  9 سال پیش
0 0

0 0
منم همین مشکل دارم لطفا راهنمایی کنید.. (8 سال پیش)
0 0
در کل دور کد زدن برای کپی دیتا بیسو خط بکشید که تلف کردن وقته از کتابخونه sqliteHelper استفاده کنید (8 سال پیش)
پاسخ به سوال 
tiam  7 سال پیش
0 0

برا من جواب داد با کمترین تغییرات ممنون از زحمتی ک کشیدین

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;
}
}
0 0
(7 سال پیش)
پاسخ به سوال 
afr_msb  7 سال پیش
0 0

سلام دوست گرامی من میخوام امکان insert داشته باشم ( یعنی میخوام هر شخصی در گوشیه شخصی حودش بتونه اطلاغاتی وارد و ذخبره کنه .من کوئری insert نوشتم دیتابیسم کپی میشه روی حافظه منتها من میخوام مطمئن بشم اگر من روی گوشیم یک سری اطلاعات وارد کنم روی پایگاه میمونه . من اصلا گیج شدم برای دستور insert به غیر از نوشتن query کار خاص دیگه ای باید انجام بدم ؟


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .