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

استفاده از دیتابیس

General  9 سال پیش  9 سال پیش
+1 0

با سلام

من میخواستم یه کتاب بسازم و طبق اموزش استاد دیتابیس ساختم

وقتی دیتابیس رو ساختم وتوی پوشه assets گذاشتم توی کلاس G عملیات کپی از asetsبه حافظه دستگاه رو نوشتم

البته اینجا با این شرط این کار رو کردم که اگه ابن فایل قبلا روی دستگاه هست دیگه کپی نشه

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

دلیل کرش هم cannot open or create database میده

بعضیا میگن از handle باید استفاده کنم

خواستم ببینم مشکل چیه؟

 برای این سوال 5 پاسخ وجود دارد.
پاسخ به سوال 
FSR  9 سال پیش
+3 0

سلام

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

کلاس 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();
}
}
}
}

فقط کافیه اسم و مسیر دیتابیس رو تغییر بدید.

 

 

+1 0
سلام ، از همین پاسخ استفاده کنم برای پرسش خودم : getExternalStorageDirectory() مسیر کارت حافظه خارجی رو میده ؟ خب اگه گوشی بدون حافظه خارجی باشه چی میشه ؟ یا حافظه خارجی داره ولی کاربر خارجش کرده ؟ چون منم تقریبا از همین کدها استفاده میکنم . و تا حالا روی گوشی بدون کارت حافظه تست نکردم . مسیر حافظه داخلی کدش چیه که شرط بذاریم اگه خارجی وجود نداشت ، بگیم در حافظه داخلی کپی بشه ؟ (9 سال پیش)
+2 0
من چند وقت پیش تویه انجمن یه همچین سوالی دیدیم که به جواب رسیده بود شما یه سرچ کنید ببینید میتونید پیداش کنید یا نه. (9 سال پیش)
0 0
نه منظور از external storage حافظه داخلی هست یعنی همین کدی که میبینید . کافیه تست کنیدتا ببینید فایلی که میدید توی حافظه داخلی میسازه پس نگران نداشتن کارت حافظه نباشید (9 سال پیش)
پاسخ به سوال 
Soheil  9 سال پیش
0 0

سلام.

به احتمال بسیار زیاد شما باید از ران تایم پرمیژن ها استفاده میکردید ک نکردید.

+1 0
ممنون ازشما منظورتون نحوه استفاده از پرمیشن ها از اندروید 6 به بالاست؟ (9 سال پیش)
+2 0
آره ، اگه میگی رو بعضی گوشی ها جواب میده ، پس به احتمال زیاد مشکلتون ران تایم پرمیشن هست . تو گوشی هایی که مشکل داره ، برید داخل تنظیمات و دستی پرمیشن رو روشن کنید ( اگه اندروید 6 به بالا داره ) . اگه دیگه کرش نکرد پس مشکلتون همینه ، و باید کدهای پرمیشن ران تایم رو اضافه کنید . (9 سال پیش)
+1 0
بسیار ممنونم ولی زمانی که اون خط کد if رو پاک میکردم کرش حل میشد یعنی هربار برنامه کپی بشه مشکلش حل میشد ولی دیگه برنامه درست کار نمیکرد چون لیست علاقه مندی ها دوباره پاک میشد (9 سال پیش)
+1 0
بنده هنوز متوجه مشکل شما نشدم ! انتطار ندارید ک غیب بگیم !! (9 سال پیش)
+1 0
سلام مشکل از دسترسی پرمیشن هست، باید در برنامه تون یک شرط بزارید اگر اندروید دستگاه کاربر 6 و بالاتر بود بصورت ران تایم درخواست پرمیشن کنید. (9 سال پیش)
+1 0
ببینید متوجه هستم چی میگید ولی یکی از دوستان با برداشتن شرط مشکلش حل شده بود.بدون اینکه بخواد پرمیشن بده (9 سال پیش)
+1 0
کدتون رو قرار بدید لطفا دوست عزیز. اینجوری بهتر نیست به نظر شما ؟ (9 سال پیش)
پاسخ به سوال 
General  9 سال پیش
+1 0

این کدهای کلاس 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();


}

}

 

پاسخ به سوال 
Soheil  9 سال پیش
+2 0

File file=new File(direction);
file.mkdirs();
if(!file.exists()){
}

دقیقا همینجا اشتباهه !! شما باید این خط کد رو داخل شرط بزارید :
file.mkdirs();
پاسخ به سوال 
General  9 سال پیش
+1 0

یعنی اینطور بشه؟

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

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