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

اشکال در ایجاد دایرکتوری

BrotherV  11 سال پیش  11 سال پیش
0 0

با سلام و احترام خدمت استاد گرامی جناب آقای آقاجانی و تمامی همراهان آندروید
من روی مبحث دیتابیس دارم کار می کنم و طبق برنامه زیر قراره که یک فولدر در صورت عدم وجود تولید بشه و دیتابیس را در اون بنویسه. خوب برنامه روی شبیه ساز درست اجرا میشه اما روی 2 مدل کوشی تست کردم و روی یکی از اونها پیغام Force close میده. و روی اولی کار میکنه اما زمانی که فولدر ایجاد شده را به صورت دستی پاک می کنم برای دفعه بعد فولدر را ایجاد نمیکنه،  و بعد از اینکه میخواد دیتابیس را تو مسیر مورد نظر بنویسه پیام Force Close میده. بعد که برنامه بسته میشه فولدر هم ایجاد شده. خوب اصولا نباید اینطوری باشه. حالا به نظر شما باید چکار کرد؟

public final String SDCard_Path = Environment.getExternalStorageDirectory().getAbsolutePath();
public final String destPath = SDCard_Path +"/DatabaseTest/";
public final String dbPath = destPath+"/TestDatabase.sqlite";

File file = new File(destPath); if(!file.exists()){ file.mkdirs(); Log.i("Directory","Created"); }else{ Log.i("Directory","Exist"); }

database=SQLiteDatabase.openOrCreateDatabase(dbPath, null);
database.execSQL("CREATE TABLE DatabaseTest (Row_id INTEGER PRIMARY" + " KEY NOT NULL UNIQUE , " + "PersonId INTEGER NOT NULL )");
0 0
دیدن این لینک خالی از لطف نیست (11 سال پیش)
0 0
شاید به خاطر اینه که پرمیشن نداری!؟ (11 سال پیش)
 برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال 
سامان پاپی  11 سال پیش
0 0

دوست عزیز سلام و خسته نباشید

من خودم به شخصه برای کپی database و مطمئن شدن از این کار از کد های زیر استفاده میکنم.

کد های اصلی اینا هستن

 	public void useable(){
		
		boolean checkdb=checkdb();
		
		if(checkdb){

		}else{
			
			this.getReadableDatabase();
			
			try{
			copydatabase();
			}catch(IOException e){
			}
			
		}
		
		
		
	}
	
	public void open(){
		
		mydb=SQLiteDatabase.openDatabase(path+Name, null, SQLiteDatabase.OPEN_READWRITE);
		
	}
	
	public void close(){
		mydb.close();
	}
	
	public boolean checkdb(){
		
		SQLiteDatabase db=null;
		try{	
		db=SQLiteDatabase.openDatabase(path+Name, null, SQLiteDatabase.OPEN_READONLY);
		}
		catch(SQLException e)
		{

		}
		//mydb.close();
		return db !=null ? true:false ;
		
	}
	
	public void copydatabase() throws IOException{
		OutputStream myOutput = new FileOutputStream(path+Name);
		byte[] buffer = new byte[1024];
		int length;
		InputStream myInput = mycontext.getAssets().open(Name);
		while ((length = myInput.read(buffer)) > 0) {
		myOutput.write(buffer, 0, length);
		}
		myInput.close();
		myOutput.flush();
		myOutput.close();
	}
اینا مقدار بیشتری از کد هان شاید کمکت کنه
 public class database extends SQLiteOpenHelper { public final String path="data/data/com.example.s06_project01/databases/"; public final String Name="database"; public SQLiteDatabase mydb; private final Context mycontext; public database(Context context) { super(context, "database", null, 1); mycontext=context; } @Override public void onCreate(SQLiteDatabase arg0) { // TODO Auto-generated method stub } @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { // TODO Auto-generated method stub } public void useable(){ boolean checkdb=checkdb(); if(checkdb){ }else{ this.getReadableDatabase(); try{ copydatabase(); }catch(IOException e){ } } } public void open(){ mydb=SQLiteDatabase.openDatabase(path+Name, null, SQLiteDatabase.OPEN_READWRITE); } public void close(){ mydb.close(); } public boolean checkdb(){ SQLiteDatabase db=null; try{ db=SQLiteDatabase.openDatabase(path+Name, null, SQLiteDatabase.OPEN_READONLY); } catch(SQLException e) { } //mydb.close(); return db !=null ? true:false ; } public void copydatabase() throws IOException{ OutputStream myOutput = new FileOutputStream(path+Name); byte[] buffer = new byte[1024]; int length; InputStream myInput = mycontext.getAssets().open(Name); while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } myInput.close(); myOutput.flush(); myOutput.close(); }

0 0
امید وارم تونسته باشم کمکت کرده باشم (11 سال پیش)
پاسخ به سوال 
BrotherV  11 سال پیش
0 0

سلام به دوستان و تشکر از بابت همکاری

بعد از کمی کار کردن متوجه هر دو مشکل شدم. در گوشی اول با توجه به اینکه گوشی نوع چینی بوده و مسیر SD Card مونت نشده بود کلا خطا میداد که با توجه به لینکی که دوستان گذاشته بودم به این قضیه پی بردم و مشکل را در مرحله اول به صورت زیر حل کردم.

public static String	SD_Card = Environment.getExternalStorageDirectory().getAbsolutePath();
context = getApplicationContext(); 
String packageName = context.getPackageName();  
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    String dataBaseDirectory = dbPath + "/android/data/" + packageName+"/AppDB/DataBase.sqlite";
    makeDatabase(dataBaseDirectory);
}
if ( !Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    ContextWrapper cw = new ContextWrapper(getApplicationContext());
    File directory = cw.getDir("file", Context.MODE_PRIVATE);
    String DBdirectory = directory.toString() + "/AppDB/DataBase.sqlite";
    makeDatabase(DBdirectory);
}

.
.
.
.
public void makeDatabase(String dataBasePath){
    database=SQLiteDatabase.openOrCreateDatabase(dataBasePath, null);
    database.execSQL("CREATE  TABLE DatabaseTest (Row_id INTEGER PRIMARY"
				+ " KEY  NOT NULL  UNIQUE , "
				+ "PersonId INTEGER NOT NULL )");
}


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

context = getApplicationContext(); 
String packageName = context.getPackageName(); 
String dataBaseDirectory = "/data/data/"+packageName+"/AppDB/DataBase.sqlite";

database=SQLiteDatabase.openOrCreateDatabase(dataBaseDirectory, null);
dtabase.execSQL("CREATE  TABLE DatabaseTest (Row_id INTEGER PRIMARY"
			+ " KEY  NOT NULL  UNIQUE , "
			+ "PersonId INTEGER NOT NULL )");

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