سلام ، از همین پاسخ استفاده کنم برای پرسش خودم : getExternalStorageDirectory() مسیر کارت حافظه خارجی رو میده ؟ خب اگه گوشی بدون حافظه خارجی باشه چی میشه ؟ یا حافظه خارجی داره ولی کاربر خارجش کرده ؟ چون منم تقریبا از همین کدها استفاده میکنم . و تا حالا روی گوشی بدون کارت حافظه تست نکردم . مسیر حافظه داخلی کدش چیه که شرط بذاریم اگه خارجی وجود نداشت ، بگیم در حافظه داخلی کپی بشه ؟
بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ
استفاده از دیتابیس
مدیریت گفتگو
آخرین تغییر: 9 سال پیش
با سلام
من میخواستم یه کتاب بسازم و طبق اموزش استاد دیتابیس ساختم
وقتی دیتابیس رو ساختم وتوی پوشه assets گذاشتم توی کلاس G عملیات کپی از asetsبه حافظه دستگاه رو نوشتم
البته اینجا با این شرط این کار رو کردم که اگه ابن فایل قبلا روی دستگاه هست دیگه کپی نشه
روی بعضی گوشیها جواب میده ولی روی اکثرشون کرش میکنه
دلیل کرش هم cannot open or create database میده
بعضیا میگن از handle باید استفاده کنم
خواستم ببینم مشکل چیه؟
پاسخها 5
سلام
من از این کد استفاده میکنم تا به حال هم به مشکل بر نخوردم
کلاس G:
public static String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
public static String DIR_APP = DIR_SDCARD + "/hotel/databeas";
public void copyAssetToSdcard() {
AssetManager assetManager = context.getAssets();
InputStream inputStream = null;
File file = new File(DIR_APP + "/hotel_db.sqlite");
if ( !file.exists()) {
try {
inputStream = assetManager.open("hotel_db.sqlite");
HelperIO.copyFile(inputStream, DIR_APP + "/hotel_db.sqlite");
}
catch (IOException e) {
e.printStackTrace();
}
}
}
کلاس HelperIO :
package fardin.saeedi.course.app.reservation;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class HelperIO {
public static void copyFile(InputStream inputStream, String stream) {
OutputStream outputStream = null;
byte[] buffer = new byte[8 * 1024];
int lenRead = 0;
try {
outputStream = new FileOutputStream(stream);
while ((lenRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, lenRead);
}
}
catch (IOException e) {
e.printStackTrace();
} finally {
try {
inputStream.close();
}
catch (IOException e) {
e.printStackTrace();
}
try {
outputStream.flush();
outputStream.close();
}
catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
فقط کافیه اسم و مسیر دیتابیس رو تغییر بدید.
نظرات
من چند وقت پیش تویه انجمن یه همچین سوالی دیدیم که به جواب رسیده بود شما یه سرچ کنید ببینید میتونید پیداش کنید یا نه.
نه منظور از external storage حافظه داخلی هست یعنی همین کدی که میبینید . کافیه تست کنیدتا ببینید فایلی که میدید توی حافظه داخلی میسازه پس نگران نداشتن کارت حافظه نباشید
سلام.
به احتمال بسیار زیاد شما باید از ران تایم پرمیژن ها استفاده میکردید ک نکردید.
نظرات
ممنون ازشما منظورتون نحوه استفاده از پرمیشن ها از اندروید 6 به بالاست؟
آره ، اگه میگی رو بعضی گوشی ها جواب میده ، پس به احتمال زیاد مشکلتون ران تایم پرمیشن هست . تو گوشی هایی که مشکل داره ، برید داخل تنظیمات و دستی پرمیشن رو روشن کنید ( اگه اندروید 6 به بالا داره ) . اگه دیگه کرش نکرد پس مشکلتون همینه ، و باید کدهای پرمیشن ران تایم رو اضافه کنید .
بسیار ممنونم ولی زمانی که اون خط کد if رو پاک میکردم کرش حل میشد یعنی هربار برنامه کپی بشه مشکلش حل میشد ولی دیگه برنامه درست کار نمیکرد چون لیست علاقه مندی ها دوباره پاک میشد
بنده هنوز متوجه مشکل شما نشدم ! انتطار ندارید ک غیب بگیم !!
سلام مشکل از دسترسی پرمیشن هست، باید در برنامه تون یک شرط بزارید اگر اندروید دستگاه کاربر 6 و بالاتر بود بصورت ران تایم درخواست پرمیشن کنید.
ببینید متوجه هستم چی میگید ولی یکی از دوستان با برداشتن شرط مشکلش حل شده بود.بدون اینکه بخواد پرمیشن بده
کدتون رو قرار بدید لطفا دوست عزیز. اینجوری بهتر نیست به نظر شما ؟
این کدهای کلاس G
public class G extends Application{
public static Context context;
public static String direction=Enviroment.getExternalStorageDirectory().getAbsolutePath()+"/material_book";
onCreate(){
context=getApplicationContext();
File file=new File(direction);
file.mkdirs();
if(!file.exists()){
try{
file.createNewFile();
copyFromAssets(getBaseContext().getAssets().open("material_book.sqlite"),
new FileOutputStream(direction+"/material_book.sqlite"));
}catch(IOException e){
e.printStackTrace();
}
}
}
public void copyFromAssets(InputStream inputStream,OutputStream)throw IOException{
byte[] buffer=new byte[];
int length;
while((length=inputStream.read(buffer))>0){
outputStream.write(buffer,0,length);
}
inputStream.close();
outputStream.close();
}
}
نظرات
File file=new File(direction);
file.mkdirs();
if(!file.exists()){
}
دقیقا همینجا اشتباهه !! شما باید این خط کد رو داخل شرط بزارید :
file.mkdirs();
نظرات
یعنی اینطور بشه؟
onCreate(){
context=getApplicationContext();
File file=new File(direction);
if(!file.exists()){
try{
file.mkdirs();
file.createNewFile();
copyFromAssets(getBaseContext().getAssets().open("material_book.sqlite"),
new FileOutputStream(direction+"/material_book.sqlite"));
}catch(IOException e){
e.printStackTrace();
}
نظرات
بلله دقیقا. شما تست کنید 100 در صد قول میدم باگ برنامه رفع بشه ! نتیجه رو اعلام کنید
درود برشما دوست بزرگوار به احتمال زیاد برطرف میشه چون اکثر کسایی که سورس رو روی گوشیشون امتحان کرده بودن وبه مشکل خورده بودن با پاک کردن if مشکلشون برطرف شده بود
شما اصلا نباید if. رو پاک کنی!! فقط مشکلت اینه ک اصلا وارد بلاک if نمیشه چون بهش گفتی اگ وجود نداشت در صورتی که خط بالاتر اون فایل رو ساختی!!! امیدوارم متوجه منظورم شده باشی
نه نه متوجه هستم.میگم وقتی پاک کنی کرش حل میشه وگرنه همون اولم گفتم دیگه برنامه درست کار نمیکنه...با کمک شما کاملا متوجه شدم
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .
ویرایش
پیام
نظرات